For循环是否是软件for循环而不是初始块中verilog中的硬件for循环
Is the For loop a software for loop instead of the hardware for loop in verilog in the intial block
初始块外的 for 循环生成硬件(使用 genvar),但是 verilog 中初始块中的 for 循环就像软件 for 循环一样工作吗?
初始块当然仅用于模拟目的,因此循环软件很有意义。
一个例子是here。该示例中的测试台显示了讨论中 for 循环的使用,如下所示:
module fsm_test;
reg clk, rst, inp;
wire outp;
reg[15:0] sequence;
integer i;
fsm dut( clk, rst, inp, outp);
initial
begin
clk = 0;
rst = 1;
sequence = 16'b0101_0111_0111_0010;
#5 rst = 0;
for( i = 0; i <= 15; i = i + 1)
begin
inp = sequence[i];
#2 clk = 1;
#2 clk = 0;
$display("State = ", dut.state, " Input = ", inp, ", Output = ", outp);
end
test2;
end
task test2;
for( i = 0; i <= 15; i = i + 1)
begin
inp = $random % 2;
#2 clk = 1;
#2 clk = 0;
$display("State = ", dut.state, " Input = ", inp, ", Output = ", outp);
end
endtask
endmodule
可以模拟您用 Verilog 编写的所有代码(假设没有语法或语义错误)。您编写和模拟的代码中只有一部分可以合成到硬件中。模拟器不知道最终会合成什么子集,执行行为是一样的。
一个模拟器执行一个过程-for
循环,其方式与几乎所有软件编程语言中的三步循环相同
- 初始化循环变量。
- 测试条件;如果为真,则按程序执行循环体语句;如果为假,则继续执行
for
循环之后的语句。
- 在循环结束时增加循环变量(或任何需要做的事情)并返回到步骤 2。
模拟器在执行前展开生成-for
循环。它只是复制循环内的代码,用替换循环变量。循环的每次复制都有不同的常量循环值。 generate-for 循环中的代码不是过程语句;代码将是结构的实例,可以是其他 always
或 initial
块。
综合工具从不执行程序代码。从它的角度看,agenerate-for和aprocedural-for没有区别;它将两个循环展开为循环的复制,循环的每次迭代都具有不同的常量循环值。
初始块外的 for 循环生成硬件(使用 genvar),但是 verilog 中初始块中的 for 循环就像软件 for 循环一样工作吗?
初始块当然仅用于模拟目的,因此循环软件很有意义。
一个例子是here。该示例中的测试台显示了讨论中 for 循环的使用,如下所示:
module fsm_test;
reg clk, rst, inp;
wire outp;
reg[15:0] sequence;
integer i;
fsm dut( clk, rst, inp, outp);
initial
begin
clk = 0;
rst = 1;
sequence = 16'b0101_0111_0111_0010;
#5 rst = 0;
for( i = 0; i <= 15; i = i + 1)
begin
inp = sequence[i];
#2 clk = 1;
#2 clk = 0;
$display("State = ", dut.state, " Input = ", inp, ", Output = ", outp);
end
test2;
end
task test2;
for( i = 0; i <= 15; i = i + 1)
begin
inp = $random % 2;
#2 clk = 1;
#2 clk = 0;
$display("State = ", dut.state, " Input = ", inp, ", Output = ", outp);
end
endtask
endmodule
可以模拟您用 Verilog 编写的所有代码(假设没有语法或语义错误)。您编写和模拟的代码中只有一部分可以合成到硬件中。模拟器不知道最终会合成什么子集,执行行为是一样的。
一个模拟器执行一个过程-for
循环,其方式与几乎所有软件编程语言中的三步循环相同
- 初始化循环变量。
- 测试条件;如果为真,则按程序执行循环体语句;如果为假,则继续执行
for
循环之后的语句。 - 在循环结束时增加循环变量(或任何需要做的事情)并返回到步骤 2。
模拟器在执行前展开生成-for
循环。它只是复制循环内的代码,用替换循环变量。循环的每次复制都有不同的常量循环值。 generate-for 循环中的代码不是过程语句;代码将是结构的实例,可以是其他 always
或 initial
块。
综合工具从不执行程序代码。从它的角度看,agenerate-for和aprocedural-for没有区别;它将两个循环展开为循环的复制,循环的每次迭代都具有不同的常量循环值。