In Verilog zijn parameters constanten en behoren ze niet tot een ander gegevenstype, zoals register- of netgegevenstypen.
Een constante uitdrukking verwijst naar een constant getal of een eerder gedefinieerde parameter. We kunnen parameterwaarden tijdens runtime niet wijzigen, maar we kunnen wel een parameterwaarde wijzigen met behulp van de defparam stelling.
De defparam -instructie kan parameters alleen wijzigen tijdens het compileren. Parameterwaarden kunnen worden gewijzigd met behulp van # vertragingsspecificatie met module-instantiatie.
In Verilog , zijn er twee methoden om een moduleparameterwaarde te overschrijven tijdens het instantiëren van een module.
- Door het trefwoord defparam te gebruiken.
- En toewijzing van parameterwaarden aan module-instanties.
Na het sleutelwoord defparam wordt het hiërarchische pad opgegeven naar de parameter en de nieuwe waarde van de parameter. Deze nieuwe waarde moet een constante uitdrukking zijn. Als de expressie aan de rechterkant naar parameters verwijst, moet deze worden gedeclareerd in de module waar defparam wordt aangeroepen.
De methode voor het toewijzen van de parameterwaarde van de module-instantie lijkt op een toewijzing van vertraging aan de poortinstantie. Deze methode overschrijft parameters binnen geïnstantieerde modules zoals ze in de module verschijnen. Met dit formaat kunnen parameters niet worden overgeslagen.
Constante expressies kunnen eerder gedeclareerde parameters bevatten. Wanneer er wijzigingen worden gedetecteerd in de eerder gedeclareerde parameters, worden alle parameters die afhankelijk zijn van deze waarde automatisch bijgewerkt.
Bedenk dat een 4-bits opteller kan worden geparametriseerd om een waarde voor het aantal bits te accepteren, en dat nieuwe parameterwaarden kunnen worden doorgegeven tijdens de instantiatie van de module. Een N-bit-opteller wordt dus omgezet in een 4-bits, 8-bits of 16-bits-opteller. Ze lijken op argumenten voor een functie die wordt doorgegeven tijdens een functieaanroep.
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
Er zijn twee soorten parameters, module En specificeren en beide accepteren een bereikspecificatie. Maar ze zijn zo breed gemaakt als de waarde waarin ze moeten worden opgeslagen, en daarom is een bereikspecificatie niet nodig.
Moduleparameters
Het kan worden gebruikt om parameterdefinities binnen een module te overschrijven en zorgt ervoor dat de module tijdens het compileren een andere set parameters heeft. Een parameter kan worden gewijzigd met de defparam stelling. Het is gebruikelijk om hoofdletters in namen te gebruiken, zodat de parameter deze onmiddellijk opmerkt.
De onderstaande module gebruikt parameters om de busbreedte, databreedte en de diepte van FIFO binnen het ontwerp te specificeren, en kan worden overschreven met nieuwe waarden wanneer de module wordt geïnstantieerd of door defparam-instructies te gebruiken.
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
In de nieuwe ANSI-stijl van Verilog-poortaangifte kunnen we parameters declareren zoals:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
Parameters overschrijven
Parameters kunnen worden overschreven met nieuwe waarden tijdens het instantiëren van de module. Het eerste deel heet de module ontwerp_ip met de naam d0 waarbij nieuwe parameters worden doorgegeven binnen # ( ).
Het tweede deel is het gebruik van een Verilog-construct genaamd defparam om de nieuwe parameterwaarden in te stellen. De eerste methode wordt vaak gebruikt om nieuwe parameters door te geven in RTL-ontwerpen. En de tweede methode wordt gebruikt in testbanksimulaties om de ontwerpparameters snel bij te werken zonder dat de module opnieuw hoeft te worden geïnstantieerd.
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
De moduleteller heeft twee parameters N En OMLAAG , waarvan is aangegeven dat deze een standaardwaarde van 2 en 0 heeft.
N regelt het aantal bits in de uitvoer, waardoor effectief de breedte van de teller wordt geregeld. Het is standaard een 2-bits teller.
Parameter OMLAAG bepaalt of de teller moet worden verhoogd of verlaagd. De teller loopt af omdat de parameter op 0 is ingesteld.
2-bits teller
hernoem map linux
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></=>
De standaardparameters worden gebruikt om de teller waar te implementeren N gelijk is aan twee, waardoor het een 2-bits teller is, en OMLAAG gelijk is aan nul, waardoor het een opteller is. De uitvoer van de teller blijft op het hoogste niveau niet aangesloten.
4-bit down-teller
In dit geval wordt de moduleteller geïnstantieerd met N als 4, waardoor het een 4-bits teller wordt. DOWN krijgt tijdens de module-instantiatie de waarde 1 doorgegeven en daarom wordt er een downcounter geïmplementeerd.
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
Geef parameters op
Deze parameters worden gebruikt om tijd- en vertragingswaarden te leveren en gedeclareerd met behulp van de specparam trefwoord. Het is toegestaan om zowel binnen het opgegeven blok als in de hoofdmodulebody te gebruiken.
// 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
Verschil tussen specificeer- en moduleparameters
Geef parameter op | Moduleparameter |
---|---|
Geef de specparam-sleutelwoorddeclaratieparameter op. | De moduleparameter wordt gedeclareerd per parameter. |
Het kan binnen een specifiek blok of binnen de hoofdmodule worden gedeclareerd. | Het kan alleen binnen de hoofdmodule worden gedeclareerd. |
Aan deze parameter kunnen specparams en parameters worden toegewezen. | Hieraan mogen geen specparams worden toegewezen. |
SDF kan worden gebruikt om waarden te overschrijven. | Parameterwaarden voor exemplaardeclaratie of defparam kunnen worden gebruikt om te overschrijven. |
Opmerkingen
Hier volgen enkele belangrijke opmerkingen over de Verilog-parameters, zoals:
- Als we gebruik maken van de defparam -instructie moeten we een hiërarchisch pad naar de parameter opgeven.
- We kunnen een parameter in a niet overslaan Toewijzing van parameterwaarde aan module-instantie . Als we dit moeten doen, gebruik dan de initiële waarde voor een niet-overschreven parameter.
- Wanneer de ene parameter van de andere afhankelijk is, wordt de tweede automatisch bijgewerkt als we de eerste wijzigen.
=>