如何通过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 中引入。任何现代模拟器和合成器都支持它们。
我对下面的代码有疑问。代码在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 中引入。任何现代模拟器和合成器都支持它们。