關於阻塞和非阻塞語句的5大原則:
原則1: 時序電路建模時,用非阻塞賦值。
原則2: 用always塊寫組合邏輯時,採用阻塞賦值。
原則3: 在同乙個always塊中不要同時使用非阻塞賦值和阻塞賦值。
原則4: 鎖存器電路建模時,用非阻塞賦值。
原則5: 在同乙個always塊中同時建立時序和組合邏輯電路時,用非阻塞賦值。
最好按照這些原則去做,以免綜合出的電路不合要求。
例如:always@(posedge clk)
begin
a=a+1;
b=a-c;
endalways@(posedge clk)
begin
c=a;
endendmodule
b的結果為2。因為b取a賦值後的值,但取c賦值之前的值。
開啟tool->netlist viewer->rtl viever檢視綜合出的電路如圖:
實際上a、b、c觸發器的賦值仍然是同時進行的,只不過b會與a同時賦a+1的值。
如改為非阻塞語句:
always@(posedge clk)
begin
a<=a+1;
b<=a-c;
endalways@(posedge clk)
begin
c<=a;
endendmodule
結果b=1,則綜合出電路如下:
區別僅在於b賦a而上面是b賦a+1。
如果是組合邏輯中的阻塞語句:
always@(posedge clk)
begin
a<=a+1;
endalways@(a)
begin
b=a+3;
c=b+7;
end則綜合結束如下:
b、c全由組合邏輯電路實現。
若使用非阻塞語句:
always@(posedge clk)
begin
a<=a+1;
endalways@(a)
begin
b<=a+3;
c<=b+7;
end則綜合出的電路和上面一樣。因此似乎在組合邏輯中使用非阻塞語句沒有意義。因此一般的在組合邏輯中就直接使用阻塞語句。
verilog中的阻塞與非阻塞
初學verilog的同學容易搞混淆阻塞與非阻塞賦值操作。要區分的話,其實也有辦法。學過數位電路的都知道時序的概念,比暫存器的操作,把d端輸入用clk打入暫存器,在clk時鐘上公升沿取樣d值,只有在時鐘上公升沿的下一週期的上公升沿,d值才會在輸出端q上輸出出來。符合這個特徵的就是非阻塞賦值 alway...
verilog中的阻塞賦值與非阻塞賦值詳解
網上看到的覺得不錯分享下 組合邏輯的always模組中使用阻塞賦值 時序邏輯的always模組中使用非阻塞賦值 可以這樣理解,組合中計算馬上賦值,時序邏輯中上公升沿計算,下降沿賦值關鍵是組合邏輯中是實時變化的,而時序邏輯中乙個cycle才變化一次 比如 always a or b begin c a...
Verilog中的阻塞賦值和非阻塞賦值
verilog中阻塞賦值和非阻塞賦值的異同 一 阻塞賦值 操作符 把賦值運算看做 lhs rhs 在阻塞賦值時,先計算等號右手方向 rhs 的值,這時候賦值語句不允許別的verilog語句的干擾,直到現行的賦值過程完成,即將rhs計算得到的值賦給lhs 左手方向 然後才允許別的語句執行。從理論上來說...