阻塞與非阻塞賦值

2021-04-30 11:10:56 字數 1922 閱讀 1330

李秋鳳,

華清遠見嵌入式學院

講師。稍微接觸過verilog hdl的都對阻塞與非阻塞賦值略知一二,也是我們經常強調的重點之一,在課堂上還是有學員問什麼不一樣呢,為什麼我用阻塞賦值也能得出正確的結果呢?

在編寫可綜合**的時候,建議大家不要忘了開啟rtl網表檢視器看看我們自己綜合出來的電路是不是自己想要的邏輯。

我就阻塞與非阻塞賦值這個問題詳細說明一下。

1、連續賦值

連續賦值語句的硬體實現是:從賦值語句(=)右邊提取出的邏輯,用於驅動賦值語句左邊的線網(net)

連續賦值語句

綜合以後,通過網表檢視器為上圖的結果,線網c由賦值語句的右邊的邏輯是組合邏輯a&b簡單驅動

2、過程賦值

過程賦值語句的硬體實現是,從賦值語句的(=或<=)右邊提取出的邏輯用於驅動賦值語句左邊的變數(必需是reg型別)。必須注意的是雖然過程賦值語句是可以出現在initial語句中(僅用於**),也可以出現在「always」塊語句中,但是只有「always」中的過程賦值語句才能被綜合

有兩種型別的過程賦值語句:阻塞賦值語句(blocking assignment statement)、非阻塞賦值語句(non-blocking assignment statement)

2.1、阻塞賦值語句

阻塞賦值語句可以簡單描述為,在乙個always塊中,語句按照從上到下的順序執行

綜合後的rtl檢視如上圖所示,每個時鐘上公升沿觸發後,變數q2、q1的值是同步的,q2被賦予了q1更新後的值

2.2、非阻塞賦值語句

非阻塞賦值語句簡述為:在乙個always 塊中,語句是並行執行的

從綜合結果的rtl檢視器可以看到如上圖所示,每個時鐘觸發後,q2被賦予的q1值時上個時鐘週期生成的值

從上面可以看出,第一條語句綜合出來的結果是一樣的,阻塞與非阻塞不同在於它們會影響到後面引用該條語句的邏輯

3、阻塞與非阻塞建模建模原則

1)、組合邏輯使用阻塞語句、時序邏輯使用非阻塞語句;

2)、在同乙個模組裡,同乙個變數不能既有阻塞賦值,又有非阻塞賦值

阻塞賦值和非阻塞賦值

阻塞賦值 阻塞賦值操作符用等號 即 表示。為什麼稱這種賦值為阻塞賦值呢?這是因為在賦值時先計算等號右手方向 rhs 部分的值,這時賦值語句不允許任何別的verilog 語句的干擾,直到現行的賦值完成時刻,即把rhs 賦值給 lhs 的時刻,它才允許別的賦值語句的執行。一般可綜合的阻塞賦值操作在rhs...

阻塞賦值和非阻塞賦值

2017 12 01 在verilog語言中,賦值語句經常使用,阻塞賦值和非阻塞賦值經常帶給我們很多困擾。在此討論兩種賦值方式的差異性。首先根據表面含義深刻理解阻塞和非阻塞 阻塞 在程序語句塊中 initial或者always或者其他 當前賦值語句的執行阻塞了後面語句的執行。即後面語句的賦值需要等到...

verilog中的阻塞賦值與非阻塞賦值詳解

網上看到的覺得不錯分享下 組合邏輯的always模組中使用阻塞賦值 時序邏輯的always模組中使用非阻塞賦值 可以這樣理解,組合中計算馬上賦值,時序邏輯中上公升沿計算,下降沿賦值關鍵是組合邏輯中是實時變化的,而時序邏輯中乙個cycle才變化一次 比如 always a or b begin c a...