Verilog:顺序阻止时间

时间:2017-06-19 23:06:55

标签: time verilog iverilog

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

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

2 个答案:

答案 0 :(得分:2)

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

“时间”不是指模拟器运行的现实世界,而是指模拟器内的模拟世界。粗略地说,在当前时间点没有任何事情要做时,模拟世界中的时间只会向前移动。

答案 1 :(得分:1)

Verilog硬件描述由程序块组成。这些块相对于彼此以伪并行方式执行。每个块内的代码在同一时隙中按顺序模拟。

这样的程序块都是“alsways”块,初始块和最终块。您正在测试初始块。这是特殊的,顾名思义,它在模拟的最开始执行。所有语句按顺序和时间'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周期延迟。您应该看到案例中的时间递增。仍然所有指令都是顺序执行的,延迟只是停止执行一个周期。

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