verilog阻塞與非阻塞的綜合

2021-06-25 10:21:43 字數 1337 閱讀 7275

關於阻塞和非阻塞語句的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 左手方向 然後才允許別的語句執行。從理論上來說...