Verilog 生成块中的条件增量

Verilog 生成块中的条件增量,verilog,system-verilog,hdl,Verilog,System Verilog,Hdl,我想创建256个foo实例。因此,我有两个嵌套的generate循环。但是,我需要一个单独的索引变量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:

我想创建256个
foo
实例。因此,我有两个嵌套的generate循环。但是,我需要一个单独的索引变量
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
genvar j,i,l;
生成
l=0;
对于(j=0;j<16;j++)
开始
对于(i=0;i<16;i++)开始
富吧
(
.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])
);
如果(i<15)
l=(l+1)%16;
结束
结束
最终生成

不幸的是,这种构造不起作用。如何将
l
添加到此生成中以获得正确的输入信号选择?

使用条件运算符
?:
,并将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
genvarj,i;
生成
l=0;
对于(j=0;j<16;j++)
开始
对于(i=0;i<16;i++)开始
参数l=(i<15)?((l+1)%16):0;
富吧
(
.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])
);
结束
结束
最终生成

A
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

这如何为l(a_i的索引)创建正确的模式?l={0,1,2。然而,减法需要转换为无符号,因为模运算符对负数的作用不同:
a_i[(无符号的’(i-j)%16)*8+:8]
我正要提出:
{1'b0,4’(i-j)}
。有多种方法可以做到这一点。我更新了我的答案。我是如何定义的?作为一个正常的int?我收到以下错误消息:以下表达式应为常量。表达式:(i<15)((l+1)%16):0)
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