În Verilog, parametrii sunt constante și nu aparțin niciunui alt tip de date, cum ar fi tipul de date registru sau net.
O expresie constantă se referă la un număr constant sau la un parametru definit anterior. Nu putem modifica valorile parametrului în timpul execuției, dar putem modifica valoarea unui parametru folosind defparam afirmație.
The defparam instrucțiunea poate modifica parametrii numai în momentul compilării. Valorile parametrilor pot fi modificate utilizând specificația de întârziere # cu instanțierea modulului.
În Verilog , există două metode de a suprascrie valoarea unui parametru de modul în timpul unei instanțieri de modul.
- Folosind cuvântul cheie defparam.
- Și atribuirea valorii parametrului instanței de modul.
După cuvântul cheie defparam, calea ierarhică este specificată pentru parametru și noua valoare a parametrului. Această nouă valoare ar trebui să fie o expresie constantă. Dacă expresia din partea dreaptă face referire la vreun parametru, aceasta ar trebui să fie declarată în modulul în care este invocat defparam.
Metoda de atribuire a valorii parametrului instanței de modul pare o atribuire a întârzierii instanței de poartă. Această metodă suprascrie parametrii din modulele instanțiate așa cum apar în modul. Folosind acest format, parametrii nu pot fi omisi.
Expresiile constante pot conține parametri declarați anterior. Când sunt detectate modificări ale parametrilor declarați anterior, toți parametrii care depind de această valoare sunt actualizați automat.
Luați în considerare, un sumator de 4 biți poate fi parametrizat pentru a accepta o valoare pentru numărul de biți și pot fi transmise noi valori ale parametrilor în timpul instanțierii modulului. Deci, un adunator de N biți se transformă într-un sumator de 4 biți, 8 biți sau 16 biți. Sunt ca argumente pentru o funcție care este transmisă în timpul unui apel de funcție.
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
Există două tipuri de parametri, modul și specifica și ambele acceptă o specificație de gamă. Însă, ele sunt la fel de largi ca și valoarea care urmează să fie stocate și, prin urmare, nu este necesară specificarea intervalului.
Parametrii modulului
Poate fi folosit pentru a suprascrie definițiile parametrilor dintr-un modul și face ca modulul să aibă un set diferit de parametri în momentul compilării. Un parametru poate fi modificat cu ajutorul defparam afirmație. Este obișnuit să folosiți litere mari în nume pentru ca parametrul să le observe instantaneu.
Modulul de mai jos folosește parametri pentru a specifica lățimea magistralei, lățimea datelor și adâncimea FIFO în design și poate fi înlocuit cu noi valori atunci când modulul este instanțiat sau prin utilizarea instrucțiunilor 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
În noul stil ANSI al declarației portului Verilog, putem declara parametri precum:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
Parametri de suprascriere
Parametrii pot fi suprascriși cu noi valori în timpul instanțierii modulului. Prima parte este modulul numit design_ip cu numele d0 unde parametrii noi sunt trecuți în # ( ).
A doua parte este utilizarea unui construct numit Verilog defparam pentru a seta noile valori ale parametrilor. Prima metodă este folosită în mod obișnuit pentru a transmite noi parametri în proiectele RTL. Și a doua metodă este folosită în simulările testbench pentru a actualiza rapid parametrii de proiectare fără a fi nevoie să reinstanțeze modulul.
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
Contorul modulului are doi parametri N și JOS , care este declarat a avea o valoare implicită de 2 și 0.
N controlează numărul de biți din ieșire, controlând eficient lățimea contorului. Este un contor de 2 biți în mod implicit.
Parametru JOS controlează dacă contorul trebuie să crească sau să scadă. Contorul va scădea deoarece parametrul este setat la 0.
Contor de 2 biți
Linux rulează cmd
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></=>
Parametrii impliciti sunt utilizați pentru a implementa contorul unde N este egal cu doi, făcându-l un numărător de 2 biți și JOS este egal cu zero, făcându-l un ghișeu. Ieșirea de la contor este lăsată neconectată la nivelul superior.
4-bit down Counter
În acest caz, contorul modulului este instanțiat cu N ca 4, făcându-l un contor de 4 biți. DOWN primește o valoare de 1 în timpul instanțierii modulului și, prin urmare, este implementat un contor negativ.
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
Specificați parametrii
Acești parametri sunt utilizați pentru a furniza valori de timp și de întârziere și sunt declarați folosind specparam cuvânt cheie. Este permisă utilizarea atât în blocul specificat, cât și în corpul modulului principal.
// 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
Diferența dintre specificarea și parametrii modulului
Specificați parametrul | Parametrul modulului |
---|---|
Specificați cuvântul cheie specparam declares parametru. | Parametrul modulului este declarat prin parametru. |
Poate fi declarat în interiorul unui anumit bloc sau în cadrul modulului principal. | Poate fi declarat doar în cadrul modulului principal. |
Acestui parametru i se pot atribui specparams și parametri. | Este posibil să nu i se atribuie specparams. |
SDF poate fi folosit pentru a suprascrie valori. | Valorile parametrilor de declarare a instanței sau defparam pot fi folosite pentru a suprascrie. |
Note
Iată câteva note importante pentru parametrii Verilog, cum ar fi:
- Dacă folosim defparam declarație, trebuie să specificăm o cale ierarhică către parametru.
- Nu putem sări peste un parametru din a atribuirea valorii parametrului instanței de modul . Dacă trebuie să facem acest lucru, folosiți valoarea inițială pentru un parametru care nu este suprascris.
- Când un parametru depinde de celălalt, atunci al doilea va fi actualizat automat dacă îl schimbăm pe primul.
=>