I Verilog er parametre konstanter og hører ikke til nogen anden datatype såsom register- eller netdatatyper.
Et konstant udtryk refererer til et konstant tal eller tidligere defineret parameter. Vi kan ikke ændre parameterværdier under kørsel, men vi kan ændre en parameterværdi ved hjælp af defparam udmelding.
Det defparam statement kan kun ændre parametre på kompileringstidspunktet. Parameterværdier kan ændres ved hjælp af # forsinkelsesspecifikation med modulinstantiering.
I Verilog , er der to metoder til at tilsidesætte en modulparameterværdi under en moduloprettelse.
- Ved at bruge nøgleordet defparam.
- Og tildeling af modulforekomstparameterværdi.
Efter nøgleordet defparam specificeres den hierarkiske sti til parameteren og parameterens nye værdi. Denne nye værdi skal være et konstant udtryk. Hvis udtrykket på højre side refererer til nogen parametre, skal det erklæres i det modul, hvor defparam kaldes.
Metoden til tildeling af modulinstansparameterværdier virker som en tildeling af forsinkelse til gateinstansen. Denne metode tilsidesætter parametre inde i instansierede moduler, som de vises i modulet. Ved at bruge dette format kan parametre ikke springes over.
Konstante udtryk kan indeholde tidligere erklærede parametre. Når der registreres ændringer på de tidligere deklarerede parametre, opdateres alle parametre, der afhænger af denne værdi, automatisk.
Overvej, at en 4-bit adder kan parametreres til at acceptere en værdi for antallet af bits, og nye parameterværdier kan sendes under modulinstantiering. Så en N-bit adder konverteres til en 4-bit, 8-bit eller 16-bit adder. De er som argumenter til en funktion, der sendes under et funktionskald.
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
Der er to typer parametre, modul og specificere , og begge accepterer en rækkeviddespecifikation. Men de er lavet lige så brede som den værdi, der skal opbevares dem, og derfor er en rækkeviddespecifikation ikke nødvendig.
Modul parametre
Det kan bruges til at tilsidesætte parameterdefinitioner i et modul og får modulet til at have et andet sæt parametre på kompileringstidspunktet. En parameter kan ændres med defparam udmelding. Det er almindeligt at bruge store bogstaver i navne til parameteren for at bemærke dem med det samme.
Nedenstående modul bruger parametre til at specificere busbredden, databredden og dybden af FIFO i designet, og kan tilsidesættes med nye værdier, når modulet instansieres eller ved at bruge defparam-sætninger.
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
I den nye ANSI-stil af Verilog-porterklæringen kan vi erklære parametre som:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
Overordnede parametre
Parametre kan tilsidesættes med nye værdier under instansiering af modulet. Den første del kaldes modulet design_ip med navnet d0, hvor nye parametre sendes inden for # ( ).
Den anden del er bruge en Verilog konstruktion kaldet defparam for at indstille de nye parameterværdier. Den første metode bruges almindeligvis til at videregive nye parametre i RTL-design. Og den anden metode bruges i testbench-simuleringer til hurtigt at opdatere designparametrene uden at skulle genstancere modulet.
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
Modultælleren har to parametre N og NED , som er erklæret at have en standardværdi på 2 og 0.
N styrer antallet af bits i outputtet, og styrer effektivt tællerens bredde. Det er en 2-bit tæller som standard.
Parameter NED styrer om tælleren skal stige eller sænke. Tælleren vil falde, fordi parameteren er sat til 0.
2-bit op tæller
ascii af a i 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></=>
Standardparametrene bruges til at implementere tælleren hvor N er lig med to, hvilket gør det til en 2-bit tæller, og NED er lig med nul, hvilket gør det til en up-counter. Udgangen fra tælleren efterlades uden forbindelse på øverste niveau.
4-bit ned tæller
I dette tilfælde instansieres modultælleren med N som 4, hvilket gør den til en 4-bit tæller. DOWN videregives en værdi på 1 under instansieringen af modulet, og derfor implementeres en nedtæller.
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
Angiv parametre
Disse parametre bruges til at give tids- og forsinkelsesværdier og erklæres ved hjælp af specparam søgeord. Det er tilladt at bruge både inden for den specificerede blok og hovedmodulets krop.
// 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
Forskellen mellem Specify og Module Parameters
Angiv parameter | Modul parameter |
---|---|
Angiv parameteren specparam nøgleord erklærer. | Modulparameteren erklæres efter parameter. |
Det kan erklæres inde i en bestemt blok eller i hovedmodulet. | Det kan kun deklareres inden for hovedmodulet. |
Denne parameter kan tildeles specparams og parametre. | Dette er muligvis ikke tildelt specparams. |
SDF kan bruges til at tilsidesætte værdier. | Forekomsterklæringsparameterværdier eller defparam kan bruges til at tilsidesætte. |
Noter
Her er nogle vigtige bemærkninger til Verilog-parametrene, såsom:
- Hvis vi bruger defparam sætning, skal vi angive en hierarkisk sti til parameteren.
- Vi kan ikke springe over en parameter i en modul instans parameter værdi tildeling . Hvis vi skal gøre dette, skal du bruge startværdien for en ikke overskrevet parameter.
- Når den ene parameter afhænger af den anden, så vil den anden automatisk blive opdateret, hvis vi ændrer den første.
=>