W Verilog parametry są stałymi i nie należą do żadnego innego typu danych, takiego jak typy danych rejestrowych lub sieciowych.
Wyrażenie stałe odnosi się do stałej liczby lub wcześniej zdefiniowanego parametru. Nie możemy modyfikować wartości parametrów w czasie wykonywania, ale możemy modyfikować wartości parametrów za pomocą defparam oświadczenie.
The defparam instrukcja może modyfikować parametry tylko w czasie kompilacji. Wartości parametrów można modyfikować za pomocą # specyfikacji opóźnienia przy tworzeniu instancji modułu.
W Verilog istnieją dwie metody zastępowania wartości parametru modułu podczas tworzenia instancji modułu.
- Używając słowa kluczowego defparam.
- Oraz przypisanie wartości parametrów instancji modułu.
Po słowie kluczowym defparam określana jest ścieżka hierarchiczna do parametru i nowa wartość parametru. Ta nowa wartość powinna być wyrażeniem stałym. Jeśli wyrażenie po prawej stronie odwołuje się do jakichkolwiek parametrów, należy je zadeklarować w module, w którym wywoływany jest defparam.
Metoda przypisania wartości parametrów instancji modułu wygląda jak przypisanie opóźnienia do instancji bramki. Ta metoda zastępuje parametry wewnątrz utworzonych modułów, gdy pojawiają się one w module. Używając tego formatu, nie można pominąć parametrów.
Wyrażenia stałe mogą zawierać wcześniej zadeklarowane parametry. W przypadku wykrycia zmian w wcześniej zadeklarowanych parametrach, wszystkie parametry zależne od tej wartości zostaną automatycznie zaktualizowane.
Rozważmy, że 4-bitowy sumator można sparametryzować tak, aby akceptował wartość liczby bitów, a nowe wartości parametrów można przekazywać podczas tworzenia instancji modułu. Zatem dodatek N-bitowy jest konwertowany na dodatek 4-bitowy, 8-bitowy lub 16-bitowy. Działają jak argumenty funkcji przekazywane podczas wywołania funkcji.
parameter MSB = 7; // MSB is a parameter with the constant value 7 parameter REAL = 4.5; // REAL holds the real number parameter FIFO_DEPTH = 256, MAX_WIDTH = 32; // Declares two parameters parameter [7:0] f_const = 2'b3; // 2 bit value is converted into 8 bits; 8'b3
Istnieją dwa rodzaje parametrów, moduł I sprecyzować i oba akceptują specyfikację zakresu. Jednak są one tak szerokie, jak wartość, która ma być przechowywana, dlatego też specyfikacja zakresu nie jest konieczna.
Parametry modułu
Można go użyć do nadpisania definicji parametrów w module i sprawić, że moduł będzie miał inny zestaw parametrów w czasie kompilacji. Parametr można modyfikować za pomocą defparam oświadczenie. Często używa się wielkich liter w nazwach parametrów, aby można było je natychmiast zauważyć.
Poniższy moduł używa parametrów do określenia szerokości magistrali, szerokości danych i głębokości FIFO w projekcie i można go zastąpić nowymi wartościami podczas tworzenia instancji modułu lub przy użyciu instrukcji defparam.
module design_ip ( addr, wdata, write, sel, rdata); parameter BUS_WIDTH = 32, DATA_WIDTH = 64, FIFO_DEPTH = 512; input addr; input wdata; input write; input sel; output rdata; wire [BUS_WIDTH-1:0] addr; wire [DATA_WIDTH-1:0] wdata; reg [DATA_WIDTH-1:0] rdata; reg [7:0] fifo [FIFO_DEPTH]; endmodule
W nowym stylu ANSI deklaracji portu Verilog możemy zadeklarować takie parametry jak:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
Nadpisywanie parametrów
Parametry można zastąpić nowymi wartościami podczas tworzenia instancji modułu. Pierwsza część to moduł tzw projekt_ip pod nazwą d0, gdzie nowe parametry są przekazywane w obrębie # ( ).
Druga część polega na użyciu konstrukcji Verilog o nazwie defparam aby ustawić nowe wartości parametrów. Pierwsza metoda jest powszechnie stosowana do przekazywania nowych parametrów w projektach RTL. Druga metoda jest wykorzystywana w symulacjach na stanowisku testowym w celu szybkiej aktualizacji parametrów projektowych bez konieczności ponownego tworzenia modułu.
module tb; // Module instantiation override design_ip #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list]); // Use of defparam to override defparam d0.FIFO_DEPTH = 128; endmodule
Licznik modułu ma dwa parametry N I W DÓŁ , który ma zadeklarowaną wartość domyślną 2 i 0.
N kontroluje liczbę bitów na wyjściu, skutecznie kontrolując szerokość licznika. Domyślnie jest to licznik 2-bitowy.
Parametr W DÓŁ kontroluje, czy licznik powinien zwiększać się, czy zmniejszać. Licznik będzie się zmniejszał, ponieważ parametr jest ustawiony na 0.
2-bitowy licznik w górę
łączenie się z bazą danych w Javie
module counter # ( parameter N = 2, parameter DOWN = 0) (input clk, input rstn, input en, output reg [N-1:0] out); always @ (posedge clk) begin if (!rstn) begin out <= 0; end else begin if (en) (down) out <="out" - 1; + endmodule pre> <p>The module counter is instantiated with <strong> <em>N</em> </strong> as 2 even though it is not required because the default value is anyway 2.</p> <p> <strong> <em>DOWN</em> </strong> is not passed during module instantiation. And it takes the default value of 0 making it an up-counter.</p> <pre> module design_top (input clk, input rstn, input en, output [1:0] out); counter #(.N(2)) u0 (.clk(clk), .rstn(rstn), .en(en)); endmodule </pre> <p>The default parameters are used to implement the counter where <strong> <em>N</em> </strong> equals two, making it a 2-bit counter, and <strong> <em>DOWN</em> </strong> equals zero, making it an up-counter. The output from the counter is left unconnected at the top level.</p> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters.webp" alt="Verilog Parameters"> <p> <strong>4-bit down Counter</strong> </p> <p>In this case, the module counter is instantiated with N as 4 making it a 4-bit counter. DOWN is passed a value of 1 during the module instantiation and hence a down-counter is implemented.</p> <pre> module design_top (input clk, input rstn, input en, output [3:0] out); counter #(.N(4), .DOWN(1)) u1 (.clk(clk), .rstn(rstn), .en(en)); endmodule </pre> <br> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters-2.webp" alt="Verilog Parameters"> <h3>Specify Parameters</h3> <p>These parameters are used to provide time and delay values and declared using the <strong> <em>specparam</em> </strong> keyword. It is allowed to use both within the specified block and the main module body.</p> <pre> // Use of specify block Specify specparam t_rise = 200, t_fall = 150; specparam clk_to_q = 70, d_to_q = 100; endspecify // Within main module module my_block ( ); specparam dhold = 2.0; specparam ddly = 1.5; parameter WIDTH = 32; endmodule </pre> <h3>Difference between Specify and Module Parameters</h3> <table class="table"> <tr> <th>Specify parameter</th> <th>Module parameter</th> </tr> <tr> <td>Specify the specparam keyword declares parameter.</td> <td>The module parameter is declared by parameter.</td> </tr> <tr> <td>It can be declared inside a specific block or within the main module.</td> <td>It can only be declared within the main module.</td> </tr> <tr> <td>This parameter may be assigned specparams and parameters.</td> <td>This may not be assigned specparams.</td> </tr> <tr> <td>SDF can be used to override values.</td> <td>Instance declaration parameter values or defparam can be used to override.</td> </tr> </table> <p> <strong>Notes</strong> </p> <p>Here are some important notes for the Verilog parameters, such as:</p> <ul> <li>If we are using the <strong> <em>defparam</em> </strong> statement, we must specify a hierarchical path to the parameter.</li> <li>We cannot skip over a parameter in a <strong> <em>module instance parameter value assignment</em> </strong> . If we need to do this, use the initial value for a not overwritten parameter.</li> <li>When one parameter depends on the other, then the second will automatically be updated if we change the first one.</li> </ul> <hr></=>
Domyślne parametry służą do implementacji licznika gdzie N równa się dwa, co czyni go licznikiem 2-bitowym, oraz W DÓŁ równa się zeru, co oznacza wzrost. Wyjście z licznika pozostaje niepodłączone na najwyższym poziomie.
4-bitowy licznik w dół
W tym przypadku licznik modułu jest tworzony z N jako 4, co czyni go licznikiem 4-bitowym. DOWN podczas tworzenia instancji modułu przekazywana jest wartość 1, dlatego realizowany jest licznik w dół.
module design_top (input clk, input rstn, input en, output [3:0] out); counter #(.N(4), .DOWN(1)) u1 (.clk(clk), .rstn(rstn), .en(en)); endmodule
Określ parametry
Parametry te służą do podawania wartości czasu i opóźnienia i są deklarowane przy użyciu metody parametr spec słowo kluczowe. Dozwolone jest użycie zarówno w obrębie określonego bloku, jak i korpusu modułu głównego.
// Use of specify block Specify specparam t_rise = 200, t_fall = 150; specparam clk_to_q = 70, d_to_q = 100; endspecify // Within main module module my_block ( ); specparam dhold = 2.0; specparam ddly = 1.5; parameter WIDTH = 32; endmodule
Różnica między parametrami określonymi i modułowymi
Określ parametr | Parametr modułu |
---|---|
Określ parametr specparam deklaruje słowo kluczowe. | Parametr modułu jest deklarowany przez parametr. |
Można go zadeklarować w konkretnym bloku lub w module głównym. | Można go zadeklarować tylko w module głównym. |
Do tego parametru można przypisać parametry i parametry. | Nie można do tego przypisać parametrów specparam. |
SDF może służyć do zastępowania wartości. | Do zastąpienia można użyć wartości parametrów deklaracji instancji lub defparam. |
Notatki
Oto kilka ważnych uwag dotyczących parametrów Verilog, takich jak:
- Jeżeli korzystamy z defparam instrukcji, musimy określić hierarchiczną ścieżkę do parametru.
- Nie możemy pominąć parametru w a przypisanie wartości parametru instancji modułu . Jeśli musimy to zrobić, użyj wartości początkowej dla niezastąpionego parametru.
- Gdy jeden parametr zależy od drugiego, drugi zostanie automatycznie zaktualizowany, jeśli zmienimy pierwszy.
=>