序列中的Verilog阻塞和非阻塞
我在Verilog中有以下内容:序列中的Verilog阻塞和非阻塞,verilog,blocking,nonblocking,Verilog,Blocking,Nonblocking,我在Verilog中有以下内容: reg a; always @ (clk) begin a = 0; a <= 1; $display(a); end reg a; 始终@(clk) 开始 a=0; 如IEEE 1364-1995§5.3、IEEE 1364-2001§5.3和IEEE 1364-2005§11.3所述,Verilog模拟在5个队列中进行: 活动事件(在#0之前) 评估所有非阻塞分配的RHS 评估RHS并更改所有阻塞分配的LHS 评估RHS并更改所有连
reg a;
always @ (clk)
begin
a = 0;
a <= 1;
$display(a);
end
reg a;
始终@(clk)
开始
a=0;
如IEEE 1364-1995§5.3、IEEE 1364-2001§5.3和IEEE 1364-2005§11.3所述,Verilog模拟在5个队列中进行:
- 活动事件(在
#0
之前)
- 评估所有非阻塞分配的RHS
- 评估RHS并更改所有阻塞分配的LHS
- 评估RHS并更改所有连续作业的LHS
- 评估输入并更改所有原语的输出
- 计算并打印
$display
和$write
- 非活动事件(在
#0
之后)
- 在
#0
延迟后评估RHS,其他过程与活动事件
- 使用PLI例程安排的回调过程,如
tf_synchronize()
(在IEEE 1364-2005中不推荐)和vpi_register_cb(cbReadWriteSynch)
- NBA更新
- 更改所有非阻塞分配的LHS
- 监控事件
- 评估并打印
$monitor
和$strobe
- 用原因调用PLI进行同步(IEEE 1364-2005中已弃用)
- 未来
- 在未来某个模拟时间发生的事件
由于$display
发生在分配非阻塞分配之前,因此该值将为0。注意:每个队列中的执行顺序可能会改变 你试过模拟吗?可能是@Qiu的复制品,这不是那个的复制品。这很接近,但我想看到其他人的答案关于Verilog模拟器中的调度语义,我知道以下几点:事件被调度执行的顺序如下:1-活动事件,如阻塞分配和非阻塞分配的RHS计算。2-非活动分配,3-非阻塞分配更新。对于上面的例子,我相信$display可能会显示0或1,这取决于display的执行时间。@Ari,你能推荐一个好的Mac模拟器供我免费使用吗?你的(好的)问题有一个简单的答案,但你发布的代码显然从未接近过模拟器。如果你先把它修好,你就更有可能得到答案。