[英]Calculating a parameter in a loop generate block
我有一个参数数组WIDTHS
,我需要根据generate块中WIDTHS
中的一些值来计算另一个参数RIGHT
。 这可能吗? 如果没有,还有其他方法吗?
这是我正在尝试做的一个例子。 假设我们有一个预定义的寄存器模块REG
,它具有输入d, q, we (write enable), CLK and _RESET
。 我想创建一个名为GroupReg
的新模块,该模块实例化REG
N
实例。 每个实例具有不同的宽度(因此WIDTH
参数数组)。 每个组的d, q, and we
聚集在GroupReg
具有相同名称的数组中,并且需要为每个实例指定。 因为我们只有一位,所以指定we
很容易( we[i]
)。 但是,用正确的LEFT
和RIGHT
值指定d
和q
是我遇到的问题,因为每个组的宽度不同。
看起来,给参数赋值的唯一方法是根据其定义,这会阻止在生成循环中为其赋值。
module GroupReg(d, q, we, CLK, _RESET);
parameter N = 4; //Number of groups
//INDICES has to have N+1 members. Last member should be 0
parameter integer WIDTHS [N:0] = {40, 30, 20, 10, 0};
parameter integer DW_TOTAL = 128;
input logic [DW_TOTAL-1:0] d; // Data Input
input logic [N-1:0] we; // write enable
input logic CLK; // Clock Input
input logic _RESET; // Reset input (active low)
output logic [DW_TOTAL-1:0] q; // Q output
genvar i, j;
for (i=N-1 ; i>=0 ; i--) begin:REGISTERS
localparam WIDTH = WIDTHS[i];
localparam LEFT = RIGHT + WIDTHS[i];;
localparam RIGHT = 0;
for (j = 0 ; j<i ; j++) // <<----- Does not work
RIGHT = RIGHT + WIDTH[j];
REG #(
.DW (WIDTH),
)
reg_i
(
.d(d[LEFT:RIGHT]),
.q(q[LEFT:RIGHT]),
.we(we[i]),
.CLK(CLK),
._RESET(_RESET)
);
end : REGISTERS
endmodule
我尝试在WIDTHS
上使用sum()
数组归约方法,并在Aldec Riviera PRO中起作用:
module some_module;
parameter N = 4; //Number of groups
parameter integer WIDTHS [N:0] = '{40, 30, 20, 10, 0};
parameter integer DW_TOTAL = WIDTHS.sum();
initial begin
$display("DW_TOTAL", DW_TOTAL);
end
endmodule
如果您很幸运,它也将在您的模拟器中工作。
无论如何,我实际上并没有真正理解将N
用作参数的方法,这是因为您无论如何都在硬编码固定数量的宽度值。
这适用于Modelsim:
module some_module;
parameter N = 4; //Number of groups
parameter integer WIDTHS [N:0] = '{40, 30, 20, 10, 0};
genvar i;
for (i=N-1 ; i>=0 ; i--) begin
localparam integer FOO[i:0] = WIDTHS[i:0];
//localparam RIGHT = FOO.sum();
initial begin
foreach (FOO[i])
$display("FOO[%0d] = %h", i, FOO[i]);
end
end
endmodule
FOO
参数将仅存储来自WIDTH
的特定循环迭代的相关条目。 如果sum()
可行,那么您将有空的家。 但是,切片语法在Riviera中不起作用。
这是供应商不同解释该标准的典型示例,基本上是因为它不够具体。 不过,如果您使用其他EDA公司的模拟器,请尝试将两个答案结合起来; 也许您很幸运,而且效果很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.