具有分配内延迟的阻塞和非阻塞语句之间的区别

时间:2013-08-27 01:58:15

标签: verilog blocking nonblocking

以下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

2 个答案:

答案 0 :(得分: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游乐场的工作示例:http://www.edaplayground.com/s/6/114

答案 1 :(得分:1)

in延迟#5之前切换时,它们会产生不同的输出。无论in切换的速度有多快,非阻止分配始终会#5延迟in

EDA游乐场的例子。注意sim输出的差异。