如何通过for-variable索引for循环中的reg或内存?

时间:2015-04-06 07:29:04

标签: for-loop verilog

我的代码存在问题。该代码在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编译器:1660_&lt;&#39; CodeName.v的地址&gt; &lt;&#39;错误行&gt;:不允许对非寄存器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;

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

2 个答案:

答案 0 :(得分:1)

由于您的范围是一致的,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

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

答案 1 :(得分:0)

如果使用wire而不是reg,则可以在generate中包含单个赋值行。

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