掌握阻塞賦值與非阻塞賦值的區別


實驗目的:掌握阻塞賦值與非阻塞賦值的區別

1.實驗原理:

在Verilog HDL語言中,信號有兩種賦值方式:非阻塞賦值和阻塞賦值;

其中有兩個要點:

1.在描述組合邏輯的always塊中用阻塞賦值,則綜合成組合邏輯的電路結構;
2.在描述時序邏輯的always塊中用非阻塞賦值,則綜合成時序邏輯的電路結構。

以下縮寫詞定義:
RHS-賦值等號右邊的表達式或變量。
LHS-賦值等號左邊的表達式或變量。

IEEE Verilong標准定義了有些語句有確定的執行時間,有些語句沒有確定的執行時間。
如果有兩條或兩條以上語句准備在同一時刻執行,但由於語句的排列順序不同,卻產生了不同的輸出結果,這就造成了Verilog模塊冒險和競爭現象的原因。為了避免這一現象,需理清阻塞賦值和非阻塞賦值之間的區別。

(1)非阻塞賦值:

非阻塞賦值操作符為"<=",非阻塞與阻塞賦值最大的區別就是非阻塞賦值允許其他的Verilog語句同時進行操作,非阻塞的操作過程可以看作兩個步驟:

(1)在賦值開始時刻,計算非阻塞賦值RHS表達式;
(2)在賦值結束時刻,更新非阻塞賦值LHS表達式;

非阻塞賦值操作只能用於對寄存器類型變量進行賦值,因此只能用在“initial”塊和“always”塊等過程塊中,且非阻塞賦值不允許用於連續賦值。

特點:

(1)在語句塊中,語句所賦值的變量值不能立即就為下面的語句所用;
(2)塊結束后才能完成這次賦值操作,而所賦的變量值是上一次賦值得到的;
(3)在編寫可綜合的時序邏輯模塊時,這是最常用的賦值方法。

(2)阻塞賦值:

阻塞賦值的操作符為“=”,該種賦值方式在執行時只有一個步驟,即計算RHS並更新LHS,此時不能允許有來自任何其他Verilog語句干擾,所謂阻塞的概念是指在同一個always塊中,其后面的賦值語句從概念上(即使不設定延遲)是在前一句賦值語句結束后再開始賦值的。

如果在一個過程塊中阻塞賦值的RHS變量正好是另一個過程塊中阻塞賦值的LHS變量,這兩個過程塊又用同一個時鍾沿觸發,這時阻塞賦值操作就會出現問題,即如果阻塞順序安排的不好,就會出現競爭,若這兩個阻塞賦值操作用同一個時鍾沿觸發,則執行的順序是無法確定的。

特點:

(1)賦值語句完成后,塊才結束;
(2)b的值在賦值語句執行完后立刻改變。
(3)在時序邏輯中使用時,可能會產生意想不到的結果。

通俗一點講就是阻塞賦值,操作符為“ =”, “阻塞”是指在進程語句( initial 和 always)中,當前的賦值語句阻斷了其后的語句,也就是說后面的語句必須等到當前的賦值語句執行完畢才能執行。而且阻塞賦值可以看成是一步完成的,即:計算等號右邊的值並同時賦給左邊變量。非阻塞賦值,操作符為“ <=”, “非阻塞”是指在進程語句( initial 和 always)中,當前的賦值語句不會阻斷其后的語句。

2.實驗步驟

注:實驗步驟注重不同賦值方式的對比區別和實現方法,以及如何體現在RTL視角電路及仿真信號結果的不同展示。

步驟一:使用阻塞賦值描述全加器,具體實現如下圖
在這里插入圖片描述
上述1,2實現的是在阻塞賦值中賦值語句順序不一致,從而來確定賦值語句執行是順序執行的,而不是所謂並行語句執行,具體分析在RTL邏輯電路中查看兩者之間的不同。

在這里插入圖片描述
首先我們可以看出在把阻塞賦值的兩條語句順序顛倒一下,再次綜合可以得到上圖所示的兩個邏輯電路。可以看出調整順序后與不調整時生成的邏輯電路不一致。現結合實驗原理給出詳細解釋,

當執行 out = d + c 時, d 的數據此時並不是更新后 a+b 的數據,而是上一個 Clk 上升沿到來時 d 的數據,這也就解釋了為何還有一個 D 觸發器的存在。

通俗的講阻塞, out 這條語句阻塞了 d 這條語句執行。對比1的邏輯,由於 d 這條語句在 out的前面,雖然使用了阻塞賦值但是相當於 out=a+b+c。

步驟二:使用非阻塞賦值描述全加器,同理依然是再次交換語句執行順序實現對比,具體實現如下圖
在這里插入圖片描述
在這里插入圖片描述
使用非阻塞方式時,再次交換語句執行順序,綜合后實現的邏輯電路上圖所示,兩者之間並無差距,因此交換語句的前后順序並不會對最終生成的邏輯電路有實際影響。

步驟三:建立仿真文件,觀察賦值波形,具體測試代碼文件如下
在這里插入圖片描述
設置好仿真腳本后,首先進行非阻塞賦值方式的功能仿真,可以看到下圖所示的波形文件,可以看出在復位信號置高之前輸出為 0。
在這里插入圖片描述
直觀看上去沒有問題,現在放大細節可以看出,如下圖所示,變化在第一個時鍾上升沿之后,因此第一個時鍾沿檢測不到,下一個時鍾檢測到 110 直接賦值計算,但由於在第一個上升沿 out 的值依舊為 10, 設計雖然采用非阻塞賦值方式, 且此刻 d 值已經更新為 1,但是實際電路中總會存在延遲,這個時鍾沿時刻 out 已經采樣不到當前 d 的值,繼續保持數值 0,因此在第三個上升沿判斷出此時值為10,

在這里插入圖片描述
為了更好的解釋這種現象,現進行時序仿真,如下圖所示,可以很明顯看出這一現象。
在這里插入圖片描述
將out改為另一種非阻塞賦值方式時,再對比RTL視角及仿真有何不同?
在這里插入圖片描述
在這里插入圖片描述

本節實驗對比了 Verilog 語法中阻塞賦值和非阻塞賦值的區別。 通過證明非阻塞賦值多種賦值順序生成電路的唯一性,與阻塞賦值多種賦值順序生成電路的不確定性,來展示使用非阻塞賦值對設計可預測性的重要意義。 在今后的設計中會經常用到兩種賦值方式,請多加思考其中區別及意義。

在今后的設計中,掌握以下六個原則,可解決在綜合后仿真中出現絕大多數的冒險競爭問題。

1) 時序電路建模時,用非阻塞賦值;

2) 鎖存器電路建模時,用非阻塞賦值;

3) 用 always 塊建立組合邏輯模型時,用阻塞賦值;

4) 在同一個 always 塊中建立時序和組合邏輯電路時,用非阻塞賦值;

5) 在同一個 always 塊中不要既用非阻塞賦值又用阻塞賦值;

6) 不要在一個以上的 always 塊中為同一個變量賦值。

書籍推薦:《Verilog數字系統設計(夏宇聞)》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM