阻塞赋值 =
always @ (posedge clk)
begin
c = b;
b = a;
$display("blocking: a = %d, b = %d, c = %d.", a, b, c);
end
在clk上升沿到来的时候,把a的值赋给b,再把b的值赋给c,并显示a、b 的值。在把a的值赋给b的这个过程中,其他的语句都“被阻塞”,被迫 停下来,结束之后,进入下一句,直到执行完begin---end中语句。所以相当于把a的值通过b传递给c。
非阻塞赋值 <=
always @ (posedge clk)
begin
c <= b;
b <= a;
$display("non_blocking: a = %d, b = %d, c = %d.", a, b, c);
end
在posedge clk到来时,计算所有的右侧值,此 时,a的值为3,b的值为x,这是同时进行的, 没有先后顺序;然后更新左侧值,结束之后, b的值变为3,c的值为前一时刻b的值,即x。
阻塞赋值 “=”:顺序执行。语句的顺序很重要,在本语句中“右式计算”和“左式更新”完全完成之后,才开始执行下一条语句。
-
非阻塞赋值“<=”:并行执行。同时执行,与顺序无关,当前语句的执行不会阻塞下一语句的执行。
在开始时,计算所有非阻塞赋值右侧表达式
在结束时,更新所有非阻塞赋值左侧表达式
使用原则
① 在assign的结构中,必须使用阻塞赋值。
② 用always块建立组合逻辑模型时,用阻塞赋值。
③ 时序电路(锁存器)建模时,用非阻塞赋值。
④ 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
⑤ 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。
⑥ 不要在一个以上的always块中为同一个变量赋值。