在 SystemVerilog 中生成内部 always_comb 块

Generate inside always_comb block in SystemVerilog

我知道在 SystemVerilog 的 always_comb 块中不能有 generate,但我想做一些类似于下面显示的事情,但我不知道该怎么做.

genvar i, j;
generate
for (i = 0; i < 4; i++) begin
    always_comb begin 
        unique case (STATE) 
            0: begin
               ...
               for(j = 0; j < 8; j++)
                   var[j*8+2*i+1:j*8+2*i] = 2'b11;
            end
            ...
        endcase

    end
end
endgenerate

现在它给我以下编译错误:Unknown range in part select 如有任何帮助,我们将不胜感激。

  1. var是verilog中的关键字,不能作为变量使用。
  2. genvar j 不能在 always 块内修改。
  3. partselect system verilog 至少要有一个恒定的宽度。
  4. 你错过了endgenerate

所以,你需要

  1. var 重命名为其他名称
  2. j 声明为非 genvar 变量,即 int
  3. 您的宽度始终是 2,因此您可以使用系统 verilog +:-: 范围说明符
  4. 在 system verilog 中您不再真正需要 generate..endgenerate 标记。

这里有一个例子:

genvar i;
//generate
  for (i = 0; i < 4; i++) begin: loop
    always_comb begin 
        unique case (STATE) 
            0: begin
               //...
              for(int j = 0; j < 8; j++)
                v[j*8+2*i +: 2] = 2'b11;
                   //v[j*8+2*i+1:j*8+2*i] = 2'b11;
            end
            //...
        endcase
    end
  end
//endgenerate