Мастерство параметров в Verilog: создание повторно используемых масштабируемых модулей
Параметры — конструкции Verilog, позволяющие повторно использовать модуль с разными спецификациями. Например, 4-битный сумматор можно параметризовать числом бит, а при инстанцировании передавать новые значения. Так N-битный сумматор становится 4-, 8- или 16-битным. Это похоже на аргументы функции, передаваемые при вызове.
parameter MSB = 7;
parameter REAL = 4.5;
parameter FIFO_DEPTH = 256, MAX_WIDTH = 32;
parameter [7:0] f_const = 2'b3; // 2-битное значение расширяется до 8 бит: 8'b3
Параметры — константы, изменять их значение во время выполнения нельзя. Недопустимо переобъявлять имя, уже используемое для net, переменной или другого параметра.
Два основных типа параметров: module и specify — оба принимают спецификацию диапазона, но обычно делают их настолько широкими, насколько требуется для хранимого значения, поэтому диапазон часто не нужен.
Параметры модуля (Module parameters)
Позволяют переопределять определения параметров внутри модуля, так что модуль получает другой набор параметров на этапе компиляции. Параметр можно изменить с помощью defparam или в операторе инстанцирования модуля. Обычно имена параметров пишут заглавными буквами для наглядности.
Модуль ниже использует параметры для ширины шины, ширины данных и глубины FIFO, которые можно переопределить при инстанцировании или через defparam.
// Verilog 1995 style port declaration
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];
// Design code ...
endmodule
В новом ANSI стиле объявления портов параметры объявляют так:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (
input [BUS_WIDTH-1:0] addr,
// Другие объявления портов
);
Переопределение параметров
Параметры можно переопределить новыми значениями при инстанцировании модуля. Первый способ — передача новых параметров в #( ) при инстанцировании. Второй — использование defparam. Первый способ — самый распространенный в RTL. Второй — часто в тестбенчах для быстрого изменения параметров без переинстанцирования.
module tb;
// Переопределение при инстанцировании
design_ip #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list] );
// defparam
defparam d0.FIFO_DEPTH = 128;
endmodule
Пример: параметризованный счетчик
Модуль counter имеет параметры N (ширина) и DOWN (направление), по умолчанию 2 и 0. N управляет шириной выхода. DOWN — инкремент (0) или декремент (1).
2-битный up-счетчик
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) out <= 0;
else begin
if (en)
if (DOWN) out <= out - 1;
else out <= out + 1;
else out <= out;
end
end
endmodule
Инстанцирование с N=2 (по умолчанию) и без DOWN (по умолчанию 0) — up-счетчик.
module design_top (
input clk, input rstn, input en,
output [1:0] out
);
counter #(.N(2)) u0 ( .clk(clk), .rstn(rstn), .en(en) );
endmodule
Схема показывает 2-битный up-счетчик. Выход счетчика не подключен на верхнем уровне.
4-битный down-счетчик
Здесь N=4 (4 бита), DOWN=1 — down-счетчик.
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
Параметры specify (Specify parameters)
Используются для задания временных задержек и декларируются ключевым словом specparam. Допускаются внутри блока specify и в теле модуля.
// specify блок
specify
specparam t_rise = 200, t_fall = 150;
specparam clk_to_q = 70, d_to_q = 100;
endspecify
// В теле модуля
module my_block ( ... );
specparam dhold = 2.0;
specparam ddly = 1.5;
parameter WIDTH = 32;
endmodule
Различия между specify и module параметрами
| Specify параметр | Module параметр |
|---|---|
Объявляется specparam | Объявляется parameter |
Может быть внутри specify блока или в теле модуля | Только в теле модуля |
| Может назначаться specparams и parameters | Не может назначаться specparams |
| SDF может переопределять значения | Переопределение через параметры инстанцирования или defparam |
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Основы Verilog: краткий обзор
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Иерархические ссылки в Verilog: область видимости и избежание коллизий имен
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство математических функций Verilog для эффективного аппаратного дизайна