生成块中的条件增量

Conditional increment in generate block

我想创建 foo 的 256 个实例。因此,我有两个嵌套的生成循环。但是,我需要一个单独的索引变量 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 添加到此生成器以获得输入信号的正确选择?

使用条件运算符?:,并使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

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

+: 用于数组切片,允许可变索引和常量偏移。比指定 msb:lsb 更简洁,更易于维护,并且是可综合的。参考'Indexing vectors and arrays with +:' and 'What is `+:` and `-:`?

您还可以将此方法与 dave_59 的 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