如何通过for变量在for循环中索​​引reg或内存?

how to index a reg or memory in for-loop by for-variable?

我对下面的代码有疑问。代码在ISE 14.2中综合。

input [1:8176] m_d_in;
reg [1:511] m_d [1:16];
integer i;

always @ (*)
  begin
    for (i=0; i<16; i=i+1)
       begin
         m_d[i+1] = m_d_in[ 1+511*i : 511+511*i];
       end
  end

合成后出现这个错误:
HDL Compiler:1660_<'Address of CodeName.v> <'Line of Error>: 不允许对非寄存器 i 进行程序分配,左侧应为 reg/integer/time/genvar
错误行指的是:

   m_d[i+1] = m_d_in[ 1+511*i : 511+511*i];

我也测试过使用:

reg [4:0] i;

genvar i;

而不是:

integer i;

得到了我上面写的完全相同的错误!
我知道使用案例而不是上面的代码有一个解决方案,但它对我来说不是正确的解决方案。
非常感谢。

如果您使用 wire 而不是 reg,那么单个分配行可以包含在生成中。

module tb(
input [1:8176] m_d_in
);
wire [1:511] m_d [1:16];

genvar i;

generate
  for (i=0; i<16; i=i+1) begin
    assign m_d[i+1] = m_d_in[ 1+511*i : 511+511*i];
  end
endgenerate

endmodule

要保留 reg 并使用生成器,您需要执行以下操作:

module tb(
input [1:8176] m_d_in
);
reg[1:511] m_d [1:16];

 genvar i;

generate
  for (i=0; i<16; i=i+1) begin
    always @* begin
      m_d[i+1] = m_d_in[ 1+511*i : 511+511*i];
    end
  end
endgenerate

endmodule

既然你的范围是一致的,那么Indexing vectors and arrays with +:也是可以的:

always @* begin
  for (i=0; i<16; i=i+1)
    m_d[i+1] = m_d_in[511*i+1 +: 511];
end

索引部分 select (+:/-:) 和 generate 块(来自 Morgan 的回答)在 IEEE std 1364-2001 中引入。任何现代模拟器和合成器都支持它们。