Verilogissa parametrit ovat vakioita eivätkä kuulu mihinkään muuhun tietotyyppiin, kuten rekisteri- tai verkkotietotyyppeihin.
Vakiolauseke viittaa vakionumeroon tai aiemmin määriteltyyn parametriin. Emme voi muuttaa parametriarvoja ajon aikana, mutta voimme muokata parametrin arvoa käyttämällä defparam lausunto.
The defparam lauseke voi muuttaa parametreja vain käännöshetkellä. Parametriarvoja voidaan muuttaa # viivemäärityksellä moduulin ilmentymisellä.
Sisään Verilog , on kaksi tapaa ohittaa moduuliparametrin arvo moduulin ilmentymisen aikana.
- Käyttämällä avainsanaa defparam.
- Ja moduulin esiintymän parametrien arvon määrittäminen.
Avainsanan defparam jälkeen määritetään hierarkkinen polku parametrille ja parametrin uudelle arvolle. Tämän uuden arvon tulisi olla vakiolauseke. Jos oikeanpuoleinen lauseke viittaa mihin tahansa parametriin, se tulee ilmoittaa moduulissa, jossa defparam kutsutaan.
Moduuliilmentymän parametrin arvon määritysmenetelmä vaikuttaa viiveen määrittämiseltä porttiilmentymään. Tämä menetelmä ohittaa instantoitujen moduulien sisällä olevat parametrit sellaisina kuin ne näkyvät moduulissa. Tätä muotoa käytettäessä parametreja ei voi ohittaa.
Vakiolausekkeet voivat sisältää aiemmin ilmoitettuja parametreja. Kun aiemmin ilmoitetuissa parametreissa havaitaan muutoksia, kaikki tästä arvosta riippuvat parametrit päivitetään automaattisesti.
Harkitse, että 4-bittinen summain voidaan parametroida hyväksymään bittien lukumäärän arvo, ja uusia parametriarvoja voidaan välittää moduulin ilmentämisen aikana. Joten N-bittinen summain muuntaa 4-bittiseksi, 8-bittiseksi tai 16-bittiseksi summaimeksi. Ne ovat kuin argumentteja funktiolle, joka välitetään funktiokutsun aikana.
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
On olemassa kahdenlaisia parametreja, moduuli ja täsmentää , ja molemmat hyväksyvät alueen määrityksen. Mutta ne on tehty niin leveiksi kuin niille tallennettava arvo, joten alueen määrittely ei ole tarpeen.
Moduulin parametrit
Sitä voidaan käyttää ohittamaan parametrimääritykset moduulin sisällä, ja moduulilla on eri parametrijoukko käännöshetkellä. Parametria voidaan muuttaa komennolla defparam lausunto. On yleistä, että parametrien nimissä käytetään isoja kirjaimia, jotta ne havaitaan välittömästi.
Alla oleva moduuli määrittää parametrien avulla väylän leveyden, dataleveyden ja FIFO:n syvyyden suunnittelussa, ja se voidaan ohittaa uusilla arvoilla, kun moduuli instantoidaan tai käyttämällä defparam-käskyjä.
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
Verilog-portin ilmoituksen uudessa ANSI-tyylissä voimme ilmoittaa parametreja, kuten:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
Ohittavat parametrit
Parametrit voidaan ohittaa uusilla arvoilla moduulin ilmentymisen aikana. Ensimmäinen osa on moduuli nimeltä design_ip nimellä d0, jossa uudet parametrit välitetään sisällä # ( ).
Toinen osa on käyttää Verilog-rakennetta nimeltä defparam asettaaksesi uudet parametriarvot. Ensimmäistä menetelmää käytetään yleisesti uusien parametrien välittämiseen RTL-malleissa. Ja toista menetelmää käytetään testipenkkisimulaatioissa suunnitteluparametrien nopeaan päivittämiseen ilman, että moduulia tarvitsee luoda uudelleen.
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
Moduulilaskurissa on kaksi parametria N ja ALAS , jonka oletusarvoksi ilmoitetaan 2 ja 0.
N ohjaa ulostulon bittien lukumäärää ja säätelee tehokkaasti laskurin leveyttä. Se on oletuksena 2-bittinen laskuri.
Parametri ALAS ohjaa, tuleeko laskurin nostaa vai pienentyä. Laskuri pienenee, koska parametrin arvoksi on asetettu 0.
2-bittinen laskuri
kuinka tarkistaa näytön koko
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></=>
Oletusparametreja käytetään toteuttamaan laskuri missä N on yhtä kuin kaksi, mikä tekee siitä 2-bittisen laskurin ja ALAS on yhtä suuri kuin nolla, mikä tekee siitä ylälaskurin. Laskurin lähtö jätetään kytkemättä ylimmälle tasolle.
4-bittinen laskuri
Tässä tapauksessa moduulilaskuri instantoidaan N:llä 4:ksi, mikä tekee siitä 4-bittisen laskurin. DOWN välitetään arvo 1 moduulin ilmentämisen aikana ja näin ollen alaslaskija toteutetaan.
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
Määritä parametrit
Näitä parametreja käytetään antamaan aika- ja viivearvot, ja ne ilmoitetaan käyttämällä specparam avainsana. Se on sallittua käyttää sekä määritellyssä lohkossa että päämoduulirungossa.
// 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
Ero määritys- ja moduuliparametrien välillä
Määritä parametri | Moduulin parametri |
---|---|
Määritä specparam-avainsana ilmoittaa parametrin. | Moduuliparametri ilmoitetaan parametreittain. |
Se voidaan ilmoittaa tietyn lohkon sisällä tai päämoduulissa. | Se voidaan ilmoittaa vain päämoduulissa. |
Tälle parametrille voidaan määrittää spektriparametreja ja parametreja. | Tälle ei välttämättä ole määritetty spektrejä. |
SDF:llä voidaan ohittaa arvot. | Ilmentymän ilmoitusparametriarvoja tai defparamia voidaan käyttää ohittamiseen. |
Huomautuksia
Tässä on joitain tärkeitä huomautuksia Verilog-parametreista, kuten:
- Jos käytämme defparam lauseessa, meidän on määritettävä hierarkkinen polku parametriin.
- Emme voi ohittaa parametria kohdassa a moduulin esiintymän parametrin arvon määrittäminen . Jos meidän on tehtävä tämä, käytä alkuperäistä arvoa parametrille, jota ei ole ylikirjoitettu.
- Kun yksi parametri riippuu toisesta, toinen päivitetään automaattisesti, jos muutamme ensimmäistä.
=>