verilog中阻塞与非阻塞
越是看似简单、经常接触的。我们越是不知其所以然。这就是我写本文的原因。
阻塞和非阻塞赋值一般使用在进程中,包括always和initial进程、assign赋值等操作中。
阻塞赋值与非阻塞赋值
always @(event-expression)
begin <LHS1=RHS1>
<LHS2=RHS2>
......
end
同样可将采用非阻塞赋值方式的always进程块写成下面的形式:
always @(event-expression)
begin <LHS1<=RHS1>
<LHS2<=RHS2>
......
end
阻塞赋值“=”与非阻塞赋值“<=”的本质区别在于:非阻塞赋值语句右端表达式计算完后并不立即赋值给左端,而是同时启动下一条语句继续执行,我们 可以将其理解为所有的右端表达式RHS1、RHS2等在进程开始时同时计算,计算完后 ,等进程结束时同时分别赋给左端变量LHS1、LHS2等。
而阻塞赋值语句在每个右端表达式计算完后立即赋给左端变量,即赋值语句LHS1=RHS1执行完后LHS1是立即更新的,同时只有LHS1=RHS1执行 完后才可执行语句LHS1=RHS2,依次类推。前一条语句的执行结果直接影响到后面语句的执行结果。