У 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-розрядний лічильник
іменування для 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></=>
Параметри за замовчуванням використовуються для реалізації лічильника 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
Вкажіть параметри
Ці параметри використовуються для надання значень часу та затримки та оголошуються за допомогою спецпарам ключове слово. Дозволяється використовувати як в межах зазначеного блоку, так і в основному корпусі модуля.
// 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
Вкажіть параметр | Параметр модуля |
---|---|
Укажіть ключове слово specparam декларує параметр. | Параметр модуля оголошується параметром. |
Він може бути оголошений всередині певного блоку або в основному модулі. | Його можна оголосити лише в основному модулі. |
Цьому параметру можуть бути призначені спецпараметри та параметри. | Цьому не можуть бути призначені спецпараметри. |
SDF можна використовувати для перевизначення значень. | Для перевизначення можна використовувати значення параметрів декларації екземпляра або defparam. |
Примітки
Ось деякі важливі примітки щодо параметрів Verilog, наприклад:
- Якщо ми використовуємо defparam ми повинні вказати ієрархічний шлях до параметра.
- Ми не можемо пропустити параметр у a присвоєння значення параметру екземпляра модуля . Якщо нам потрібно це зробити, використовуйте початкове значення для неперезаписаного параметра.
- Коли один параметр залежить від іншого, то другий буде автоматично оновлено, якщо ми змінимо перший.
=>