Verilog:连续块时间

问题描述:

为什么连续块(非并行)中所有指令的时间都一样?Verilog:连续块时间

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硬件描述由程序块组成。这些块以伪平行方式相对于彼此执行。每个块内的代码在相同的时隙中被顺序模拟。

这样的程序块都是'alsways'块,初始块和最终块。您正在测试初始区块。这是非常特殊的,正如名字所暗示的那样,在模拟开始时就被执行了。所有语句按顺序在'0'时刻。

对于始终的块,时间将为非零,但对于同一块中的所有指令仍然是相同的。

如果要看到在初始块的时间差,则需要添加的延迟,即

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

在上述实施例I增加了两个1个周期的延迟。你应该看到在你的情况下增加的时间。仍然所有的指令都是按顺序执行的,延迟只是停止执行一个周期。

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

+0

”......在相同的时间段顺序模拟。“说得通。我想知道为什么我们有fork-join块,如果begin-end似乎已经平行运行。 – NoName

+0

我认为'#1'增加了1个时间单位延迟,而不是1个周期。 – ahmedus

+0

#1在这种情况下停止对1个周期的语句的顺序执行。所有后面的语句将在下一个周期执行。 $ time默认返回执行的周期数。 – Serge

的Verilog是用来描述硬件和测试代码的模式行使了可以在模拟器上运行这些模型的语言。

“时间”指的不是模拟器运行的真实世界,而是模拟器内部的模拟世界。粗略地说,当模拟世界中的时间只有在当前时间点没有任何需要做的时候才会前进。

+0

有趣的,所以这解释了为什么连续的代码块没有反映在它的时间单位。 “ – NoName