我想创建256个foo
个实例。因此,我有两个嵌套的生成循环。但是,我需要一个单独的索引变量l
来正确选择信号。
genvar j, i, l;
generate
l = 0;
for(j = 0; j < 16; j++)
begin
for(i = 0; i < 16; i++) begin
foo bar
(
.a_i(a_i[(l+1)*8-1:l*8]),
.b_i(b_i[(j+1)*8-1:j*8]),
.c_o(c_i[i][j])
);
if(i < 15)
l = (l + 1) % 16;
end
end
endgenerate
不幸的是,这种结构不起作用。如何将l
添加到此生成以获得正确的输入信号选择?
答案 0 :(得分:1)
只能将genvar
指定为for循环中的索引。所以把它留作表达式:
genvar j, i;
generate
for (j = 0; j < 16; j++) begin
for (i = 0; i < 16; i++) begin
foo bar (
// prefix 1'b0 for correct sign extinction, 4'() does casting
.a_i(a_i[{1'b0,4'(i-j)}*8 +: 8]),
.b_i(b_i[j*8 +: 8]),
.c_o(c_i[i][j])
);
end
end
endgenerate
+:
用于数组切片,允许变量索引和常量偏移。它更简洁,更容易维护,然后指定msb:lsb,它是可综合的。请参阅&#39; Indexing vectors and arrays with +:&#39;和&#39; What is `+:` and `-:`?
您还可以将此方法与dave_59&#39; parameter
方法结合使用:
genvar j, i;
generate
for (j = 0; j < 16; j++) begin
for (i = 0; i < 16; i++) begin
// defining the parameter with a data type to insure it is a unsigned 4 bit value
parameter bit [3:0] l = (i-j);
foo bar (
.a_i(a_i[l*8 +: 8]),
.b_i(b_i[j*8 +: 8]),
.c_o(c_i[i][j])
);
end
end
endgenerate
答案 1 :(得分:0)
使用条件运算符?:
,并使l成为参数
genvar j, i;
generate
l = 0;
for(j = 0; j < 16; j++)
begin
for(i = 0; i < 16; i++) begin
parameter l = (i < 15) ? ((l + 1) % 16) : 0;
foo bar
(
.a_i(a_i[(l+1)*8-1:l*8]),
.b_i(b_i[(j+1)*8-1:j*8]),
.c_o(c_i[i][j])
);
end
end
endgenerate