Verilog:顺序块时间

Verilog: Sequential Block Time

为什么一个顺序块(非并行)中所有指令的时间都一样?

module abc;
     reg [31:0] r;

     initial
          begin
               r = 0;
               $display($time, " ", r);
               r = 1;
               $display($time, " ", r);
               r = r + 2;
               $display($time, " ", r);
               $finish;
          end
endmodule 

输出:

               0          x
               0          0
               0          2

Verilog 是一种用于描述硬件模型和测试代码的语言,用于在模拟器中 运行 运行这些模型(后来被重新用作描述逻辑综合工具硬件的语言).

"time" 指的不是模拟器 运行 进入的真实世界,而是模拟器内部的模拟世界。大致来说,模拟世界中的时间只有在当前时间点无事可做时才会向前移动。

硬件的 Verilog 描述由程序块组成。这些块以相对于彼此的伪并行方式执行。每个block里面的代码都是在同一个时隙依次模拟的。

这样的程序块都是'alsways'块,初始块和最终块。您正在测试 initial 块。它很特殊,顾名思义,它在模拟的最开始就被执行。所有语句按顺序并在时间“0”。

对于 always 块,时间将不为零,但对于同一块中的所有指令仍然相同。

如果你想在初始块中看到时间差异,你需要添加延迟,即

initial
      begin
           r = 0;
           $display($time, " ", r);
           #1 
           r = 1;
           $display($time, " ", r);
           #1 
           r = r + 2;
           $display($time, " ", r);
           $finish;
      end

在上面的示例中,我添加了两个 1 周期延迟。您应该看到您的案例中的时间在增加。仍然所有指令顺序执行,延迟只是停止执行一个周期。

要查看并行行为,您需要一个带有 always 块的真实硬件描述,并且需要对其进行多个周期的模拟。然后您可能会注意到,不同的 always 块之间的打印顺序会有所不同,具体取决于模拟的状态。然而,即使在这种情况下,模拟器也会在开始模拟其他块的时间 'b'.

之前完成所有块的时间 'a' 的模拟。