1. 程式人生 > >RTL基本知識:阻塞賦值與非阻塞賦值

RTL基本知識:阻塞賦值與非阻塞賦值

ini 規則 rac init 基本知識 monitor 當前 並且 ima

0 醜話說在前邊

RHS:運算符(= or <=)右側的表達式

LHS:運算符(= or <=)左側的表達式

競爭(Race Condition):在同一仿真時間槽(time-slot)多條語句同時執行順序不同時可能產生不同的執行結果的情況。

建議規則一:模擬組合邏輯時使用阻塞賦值。

建議規則二:在過程性語句中,模擬時序邏輯時使用非阻塞賦值。

建議規則三:模擬latch時使用非阻塞賦值。

建議規則四:在同一個過程性語句中同時包括時序邏輯和組合邏輯時,該過程性語句中使用非阻塞賦值。

建議規則五:不要在同一個過程性語句中混用阻塞賦值與非阻塞賦值。

建議規則六:不要在多個過程性語句中對同一個變量進行賦值操作。

建議規則七:如果要觀測非阻塞賦值的結果,使用$strobe和$monitor進行觀測。

建議規則八:不要使用#0。

1 阻塞賦值

阻塞賦值使用的賦值運算符為“=”。阻塞賦值的過程是立刻執行的,即阻塞賦值運算符右側表達式求值完後立刻會更新至運算符左側,並且這個執行的過程不受其他語句執行的影響,其後的語句只有當前的賦值操作執行完成後才能順序執行。

2 非阻塞賦值

非阻塞賦值使用的賦值運算符為“<=”。非阻塞賦值執行過程為:在當前仿真時間槽(time-slot)開始分析計算獲得右側表達式的值,在當前時間槽執行結束時更新左側表達式的值,在右側表達式分析計算和左側表達式被更新之間,任何其他事件都可以執行,同時也有可能修改已經計算完成的右側表達式的值,即非阻塞賦值的過程不影響其他語句的執行.

根據非阻塞賦值的特點,其賦值運算符左側操作數只能為寄存器類型,因此非阻塞賦值只能用於過程性語句中(initial和always),不允許在連續賦值語句中使用非阻塞賦值。

3 阻塞賦值與非阻塞賦值區別

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

更多資訊,請關註下方二維碼!

技術分享圖片

RTL基本知識:阻塞賦值與非阻塞賦值