Параметры Verilog
Параметры — это конструкции Verilog, которые позволяют повторно использовать модуль с другой спецификацией. Например, 4-битный сумматор может быть параметризован для приема значения количества битов, а новые значения параметров могут быть переданы во время создания экземпляра модуля. Таким образом, N-битный сумматор может стать 4-битным, 8-битным или 16-битным сумматором. Они похожи на аргументы функции, которые передаются во время вызова функции.
parameter MSB = 7; // MSB is a parameter with a constant value 7
parameter REAL = 4.5; // REAL holds a real number
parameter FIFO_DEPTH = 256,
MAX_WIDTH = 32; // Declares two parameters
parameter [7:0] f_const = 2'b3; // 2 bit value is converted to 8 bits; 8'b3
Параметры в основном являются константами, и, следовательно, изменение их значения во время выполнения является незаконным. Недопустимо переопределять имя, которое уже используется сетью, переменной или другим параметром.
Существует два основных типа параметров:модуль и указать и оба принимают спецификацию диапазона. Но обычно они делаются настолько широкими, насколько этого требует сохраняемое значение, и, следовательно, спецификация диапазона не требуется.
Параметры модуля
Параметры модуля можно использовать для переопределения определений параметров внутри модуля, что позволяет модулю иметь другой набор параметров во время компиляции. Параметр можно изменить с помощью 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 goes here ...
endmodule
В новом объявлении порта Verilog в стиле ANSI вы можете объявлять параметры, как показано ниже.
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
Пример
Счетчик модуля имеет два параметра N и DOWN, объявленные со значениями по умолчанию 2 и 0 соответственно. N управляет количеством битов на выходе, эффективно управляя шириной счетчика. По умолчанию это 2-битный счетчик. Параметр DOWN определяет, должен ли счетчик увеличиваться или уменьшаться. По умолчанию счетчик будет уменьшаться, так как параметр установлен на 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)
if (DOWN)
out <= out - 1;
else
out <= out + 1;
else
out <= out;
end
end
endmodule
Счетчик модуля создается с N равным 2, хотя это и не требуется, поскольку значение по умолчанию в любом случае равно 2. DOWN не передается во время создания экземпляра модуля и, следовательно, принимает значение по умолчанию, равное 0, что делает его счетчиком вверх.
module design_top ( input clk,
input rstn,
input en,
output [1:0] out);
counter #(.N(2)) u0 ( .clk(clk),
.rstn(rstn),
.en(en));
endmodule
Обратите внимание, что параметры по умолчанию используются для реализации счетчика, где N равно двум, что делает его 2-битным счетчиком, а значение DOWN равно нулю, что делает его счетчиком вверх. Выход из счетчика остается неподключенным на верхнем уровне.
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
Разница между параметрами спецификации и модуля
Указать параметр | Параметр модуля |
---|---|
Объявлено specparam | Объявлено parameter |
Может быть объявлен внутри specify блок или внутри основного модуля | Может быть объявлен только в основном модуле |
Могут быть назначены спецификации и параметры | Не могут быть назначены specparams |
SDF можно использовать для переопределения значений | Значения параметров объявления экземпляра или defparam можно использовать для переопределения |
Verilog