簡介
定義
在Verilog HDL的概念中阻塞賦值操作符用等號(即=)表示。在賦值時先計算等號右手方向(RHS)部分的值,這時賦值語句不允許任何別的Verilog語句的干擾,直到現行的賦值完成時刻,即把RHS賦值給LHS(等號左手方向)的時刻,它才允許別的賦值語句的執行。一般可綜合的阻塞賦值操作在RHS不能設定有延遲(即使是零延遲也不允許)。從理論上講,它與後面的賦值語句只有概念上的先後,而無實質上的延遲。若在RHS上加延遲,則在延遲期間會阻止賦值語句的執行,延遲後才執行賦值,這種賦值語句是不可綜合的,在需要綜合的模組設計中不可使用這種風格的代碼。
問題
如果在一個過程塊中阻塞賦值的RHS變數正好是另一個過程塊中阻塞賦值的LHS變數,這兩個過程塊又用同一個時鐘沿觸發,這時阻塞賦值操作會出現問題,即如果阻塞賦值的順序安排不好,就會出現競爭。若這兩個阻塞賦值操作用同一個時鐘沿觸發,則執行的順序是無法確定的。
使用要點
主要是下面兩個要點:
(1)在描述組合邏輯的always塊中用阻塞賦值,則綜合成組合邏輯的電路結構:
(2)在描述時序邏輯的always塊中用非阻塞賦值,則綜合成時序邏輯的電路結構。
為什麼一定要這樣做呢?這是因為要使綜合前仿真和綜合後仿真一致的緣故。如果不按照上面兩個要點來編寫Verilog代碼,也有可能綜合出正確的邏輯,但前後仿真的結果就會不一致。
為了更好地理解上述要點,需要對Verilog語言中的阻塞賦值和非阻塞賦值的功能和執行時間上的差別有深入的了解。為了解釋問題方便,下面定義兩個縮寫字:
RHS——方程式右手方向的表達式或變數可分別縮寫為RHS表達式或RHS變數;
LHS——方程式左手方向的表達式或變數可分別縮寫為LHS表達式或LHS變數。
IEEEVerilog標準定義了有些語句有確定的執行時間,有些語句沒有確定的執行時間。若有兩條或兩條以上語句準備在同一時刻執行,但由於語句的排列順序不同(而這種排列順序的不同是IEEEVerilog標準所允許的),卻產生了不同的輸出結果。這就是造成Verilog模組冒險和競爭現象的原因。
操作過程
阻塞賦值的執行可以認為是只有一個步驟的操作,即計算RHS並更新LHS,且不能允許有來自任何其他Verilog語句的干擾。所謂阻塞的概念是指在同一個always塊中,其後面的賦值語句從概念上(即使不設定延遲)是在前一句賦值語句結束後再開始賦值的。
與非阻塞賦值區別
在狀態變數的賦值或開關變數的賦值中,已明確建議大家使用非阻塞賦值。這不但是因為綜合工具要求這樣做,最根本的原因是與非阻塞賦值語句語意對應的電路結構正是我們想要實現的。這兩種賦值語句對應著兩種不同的電路結構。阻塞賦值對應的電路結構往往與觸發沿沒有關係,只與輸入電平的變化有關係。而非阻塞賦值對應的電路結構往往與觸發沿有關係,只有在觸發沿時才有可能發生賦值的情況。
阻塞和非阻塞賦值的區別在阻塞是順序執行而非阻塞是並行執行。
以下面的語句舉例
非阻塞賦值
always@(posedge clk)
begin
b<=a;
c<=b;
end
阻塞賦值
always@(posedge clk)
begin
b=a;
c=b;
end
兩種不同的賦值方式結果是不同的,非阻塞賦值b<=a;c<=b;兩條語句是同時執行的,而阻塞賦值b=a;c=b;兩條語句先執行b=a後執行c=b。