-1

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

IE

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
4

2 回答 2

2

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

“时间”不是指模拟器运行的真实世界,而是指模拟器内部的模拟世界。粗略地说,模拟世界中的时间只有在当前时间点无事可做时才会向前移动。

于 2017-06-19T23:41:59.220 回答
1

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

这样的程序块都是“总是”块,初始块和最终块。您正在测试初始块。它很特别,顾名思义,是在模拟开始时执行的。所有语句按顺序并在时间“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 块之间的打印顺序会有所不同,具体取决于模拟的状态。然而,即使在这种情况下,模拟器也会在时间“a”开始对其他块进行模拟之前完成时间“a”的所有块的模拟。

于 2017-06-20T00:34:42.130 回答