Time Verilog:顺序块时间

Time Verilog:顺序块时间,time,verilog,iverilog,Time,Verilog,Iverilog,为什么序列块中所有指令的非并行时间都是相同的 i、 e 输出: 0 x 0 0 0 2 Verilog是一种设计用于描述硬件模型和测试代码的语言,用于测试可在模拟器中运行的模型。后来,它被重新设计为一种语言,用于描述逻辑综合工具的硬件 时间不是指模拟器运行的真实世界,而是指模拟器内部的模拟世界。粗略地说,模拟世界中的时间只有在当前时间点无事可做时才会向

为什么序列块中所有指令的非并行时间都是相同的

i、 e

输出:

               0          x
               0          0
               0          2

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


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

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

这些程序块都是“Alsway”块、初始块和最终块。您正在测试初始块。它是特殊的,顾名思义,它是在模拟的最开始执行的。所有语句按顺序在时间“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”的所有块的模拟,然后再开始时间“b”的其他块的模拟。

有趣的是,这解释了为什么顺序代码块没有反映在其时间单位中……在同一时间段中顺序模拟。有道理。我想知道,如果begin-end似乎已经并行运行了,为什么会有fork-join块。在这种情况下,1会停止语句的顺序执行1个周期。之后的所有语句将在下一个周期中执行$time返回默认情况下执行的周期数。
initial
      begin
           r = 0;
           $display($time, " ", r);
           #1 
           r = 1;
           $display($time, " ", r);
           #1 
           r = r + 2;
           $display($time, " ", r);
           $finish;
      end