为什么顺序块(非并行)中的所有指令的时间都相同?
即
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
答案 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'。