Verilog 中可以多次使用循环变量吗?
Can loop variables be used multiple times in Verilog?
我有两个数组,如下所示:
reg [3:0] foo [31:0];
reg [7:0] bar [63:0];
它们需要在 always
块中初始化如下:
integer i;
integer j;
always @(posedge clk) begin
if(reset) begin
for(i=0; i<32; i=i+1) foo[i] <= 4'h0;
for(j=0; j<64; j=j+1) bar[j] <= 8'h0;
end
end
据我了解,合成器会在编译时扩展每个循环,这意味着 i
和 j
实际上不会被合成。因此,我可以为代码中的每个循环使用 same 循环变量名吗?例如,下面的代码有效吗?
integer k;
always @(posedge clk) begin
if(reset) begin
for(k=0; k<32; k=k+1) foo[k] <= 4'h0;
for(k=0; k<64; k=k+1) bar[k] <= 8'h0;
end
end
同样,genvar
个变量的答案是否也成立?
这个问题是关于 Verilog,而不是 SystemVerilog。
提前致谢!
此问题并非特定于 for
循环。在 any 程序代码块中,如果您在读取变量之前写入变量,并且不在程序块之外使用它,它会被合成为一个临时变量。您可以先写入,然后一遍又一遍地读取。每个配对都单独处理。
当使用 for
循环时,这实际上是 for 循环展开时发生的情况。它被分配一个常量值,然后是另一个。
我有两个数组,如下所示:
reg [3:0] foo [31:0];
reg [7:0] bar [63:0];
它们需要在 always
块中初始化如下:
integer i;
integer j;
always @(posedge clk) begin
if(reset) begin
for(i=0; i<32; i=i+1) foo[i] <= 4'h0;
for(j=0; j<64; j=j+1) bar[j] <= 8'h0;
end
end
据我了解,合成器会在编译时扩展每个循环,这意味着 i
和 j
实际上不会被合成。因此,我可以为代码中的每个循环使用 same 循环变量名吗?例如,下面的代码有效吗?
integer k;
always @(posedge clk) begin
if(reset) begin
for(k=0; k<32; k=k+1) foo[k] <= 4'h0;
for(k=0; k<64; k=k+1) bar[k] <= 8'h0;
end
end
同样,genvar
个变量的答案是否也成立?
这个问题是关于 Verilog,而不是 SystemVerilog。
提前致谢!
此问题并非特定于 for
循环。在 any 程序代码块中,如果您在读取变量之前写入变量,并且不在程序块之外使用它,它会被合成为一个临时变量。您可以先写入,然后一遍又一遍地读取。每个配对都单独处理。
当使用 for
循环时,这实际上是 for 循环展开时发生的情况。它被分配一个常量值,然后是另一个。