Във Verilog параметрите са константи и не принадлежат към друг тип данни, като регистър или нетни типове данни.
Константен израз се отнася до постоянно число или предварително дефиниран параметър. Не можем да променяме стойностите на параметрите по време на изпълнение, но можем да променяме стойността на параметър с помощта на defparam изявление.
The defparam изразът може да променя параметрите само по време на компилация. Стойностите на параметрите могат да бъдат модифицирани с помощта на # спецификация за забавяне с инстанциране на модул.
в Verilog , има два метода за замяна на стойност на параметър на модул по време на инстанциране на модул.
- С помощта на ключовата дума defparam.
- И присвояване на стойност на параметър на екземпляр на модул.
След ключовата дума defparam се посочва йерархичният път към параметъра и новата стойност на параметъра. Тази нова стойност трябва да бъде постоянен израз. Ако изразът от дясната страна препраща към някакви параметри, той трябва да бъде деклариран в модула, където се извиква defparam.
Методът за присвояване на стойността на параметъра на екземпляра на модула изглежда като присвояване на забавяне на екземпляр на порта. Този метод заменя параметрите вътре в инстанцираните модули, както се появяват в модула. Използвайки този формат, параметрите не могат да бъдат пропуснати.
Константните изрази могат да съдържат предварително декларирани параметри. Когато се открият промени в предварително декларираните параметри, всички параметри, които зависят от тази стойност, се актуализират автоматично.
Помислете, че 4-битов суматор може да бъде параметризиран да приема стойност за броя на битовете и новите стойности на параметрите могат да бъдат предавани по време на инстанцирането на модула. И така, N-битов суматор се преобразува в 4-битов, 8-битов или 16-битов суматор. Те са като аргументи към функция, която се предава по време на извикване на функция.
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
Има два вида параметри, модул и посочете и двете приемат спецификация на диапазон. Но те са направени толкова широки, колкото стойността, която трябва да се съхраняват, и следователно не е необходима спецификация на диапазона.
Параметри на модула
Може да се използва за отмяна на дефинициите на параметри в рамките на модул и кара модула да има различен набор от параметри по време на компилиране. Параметър може да бъде модифициран с defparam изявление. Обичайно е използването на главни букви в имената на параметъра, за да ги забележите незабавно.
Модулът по-долу използва параметри за указване на ширината на шината, ширината на данните и дълбочината на FIFO в рамките на дизайна и може да бъде заменен с нови стойности, когато модулът е инстанциран или чрез използване на изрази defparam.
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
В новия ANSI стил на декларация на портове на Verilog можем да декларираме параметри като:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
Приоритетни параметри
Параметрите могат да бъдат заменени с нови стойности по време на инстанцирането на модула. Първата част е модулът т.нар design_ip с името d0, където новите параметри се предават в # ().
Втората част е използването на Verilog конструкция, наречена defparam за да зададете новите стойности на параметрите. Първият метод обикновено се използва за предаване на нови параметри в RTL проекти. А вторият метод се използва в симулации на тестови стендове за бързо актуализиране на параметрите на дизайна, без да се налага повторно инстанциране на модула.
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
Броячът на модула има два параметъра н и НАДОЛУ , за който е декларирано, че има стойност по подразбиране 2 и 0.
н контролира броя на битовете в изхода, като ефективно контролира ширината на брояча. По подразбиране е 2-битов брояч.
Параметър НАДОЛУ контролира дали броячът да се увеличава или намалява. Броячът ще намалява, тъй като параметърът е зададен на 0.
2-битов брояч нагоре
конкатенация на низове
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></=>
Параметрите по подразбиране се използват за реализиране на брояча where н е равно на две, което го прави 2-битов брояч и НАДОЛУ е равно на нула, което го прави брояч нагоре. Изходът от брояча остава несвързан на най-високо ниво.
4-битов брояч надолу
В този случай броячът на модула се инстанцира с N като 4, което го прави 4-битов брояч. На DOWN се предава стойност 1 по време на инстанцирането на модула и следователно се прилага брояч надолу.
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
Посочете параметри
Тези параметри се използват за предоставяне на стойности за време и забавяне и се декларират с помощта на specparam ключова дума. Разрешено е използването както в посочения блок, така и в основното тяло на модула.
// 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
Разлика между Specify и Module Parameters
Посочете параметър | Параметър на модула |
---|---|
Посочете ключовата дума specparam декларира параметър. | Параметърът на модула се декларира чрез параметър. |
Може да се декларира в конкретен блок или в основния модул. | Може да се декларира само в рамките на основния модул. |
На този параметър могат да бъдат присвоени спецификации и параметри. | Това може да не се присвоява на спецификации. |
SDF може да се използва за замяна на стойности. | Стойностите на параметрите на декларацията на екземпляра или defparam могат да се използват за отмяна. |
Бележки
Ето някои важни бележки за параметрите на Verilog, като например:
- Ако използваме defparam оператор, трябва да посочим йерархичен път до параметъра.
- Не можем да прескочим параметър в a присвояване на стойност на параметър на екземпляр на модул . Ако трябва да направим това, използваме първоначалната стойност за параметър, който не е презаписан.
- Когато единият параметър зависи от другия, тогава вторият ще се актуализира автоматично, ако променим първия.
=>