以下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
答案 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输出的差异。