阻塞賦值對應的電路往往與觸發沿沒有關系,只與輸入電平的變化有關系。
非阻塞賦值對應的電路結構往往與觸發沿有關系,只有在觸發沿時才有可能發生賦值的情況。
1、阻塞賦值操作符用等號(即 = )表示。“阻塞”是指在進程語句(initial和always)中,當前的賦值語句阻斷了其后的語句,也就是說后面的語句必須等到當前的賦值語句執行完畢才能執行。而且阻塞賦值可以看成是一步完成的,即:計算等號右邊的值并同時賦給左邊變量。例如:
當執行“x=next_x;”時,x會立即的到next_x的值。而下一句“y=x;”必須等到“x=next_x;”執行完畢才能被執行。由于這兩條語句都沒有延遲(相當于導線),導致他們的等價語句為“y=next_x;”。
賦值是實時的,計算完右面的馬上賦值給左邊的,然后再執行下一句,操作時串行的,且在一個alway內完成。
2、非阻塞賦值操作符用小于等于號 (即 《= )表示。“非阻塞”是指在進程語句(initial和always)中,當前的賦值語句不會阻斷其后的語句。非阻塞語句可以認為是分為兩個步驟進行的:
①計算等號右邊的表達式的值,(我的理解是:在進入進程后,所有的非阻塞語句的右端表達式同時計算,賦值動作只發生在順序執行到當前非阻塞語句那一刻)。
②在本條賦值語句結束時,將等號右邊的值賦給等號左邊的變量。
例如:
當執行“x《=next_x;”時,并不會阻斷語句“y《=x;”的執行。因此,語句“y《=x;”中的x的值與語句“x《=next_x;”中的x的值不同:語句“y《=x;”中的x是第一個D觸發器的初值(Q0)。而語句“x《=next_x;”中的x的值是D觸發器經過一個同步脈沖后的輸出值(Q1)。基于此這個進程產生了與阻塞賦值進程截然不同的結果,即:產生了移位寄存器的效果。
簡單理解就是,阻塞賦值是按需執行,非阻塞賦值是并行執行。
為了更好地理解上述要點,我們需要對Verilog 語言中的阻塞賦值和非阻塞賦值的功能和執行時間上的差別有深入的了解。為了解釋問題方便下面定義兩個縮寫字:
RHS – 方程式右手方向的表達式或變量可分別縮寫為:RHS表達式或RHS變量。LHS – 方程式左手方向的表達式或變量可分別縮寫為:LHS表達式或LHS變量。
IEEE Verilog標準定義了有些語句有確定的執行時間,有些語句沒有確定的執行時間。若有兩條或兩條以上語句準備在同一時刻執行,但由于語句的排列次序不同(而這種排列次序的不同是IEEE Verilog標準所允許的), 卻產生了不同的輸出結果。這就是造成Verilog模塊冒險和競爭現象的原因。為了避免產生競爭,理解阻塞和非阻塞賦值在執行時間上的差別是至關重要的。
-
Verilog
+關注
關注
28文章
1351瀏覽量
110075 -
阻塞賦值
+關注
關注
0文章
9瀏覽量
9157 -
非阻塞賦值
+關注
關注
0文章
10瀏覽量
9999
發布評論請先 登錄
相關推薦
評論