3

以下 2 段 verilog 代码有什么区别?

1)

always@(in)
  out = #5 in;

2)

 always@(in)
   out <= #5 in;

考虑到always块中没有其他行,输出会有什么不同吗?问题参考幻灯片 16(参见 o5 和 o6 输出) http://www.sutherland-hdl.com/papers/1996-CUG-presentation_nonblocking_assigns.pdf

4

2 回答 2

3

out = #5 in;阻塞下一个操作 5 个时间单位。它将阻止对下一个的监视,@(in)直到 5 个时间单位过去。如果您$display在分配之前和之后添加一条语句,您将看到 5 个时间单位已过去。

always @(in) begin
    $display("enter @ %0t",$realtime);
    out = #5 in;
    $display("exit @ %0t",$realtime);
end
/*******************
 * Example output:
 * enter @ time 10
 * exit @ time 15
 *******************/

out <= #5 in;安排未来 5 个时间单位的分配,并允许下一个操作开始,而无需等待分配完成。

always @(in) begin
    $display("enter @ %0t",$realtime);
    out <= #5 in;
    $display("exit @ %0t",$realtime);
end
/*******************
 * Example output:
 * enter @ time 10
 * exit @ time 10
 *******************/

EDA Playground 上的工作示例:http ://www.edaplayground.com/s/6/114

于 2013-08-27T17:27:12.533 回答
1

在延迟结束in之前切换时,它们会产生不同的输出。无论切换多快#5,非阻塞分配总是会延迟in#5in

EDA Playground 上的示例。请注意 sim 输出的差异。

于 2013-08-27T14:43:28.037 回答