logo

Verilog parametri

U Verilogu, parametri su konstante i ne pripadaju nijednom drugom tipu podataka kao što su registar ili mrežni tipovi podataka.

Konstantni izraz odnosi se na konstantan broj ili prethodno definirani parametar. Ne možemo mijenjati vrijednosti parametara tijekom izvođenja, ali možemo mijenjati vrijednost parametra pomoću defparam izjava.

The defparam naredba može modificirati parametre samo u vrijeme kompilacije. Vrijednosti parametara mogu se mijenjati pomoću # specifikacije kašnjenja s instanciranjem modula.

U Verilog , postoje dvije metode za nadjačavanje vrijednosti parametra modula tijekom instanciranja modula.

  1. Korištenjem ključne riječi defparam.
  2. I dodjela vrijednosti parametra instance modula.

Nakon ključne riječi defparam, specificirana je hijerarhijska staza do parametra i nove vrijednosti parametra. Ova nova vrijednost trebala bi biti konstantan izraz. Ako izraz s desne strane upućuje na bilo koji parametar, treba ga deklarirati unutar modula u kojem se poziva defparam.

Metoda dodjele vrijednosti parametra instance modula izgleda kao dodjela odgode instanci vrata. Ova metoda nadjačava parametre unutar instanciranih modula kako se pojavljuju u modulu. Upotrebom ovog formata parametri se ne mogu preskočiti.

Konstantni izrazi mogu sadržavati prethodno deklarirane parametre. Kada se otkriju promjene na prethodno deklariranim parametrima, svi parametri koji ovise o ovoj vrijednosti automatski se ažuriraju.

Uzmite u obzir da se 4-bitni zbrajač može parametrizirati da prihvati vrijednost za broj bitova, a nove vrijednosti parametra mogu se proslijediti tijekom instanciranja modula. Dakle, N-bitno zbrajalo pretvara se u 4-bitno, 8-bitno ili 16-bitno zbrajalo. Oni su kao argumenti funkciji koji se prosljeđuju tijekom poziva 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 

Postoje dvije vrste parametara, modul i navesti , i oba prihvaćaju specifikaciju raspona. No, napravljeni su onoliko široki koliko i vrijednost koja se pohranjuje, pa stoga specifikacija raspona nije potrebna.

Parametri modula

Može se koristiti za nadjačavanje definicija parametara unutar modula i čini da modul ima drugačiji skup parametara tijekom kompajliranja. Parametar se može mijenjati pomoću defparam izjava. Uobičajeno je koristiti velika slova u imenima parametara kako biste ih odmah primijetili.

Donji modul koristi parametre za određivanje širine sabirnice, širine podataka i dubine FIFO-a unutar dizajna i može se nadjačati novim vrijednostima kada se modul instancira ili korištenjem defparam izjava.

 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 

U novom ANSI stilu Verilog deklaracije porta, možemo deklarirati parametre kao što su:

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

Nadjačavajući parametri

Parametri se mogu nadjačati novim vrijednostima tijekom instanciranja modula. Prvi dio je modul tzv design_ip imenom d0 gdje se novi parametri prosljeđuju unutar # ( ).

Drugi dio je korištenje Verilog konstrukta tzv defparam za postavljanje novih vrijednosti parametara. Prva metoda se obično koristi za prosljeđivanje novih parametara u RTL dizajnu. A druga se metoda koristi u simulacijama ispitnog stola za brzo ažuriranje parametara dizajna bez ponovnog postavljanja modula.

 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 

Brojač modula ima dva parametra N i DOLJE , za koji je deklarirano da ima zadanu vrijednost 2 i 0.

N kontrolira broj bitova u izlazu, učinkovito kontrolirajući širinu brojača. Prema zadanim postavkama radi se o 2-bitnom brojaču.

Parametar DOLJE kontrolira treba li brojač povećati ili smanjiti. Brojač će se smanjiti jer je parametar postavljen na 0.

2-bitni brojač

strint na int
 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></=>

Zadani parametri koriste se za implementaciju brojača gdje N jednako dva, što ga čini 2-bitnim brojačem, i DOLJE jednako je nuli, što ga čini povećanjem brojača. Izlaz brojača ostaje nepovezan na najvišoj razini.

Verilog parametri

4-bitni donji brojač

U ovom slučaju, brojač modula se instancira s N kao 4 što ga čini 4-bitnim brojačem. DOWN se prosljeđuje vrijednost 1 tijekom instanciranja modula i stoga se implementira brojač prema dolje.

 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 parametri

Navedite parametre

Ovi se parametri koriste za pružanje vrijednosti vremena i kašnjenja i deklariraju se pomoću specparam ključna riječ. Dopušteno je koristiti i unutar navedenog bloka i glavnog tijela 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 između specificiranih i modularnih parametara

Navedite parametar Parametar modula
Navedite specparam ključnu riječ deklarira parametar. Parametar modula je deklariran parametrom.
Može se deklarirati unutar određenog bloka ili unutar glavnog modula. Može se deklarirati samo unutar glavnog modula.
Ovom se parametru mogu dodijeliti specparams i parametri. Ovome se možda neće dodijeliti specparams.
SDF se može koristiti za nadjačavanje vrijednosti. Vrijednosti parametra deklaracije instance ili defparam mogu se koristiti za nadjačavanje.

Bilješke

Evo nekoliko važnih napomena za Verilog parametre, kao što su:

  • Ako koristimo defparam iskaz, moramo navesti hijerarhijski put do parametra.
  • Ne možemo preskočiti parametar u a dodjela vrijednosti parametra instance modula . Ako to trebamo učiniti, upotrijebimo početnu vrijednost za parametar koji nije prebrisan.
  • Kada jedan parametar ovisi o drugom, onda će se drugi automatski ažurirati ako promijenimo prvi.