A Verilogban a paraméterek konstansok, és nem tartoznak semmilyen más adattípushoz, például regiszterhez vagy net adattípushoz.
A konstans kifejezés egy állandó számra vagy korábban meghatározott paraméterre utal. A paraméterértékeket futás közben nem tudjuk módosítani, de a paraméterértéket módosíthatjuk a defparam nyilatkozat.
A defparam utasítás csak a fordításkor módosíthatja a paramétereket. A paraméterértékek módosíthatók # késleltetési specifikációval a modul példányosításával.
Ban ben Verilog , két módszer létezik a modulparaméter értékének felülbírálására a modul példányosítása során.
- A defparam kulcsszó használatával.
- És a modulpéldány paraméter érték hozzárendelése.
A defparam kulcsszó után meg kell adni a paraméter hierarchikus elérési útját és a paraméter új értékét. Ennek az új értéknek állandó kifejezésnek kell lennie. Ha a jobb oldali kifejezés bármely paraméterre hivatkozik, akkor azt deklarálni kell abban a modulban, ahol a defparam meghívásra kerül.
A modulpéldány paraméterérték-hozzárendelési módszere késleltetés hozzárendelésének tűnik a kapupéldányhoz. Ez a módszer felülírja a példányosított modulokon belüli paramétereket, ahogy azok a modulban megjelennek. Ezzel a formátummal a paraméterek nem ugorhatók át.
A konstans kifejezések tartalmazhatnak korábban deklarált paramétereket. Ha a korábban deklarált paramétereken változásokat észlel, az ettől az értéktől függő összes paraméter automatikusan frissül.
Vegyük figyelembe, hogy egy 4 bites összeadó paraméterezhető úgy, hogy elfogadjon egy értéket a bitek számára, és új paraméterértékek adhatók át a modul példányosítása során. Tehát az N bites összeadó 4 bites, 8 bites vagy 16 bites összeadóvá alakul. Olyanok, mint egy függvény argumentumai, amelyeket a függvényhívás során adunk át.
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
Kétféle paraméter létezik, modult és adja meg , és mindkettő elfogadja a tartomány specifikációját. De olyan szélesek, mint amennyire tárolni kell őket, ezért nincs szükség a tartomány specifikációjára.
Modul paraméterei
Használható a modulon belüli paraméterdefiníciók felülbírálására, és fordításkor a modul eltérő paraméterkészlettel rendelkezik. Egy paraméter módosítható a defparam nyilatkozat. Gyakori, hogy a paraméterek neveiben nagybetűket használnak, hogy azonnal észrevegyék őket.
Az alábbi modul paraméterekkel határozza meg a buszszélességet, az adatszélességet és a FIFO mélységét a tervezésen belül, és felülírható új értékekkel a modul példányosításakor vagy defparam utasítások használatával.
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
A Verilog portdeklaráció új ANSI stílusában olyan paramétereket deklarálhatunk, mint például:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
Paraméterek felülbírálása
A paraméterek felülírhatók új értékekkel a modul példányosítása során. Az első rész az úgynevezett modul design_ip a d0 névvel, ahol az új paraméterek # ( ) belül kerülnek átadásra.
A második rész egy Verilog konstrukció használata defparam az új paraméterértékek beállításához. Az első módszert általában új paraméterek átadására használják RTL-tervekben. A második módszert pedig a tesztpadi szimulációkban használják a tervezési paraméterek gyors frissítésére anélkül, hogy a modult újra kelljen példányosítani.
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
A modulszámlálónak két paramétere van N és LE , amelynek alapértelmezett értéke 2 és 0.
N szabályozza a bitek számát a kimenetben, hatékonyan szabályozva a számláló szélességét. Ez alapértelmezés szerint 2 bites számláló.
Paraméter LE szabályozza, hogy a számláló növekedjen vagy csökkenjen. A számláló csökkenni fog, mert a paraméter 0-ra van állítva.
2 bites felfelé számláló
logikai érték a java karakterlánchoz
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></=>
Az alapértelmezett paraméterek a hol számláló megvalósítására szolgálnak N egyenlő kettővel, így egy 2 bites számláló, és LE egyenlő nullával, így ez egy felfelé mutató. A számláló kimenete a legfelső szinten csatlakoztatva marad.
4 bites lefelé mutató számláló
Ebben az esetben a modulszámláló N-vel 4-ként jelenik meg, így 4 bites számláló. A DOWN 1-es értéket ad át a modul példányosítása során, és így lefelé számláló kerül megvalósításra.
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
Paraméterek megadása
Ezek a paraméterek idő- és késleltetési értékek megadására szolgálnak, és a következővel deklarálhatók specparam kulcsszó. A megadott blokkon és a fő modul törzsén belül egyaránt használható.
// 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
Különbség a Specify és Module paraméterek között
Paraméter megadása | Modul paraméter |
---|---|
Adja meg a specparam kulcsszó deklarálja paramétert. | A modul paramétere paraméterenként van deklarálva. |
Deklarálható egy adott blokkon belül vagy a fő modulon belül. | Csak a fő modulon belül deklarálható. |
Ehhez a paraméterhez spektrumokat és paramétereket lehet hozzárendelni. | Ehhez nem lehet spektrumokat rendelni. |
Az SDF használható értékek felülbírálására. | A példánydeklarációs paraméterértékek vagy a defparam használható felülbírálásra. |
Megjegyzések
Íme néhány fontos megjegyzés a Verilog paraméterekkel kapcsolatban, például:
- Ha használjuk a defparam utasítást, meg kell adnunk a paraméter hierarchikus elérési útját.
- Nem ugorhatunk át egy paramétert az a-ban modulpéldány paraméterérték hozzárendelése . Ha ezt meg kell tennünk, használjuk a nem felülírt paraméter kezdeti értékét.
- Ha az egyik paraméter függ a másiktól, akkor a második automatikusan frissül, ha módosítjuk az elsőt.
=>