V Verilogu so parametri konstante in ne pripadajo nobenemu drugemu tipu podatkov, kot so podatkovni tipi register ali net.
Stalni izraz se nanaša na konstantno število ali predhodno definiran parameter. Vrednosti parametrov med izvajanjem ne moremo spremeniti, lahko pa spremenimo vrednost parametra z uporabo defparam izjava.
The defparam stavek lahko spremeni parametre samo v času prevajanja. Vrednosti parametrov je mogoče spremeniti z # specifikacijo zakasnitve z instanciacijo modula.
noter Verilog , obstajata dva načina za preglasitev vrednosti parametra modula med instanciacijo modula.
- Z uporabo ključne besede defparam.
- In dodelitev vrednosti parametra primerka modula.
Za ključno besedo defparam je podana hierarhična pot do parametra in nove vrednosti parametra. Ta nova vrednost mora biti stalen izraz. Če se izraz na desni strani sklicuje na kateri koli parameter, ga je treba deklarirati znotraj modula, kjer je defparam priklican.
Metoda dodelitve vrednosti parametra primerka modula je videti kot dodelitev zakasnitve primerku vrat. Ta metoda preglasi parametre znotraj instanciranih modulov, kot so prikazani v modulu. Pri uporabi te oblike parametrov ni mogoče preskočiti.
Konstantni izrazi lahko vsebujejo predhodno deklarirane parametre. Ko so zaznane spremembe na predhodno deklariranih parametrih, se vsi parametri, ki so odvisni od te vrednosti, samodejno posodobijo.
Upoštevajte, da je mogoče 4-bitni seštevalnik parametrizirati tako, da sprejme vrednost za število bitov, nove vrednosti parametrov pa je mogoče posredovati med instanciacijo modula. Torej se N-bitni seštevalnik pretvori v 4-bitni, 8-bitni ali 16-bitni seštevalnik. So kot argumenti za funkcijo, ki se posreduje med klicem funkcije.
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
Obstajata dve vrsti parametrov, modul in navedite in oba sprejemata specifikacijo obsega. Vendar pa so izdelani tako široko, kot je vrednost, ki jih je treba shraniti, zato specifikacija obsega ni potrebna.
Parametri modula
Uporablja se lahko za preglasitev definicij parametrov znotraj modula in omogoča, da ima modul med prevajanjem drugačen niz parametrov. Parameter je mogoče spremeniti z defparam izjava. Običajno je, da v imenih parametrov uporabljate velike črke, da jih takoj opazite.
Spodnji modul uporablja parametre za določanje širine vodila, širine podatkov in globine FIFO znotraj načrta in jih je mogoče preglasiti z novimi vrednostmi, ko je modul instanciran ali z uporabo stavkov 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
V novem slogu ANSI deklaracije vrat Verilog lahko deklariramo parametre, kot so:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
Prevladujoči parametri
Parametre je mogoče preglasiti z novimi vrednostmi med instanciacijo modula. Prvi del je modul, imenovan design_ip z imenom d0, kjer so novi parametri posredovani znotraj # ( ).
Drugi del je uporaba konstrukta Verilog, imenovanega defparam za nastavitev novih vrednosti parametrov. Prva metoda se običajno uporablja za posredovanje novih parametrov v načrtih RTL. In druga metoda se uporablja v simulacijah preskusne naprave za hitro posodobitev konstrukcijskih parametrov, ne da bi bilo treba znova vzpostaviti modul.
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
Števec modula ima dva parametra n in DOL , za katerega je navedeno, da ima privzeto vrednost 2 in 0.
n nadzoruje število bitov v izhodu, s čimer učinkovito nadzoruje širino števca. Privzeto je 2-bitni števec.
Parameter DOL nadzira, ali naj se števec poveča ali zmanjša. Števec se bo zmanjšal, ker je parameter nastavljen na 0.
2-bitni števec
združevanje nizov
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></=>
Privzeti parametri se uporabljajo za implementacijo števca, kjer n je enako dve, zaradi česar je 2-bitni števec in DOL je enako nič, zaradi česar je višji števec. Izhod iz števca ostane nepovezan na najvišji ravni.
4-bitni navzdol števec
V tem primeru je števec modula instanciran z N kot 4, zaradi česar je 4-bitni števec. DOWN je med instanciacijo modula posredovana vrednost 1, zato je implementiran padajoči števec.
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
Določite parametre
Ti parametri se uporabljajo za zagotavljanje vrednosti časa in zakasnitve ter se deklarirajo z uporabo specparam ključna beseda. Dovoljeno je uporabljati tako v navedenem bloku kot v glavnem telesu modula.
// 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
Razlika med parametri Specify in Module
Določite parameter | Parameter modula |
---|---|
Določite parameter deklarira ključno besedo specparam. | Parameter modula je deklariran s parametrom. |
Lahko se deklarira znotraj določenega bloka ali znotraj glavnega modula. | Deklarira se lahko samo znotraj glavnega modula. |
Temu parametru se lahko dodelijo specparams in parametri. | Temu morda ne bodo dodeljeni specparami. |
SDF je mogoče uporabiti za preglasitev vrednosti. | Za preglasitev je mogoče uporabiti vrednosti parametrov deklaracije primerka ali defparam. |
Opombe
Tukaj je nekaj pomembnih opomb za parametre Verilog, kot so:
- Če uporabljamo defparam stavek, moramo podati hierarhično pot do parametra.
- Ne moremo preskočiti parametra v a dodelitev vrednosti parametra primerka modula . Če moramo to storiti, uporabimo začetno vrednost za parameter, ki ni prepisan.
- Ko je en parameter odvisen od drugega, se drugi samodejno posodobi, če spremenimo prvega.
=>