【发布时间】:2014-07-25 03:22:08
【问题描述】:
我在 always 块中有以下带有阻塞(代码 1)和非阻塞(代码 2)分配的代码。
但是两种情况下的输出是不同的。为什么?
我知道事件队列,但可能我无法理解“always @ (clk)”语句将放置在事件队列中的哪个位置。
// Code 1
module osc2 (clk, d);
output clk;
reg clk;
input d;
initial
begin
#10 clk = 0;
$monitor ("%d %b", $time, clk);
end
initial #100 $finish;
always @ (clk) #10 clk = ~clk;
endmodule
// Output of Code 1
10 0
20 1
// Code 2
module osc2 (clk, d);
output clk;
reg clk;
input d;
initial
begin
#10 clk = 0;
$monitor ("%d %b", $time, clk);
end
initial #100 $finish;
always @ (clk) #10 clk <= ~clk;
endmodule
// Output of Code 2
10 0
20 1
30 0 (goes on upto 90)
90 0
【问题讨论】:
-
这是几天前被问到的同一个问题。格雷格很好地回答了这个问题。 stackoverflow.com/a/24918187/922723
-
感谢 russell,我读过,但仍有一些困惑。什么时候将安排确切的事件,在 ~clk 上或当 clk= 执行时???? &总是@事件放在哪个事件队列中???
-
@KaranShah,除
clk <=和$monitor之外的所有内容都在活动区域中。 always 块中的所有内容都是程序性的。<=推迟更新,但~clk在返回@之前被评估。如果您对调度程序的工作原理感兴趣,可以查看stackoverflow.com/a/22825856/1959732、stackoverflow.com/a/21316975/1959732,还有很多其他在线资源。 -
@Greg,非常感谢您提供这两个线程。它增强了我对事件队列和调度的概念,但我请求你是否能给我 code1 的 while 循环迭代(事件队列语句),那么它将对我的全面理解有很大帮助。
标签: verilog