logo

„Verilog“ parametrai

Verilog parametrai yra konstantos ir nepriklauso jokiam kitam duomenų tipui, pavyzdžiui, registro ar tinklo duomenų tipams.

Pastovi išraiška nurodo pastovų skaičių arba anksčiau apibrėžtą parametrą. Negalime keisti parametrų verčių vykdymo metu, bet galime modifikuoti parametro reikšmę naudodami defparam pareiškimas.

The defparam teiginys gali keisti parametrus tik kompiliavimo metu. Parametrų reikšmes galima keisti naudojant # delsos specifikaciją su modulio paleidimu.

Į Verilog , yra du būdai, kaip nepaisyti modulio parametro reikšmės modulio egzistavimo metu.

  1. Naudodami raktinį žodį defparam.
  2. Ir modulio egzempliorių parametrų vertės priskyrimas.

Po raktinio žodžio defparam nurodomas parametro hierarchinis kelias ir nauja parametro reikšmė. Ši nauja reikšmė turėtų būti pastovi išraiška. Jei dešinioji išraiška nurodo bet kokius parametrus, ji turi būti deklaruojama modulyje, kuriame iškviečiamas defparam.

Modulio egzemplioriaus parametrų vertės priskyrimo metodas atrodo kaip delsos priskyrimas vartų egzemplioriui. Šis metodas nepaiso parametrų momentinių modulių viduje, kai jie rodomi modulyje. Naudojant šį formatą parametrai negali būti praleisti.

Pastoviose išraiškose gali būti anksčiau deklaruotų parametrų. Kai aptinkami anksčiau deklaruotų parametrų pakeitimai, visi nuo šios reikšmės priklausantys parametrai atnaujinami automatiškai.

Apsvarstykite, kad 4 bitų sumatorius gali būti parametrizuotas, kad būtų priimta bitų skaičiaus reikšmė, o naujos parametrų reikšmės gali būti perduodamos modulio egzistavimo metu. Taigi, N bitų sumatorius konvertuojamas į 4 bitų, 8 bitų arba 16 bitų sumatorių. Jie yra kaip argumentai funkcijai, kuri perduodama funkcijos iškvietimo metu.

 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 

Yra dviejų tipų parametrai, modulis ir nurodyti , ir abu sutinka su diapazono specifikacija. Tačiau jie gaminami tiek plataus, kiek turi būti saugomi, todėl diapazono specifikacija nebūtina.

Modulio parametrai

Jis gali būti naudojamas modulio parametrų apibrėžimams nepaisyti ir modulis turi skirtingą parametrų rinkinį kompiliavimo metu. Parametras gali būti pakeistas naudojant defparam pareiškimas. Įprasta parametrų pavadinimuose naudoti didžiąsias raides, kad būtų galima juos akimirksniu pastebėti.

Toliau pateiktame modulyje naudojami parametrai, skirti nurodyti magistralės plotį, duomenų plotį ir FIFO gylį projekte, ir gali būti perrašyti naujomis reikšmėmis, kai modulis sukuriamas arba naudojant defparam sakinius.

 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 

Naujajame ANSI Verilog prievado deklaracijos stiliuje galime deklaruoti tokius parametrus kaip:

 module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations ); 

Nepaisydami parametrų

Modulio egzistavimo metu parametrai gali būti pakeisti naujomis reikšmėmis. Pirmoji dalis yra modulis, vadinamas dizaino_ip pavadinimu d0, kai nauji parametrai perduodami per # ( ).

Antroji dalis yra naudoti Verilog konstrukciją, vadinamą defparam norėdami nustatyti naujas parametrų reikšmes. Pirmasis metodas dažniausiai naudojamas naujiems parametrams perduoti RTL projektuose. Antrasis metodas naudojamas bandymų stendo modeliavime, siekiant greitai atnaujinti projektavimo parametrus, nereikia iš naujo sukurti modulio.

 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 

Modulio skaitiklis turi du parametrus N ir ŽEMYN , kurios numatytoji reikšmė yra 2 ir 0.

N kontroliuoja bitų skaičių išvestyje, efektyviai valdydamas skaitiklio plotį. Pagal numatytuosius nustatymus tai yra 2 bitų skaitiklis.

Parametras ŽEMYN kontroliuoja, ar skaitiklis turi didėti ar mažėti. Skaitiklis sumažės, nes parametras nustatytas į 0.

2 bitų skaitiklis

rūšiavimo masyvas java
 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></=>

Numatytieji parametrai naudojami skaitikliui kur įdiegti N lygus dviem, todėl jis yra 2 bitų skaitiklis ir ŽEMYN lygus nuliui, todėl jis yra skaitiklis. Išėjimas iš skaitiklio paliekamas neprijungtas viršutiniame lygyje.

„Verilog“ parametrai

4 bitų skaitiklis

Šiuo atveju modulio skaitiklis yra N kaip 4, todėl jis yra 4 bitų skaitiklis. ŽEMYN perduodama 1 reikšmė modulio egzempliorių metu, todėl įgyvendinamas žemyn skaitiklis.

 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 

Verilog parametrai

Nurodykite parametrus

Šie parametrai naudojami laiko ir vėlavimo reikšmėms pateikti ir deklaruojami naudojant specparam raktažodį. Leidžiama naudoti tiek nurodytame bloke, tiek pagrindiniame modulio korpuse.

 // 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 

Skirtumas tarp Specify ir Module parametrų

Nurodykite parametrą Modulio parametras
Nurodykite specparam raktinio žodžio deklaruoja parametrą. Modulio parametras deklaruojamas pagal parametrą.
Jis gali būti deklaruojamas konkrečiame bloke arba pagrindiniame modulyje. Jį galima deklaruoti tik pagrindiniame modulyje.
Šiam parametrui gali būti priskirti spektrai ir parametrai. Tam negali būti priskirti spektrai.
SDF gali būti naudojamas reikšmių nepaisymui. Egzempliorių deklaracijos parametrų vertes arba defparam galima nepaisyti.

Pastabos

Štai keletas svarbių pastabų dėl „Verilog“ parametrų, pavyzdžiui:

  • Jei naudojame defparam pareiškime, turime nurodyti hierarchinį parametro kelią.
  • Negalime praleisti parametro a modulio egzemplioriaus parametrų reikšmės priskyrimas . Jei mums reikia tai padaryti, naudokite pradinę neperrašyto parametro reikšmę.
  • Kai vienas parametras priklauso nuo kito, antrasis bus automatiškai atnaujintas, jei pakeisime pirmąjį.