我的代码存在问题。该代码在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;
并得到了我上面写的完全相同的错误!
我知道有一个解决方案是使用案例而不是上面的代码,但对我来说这不是正确的解决方案
非常感谢。
答案 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