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循环,其方式与几乎所有软件编程语言中的三步循环相同

  1. 初始化循环变量。
  2. 测试条件;如果为真,则按程序执行循环体语句;如果为假,则继续执行 for 循环之后的语句。
  3. 在循环结束时增加循环变量(或任何需要做的事情)并返回到步骤 2。

模拟器在执行前展开生成-for循环。它只是复制循环内的代码,用替换循环变量。循环的每次复制都有不同的常量循环值。 generate-for 循环中的代码不是过程语句;代码将是结构的实例,可以是其他 alwaysinitial 块。

综合工具从不执行程序代码。从它的角度看,agenerate-for和aprocedural-for没有区别;它将两个循环展开为循环的复制,循环的每次迭代都具有不同的常量循环值。