Verilog HDL 阻塞和非阻塞指派的了解(1)
在Verilog HDL語言中,信号有兩種指派方式:
- 非阻塞
指派方式(如b<=a;)Non_Blocking
- 塊結束後才完成指派操作;
- b的值并不是立刻就改變的;
- 這是一種比較常用的指派方法;(特别在編寫可綜合子產品時)
- 阻塞
指派方式(b=a;)Blocking
- 指派語句執行完後,塊才結束;
- b的值在指派語句執行完後立刻就改變;
- 可能會産生意想不到的結果;
非阻塞指派方式和阻塞指派方式的差別常給設計人員帶來問題。
問題主要是給
always
塊内的
reg
型信号的指派方式不易把握。
到目前為止,前面所舉的例子中的
always
子產品内的reg型信号都是采用下面的這種指派方式:
b <= a;
這種方式的指派并不是馬上執行的,也就是說
always
塊内的下一條語句執行後,b并不等于a,而是保持原來的值。
always
塊結束後,才進行指派。
而另一種指派方式阻塞指派方式,如下所示:
b = a;
這種指派方式是馬上執行的。也就是說執行下一條語句時,b已等于a。
盡管這種方式看起來很直覺,但是可能引起麻煩。下面舉例說明:
Example 1:
always @ ( posedge clk ) begin
b <= a;
c <= b;
end
上例中的
always
塊中用了非阻塞指派方式,定義了兩個
reg
型信号b和c,
clk
信号的上升沿到來時,b就等于a,c就等于b,這裡應該用到了兩個觸發器。
請注意:指派是在
always
塊結束後執行的,c應為原來b的值。
這個
always
塊實際描述的電路功能如下圖所示:

Example 2:
always @ ( posedge clk ) begin
b = a;
c = d;
end
上例中中的
always
塊用了阻塞指派方式。
clk
信号的上升沿到來時,将發生如下的變化:
b馬上取a的值,c馬上取b的值(即等于a),
生成的電路圖如下所示隻用了一個觸發器來寄存器a的值,又輸出給b和c。
這大概不是設計者的初衷,如果采用[Eaxmple 1]所示的非阻塞指派方式就可以避免這種錯誤。
寫在後面
後面還有一期深入了解的。
Date
2019-08-29