深入理解阻塞和非阻塞賦值_第1頁
深入理解阻塞和非阻塞賦值_第2頁
深入理解阻塞和非阻塞賦值_第3頁
深入理解阻塞和非阻塞賦值_第4頁
深入理解阻塞和非阻塞賦值_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、深入理解阻塞和非阻塞賦值的不同概述1、阻塞賦值對應(yīng)的電路往往與觸發(fā)沿沒有關(guān)、阻塞賦值對應(yīng)的電路往往與觸發(fā)沿沒有關(guān)系系,只與輸入電平的變化有關(guān)系。阻塞賦值符只與輸入電平的變化有關(guān)系。阻塞賦值符號號: = 2 非阻塞賦值對應(yīng)的電路結(jié)構(gòu)往往與觸發(fā)沿有非阻塞賦值對應(yīng)的電路結(jié)構(gòu)往往與觸發(fā)沿有關(guān)系,只有在觸發(fā)沿時才有可能發(fā)生賦值的關(guān)系,只有在觸發(fā)沿時才有可能發(fā)生賦值的情況。非阻塞賦值符號情況。非阻塞賦值符號: =阻塞賦值和非阻塞賦值阻塞賦值和非阻塞賦值阻塞阻塞(Blocking)(Blocking)賦值方式賦值方式 “= ”= ”, 如如 b = a; b = a; 賦值語句執(zhí)行完后賦值語句執(zhí)行完后, ,

2、塊才結(jié)束。塊才結(jié)束。b b的值在賦值語句執(zhí)行完后立刻就改變的。的值在賦值語句執(zhí)行完后立刻就改變的。非阻塞非阻塞(Non_Blocking)(Non_Blocking)賦值方式賦值方式 “ ”,如,如 b = b = a; a; 塊結(jié)束后才完成賦值操作。塊結(jié)束后才完成賦值操作。b b的值并不是立刻就改變的。的值并不是立刻就改變的。這是一種比較常用的賦值方法(特別在編寫可綜這是一種比較常用的賦值方法(特別在編寫可綜合時序模塊時)。合時序模塊時)。阻塞賦值阻塞賦值 阻塞賦值操作符用等號(即 = )表示。阻塞賦值時先計算等號右手方向(RHS)部分的值,這時賦值語句不允許任何別的語句的干擾,直到現(xiàn)行的賦

3、值完成時刻,即把RHS賦值給 LHS的時刻,它才允許別的賦值語句的執(zhí)行。 一般可綜合的阻塞賦值操作在RHS不能設(shè)定有延遲,(即使是零延遲也不允許)。若在RHS 加上延遲,則在延遲期間會阻止賦值語句的執(zhí)行, 延遲后才執(zhí)行賦值,這種賦值語句是不可綜合的,在需要綜合的模塊設(shè)計中不可使用這種風(fēng)格的代碼。 阻塞賦值的執(zhí)行可以認為是只有一個步驟的操作:所謂阻塞的概念是指在同一個always塊中,其后面的賦值語句從概念上(即使不設(shè)定延遲)是在前一句賦值語句結(jié)束后再開始賦值的。非阻塞賦值非阻塞賦值 非阻塞賦值操作符用小于等于號非阻塞賦值操作符用小于等于號 ( (即即 = )= )表示。在賦值操表示。在賦值操作

4、時刻開始時計算非阻塞賦值符的作時刻開始時計算非阻塞賦值符的RHSRHS表達式,賦值操作時刻表達式,賦值操作時刻結(jié)束時更新結(jié)束時更新LHSLHS。在計算非阻塞賦值的RHS表達式和更新LHS期間,其他的Verilog語句,包括其他的Verilog非阻塞賦值語句都能同時計算RHS表達式和更新LHS。非阻塞賦值允許其他的Verilog語句同時進行操作。非阻塞賦值的操作可以看作為兩個步驟的過程: 1)1)在賦值時刻開始時,計算非阻塞賦值在賦值時刻開始時,計算非阻塞賦值RHSRHS表達式。表達式。 2)2)在賦值時刻結(jié)束時,更新非阻塞賦值在賦值時刻結(jié)束時,更新非阻塞賦值LHSLHS表達式。表達式。非阻塞賦

5、值操作只能用于對寄存器類型變量進行賦值,因此只非阻塞賦值操作只能用于對寄存器類型變量進行賦值,因此只能用在能用在“initial”initial”塊和塊和“always”always”塊等過程塊中。非阻塞賦塊等過程塊中。非阻塞賦值不值不允許用于連續(xù)賦值。允許用于連續(xù)賦值。難點1 1 何時使用非阻塞賦值,何時使用阻塞賦值才能設(shè)計何時使用非阻塞賦值,何時使用阻塞賦值才能設(shè)計出符合要求的電路。出符合要求的電路。2 2 在可綜合風(fēng)格的在可綜合風(fēng)格的VerilogVerilog模塊的設(shè)計中,為什么還要模塊的設(shè)計中,為什么還要用非阻塞賦值,以及符合用非阻塞賦值,以及符合IEEE IEEE 標準的標準的Ve

6、rilog Verilog 仿真仿真器究竟如何來處理非阻塞賦值的仿真。器究竟如何來處理非阻塞賦值的仿真。本小節(jié)明確地提出可綜合的本小節(jié)明確地提出可綜合的VerilogVerilog模塊編程在使用賦模塊編程在使用賦值操作時應(yīng)注意的要點,按照這些要點來編寫代碼就值操作時應(yīng)注意的要點,按照這些要點來編寫代碼就可以避免在可以避免在Verilog Verilog 仿真時出現(xiàn)冒險和競爭的現(xiàn)象仿真時出現(xiàn)冒險和競爭的現(xiàn)象 非阻塞賦初值導(dǎo)致錯誤阻塞賦初值正確綜合后波形對比仿真波形對比要 點1 在描述組合邏輯的always塊中用阻塞賦值,則綜合成組合邏輯的電路結(jié)構(gòu)。2 在描述時序邏輯的always塊中用非阻塞賦值

7、,則綜合成時序邏輯的電路結(jié)構(gòu)。RHS 方程式右手方向的表達式或變量可分別縮寫為: RHS表達式或RHS變量。 LHS 方程式左手方向的表達式或變量可分別縮寫為: LHS表達式或LHS變量。 深入理解阻塞的概念 阻塞賦值的執(zhí)行可以認為是只有一個步驟的操作:阻塞賦值的執(zhí)行可以認為是只有一個步驟的操作:計算計算RHSRHS并更新并更新LHSLHS,此時不能允許有來自任何其他,此時不能允許有來自任何其他VerilogVerilog語句的干擾。語句的干擾。 所謂阻塞的概念是指在同一個所謂阻塞的概念是指在同一個alwaysalways塊中,其后面的賦塊中,其后面的賦值語句從概念上(即使不設(shè)定延遲)是在前一

8、句賦值語句結(jié)值語句從概念上(即使不設(shè)定延遲)是在前一句賦值語句結(jié)束后再開始賦值的。束后再開始賦值的。如果在一個過程塊中阻塞賦值的如果在一個過程塊中阻塞賦值的RHSRHS變量正好是另一個過變量正好是另一個過程塊中阻塞賦值的程塊中阻塞賦值的LHSLHS變量,這兩個過程塊又用同一個時鐘變量,這兩個過程塊又用同一個時鐘沿觸發(fā),這時阻塞賦值操作會出現(xiàn)問題,即如果阻塞賦值的沿觸發(fā),這時阻塞賦值操作會出現(xiàn)問題,即如果阻塞賦值的次序安排不好,就會出現(xiàn)競爭。若這兩個阻塞賦值操作用同次序安排不好,就會出現(xiàn)競爭。若這兩個阻塞賦值操作用同一個時鐘沿觸發(fā),則執(zhí)行的次序是無法確定的。一個時鐘沿觸發(fā),則執(zhí)行的次序是無法確定

9、的。 深入理解非阻塞的概念非阻塞賦值的操作可以看作為兩個步驟的過程:非阻塞賦值的操作可以看作為兩個步驟的過程:1 1 在賦值時刻開始時,計算非阻塞賦值在賦值時刻開始時,計算非阻塞賦值RHSRHS表達式。表達式。2 2 在賦值時刻結(jié)束時,更新非阻塞賦值在賦值時刻結(jié)束時,更新非阻塞賦值LHSLHS表達式。表達式。 非阻塞賦值操作只能用于對寄存器類型變量進行非阻塞賦值操作只能用于對寄存器類型變量進行賦值,因此只能用在賦值,因此只能用在“initial”“initial”塊和塊和“always”“always”塊塊等過程塊中。非阻塞賦值不允許用于連續(xù)賦值。等過程塊中。非阻塞賦值不允許用于連續(xù)賦值。 阻

10、塞賦值項 目例 1 例 2描 述wire ck;reg 7:0 a, b, c, d;always ( posedge ck ) beginc = b;b = a;a = d;end代入前的初始值a = 5;c = 10;b = 3;d = 2;wire ck;reg 7:0 a, b, c, always ( posedge ck ) begina = d;/不同處c = b;b = a;end代入前的初始值a = 5;c = 10;b = 3;d = 2;運算結(jié)果 a = 2;c = 3;b = 5;d= 2; a = 2;c = 3;b = 2;d= 2;非阻塞賦值項 目例 1 例 2描

11、 述wire ck;reg 7:0 a, b, c, d;always ( posedge ck ) beginc = b;b = a;a = d;end代入前的初始值a = 5;c = 10;b = 3;d = 2;wire ck;reg 7:0 a, b, c, always ( posedge ck ) begina = d;/不同處c = b;b = a;end代入前的初始值a = 5;c = 10;b = 3;d = 2;運算結(jié)果 a = 2;c = 3;b = 5;d= 2; a = 2;c = 3;b = 5;d= 2;阻塞賦值阻塞賦值wire dinreg a, b, c;al

12、ways (posedge ck) begin a= din; b=a; c=b;end非阻塞賦值非阻塞賦值wire dinreg a, b, c;always (posedge ck) begin a= din; b=a; c=b;endwire dinreg a, b, c;always (posedge ck) begin a= din; b=a; c=b;end阻塞賦值阻塞賦值非阻塞賦值非阻塞賦值wire dinreg a, b, c;always (posedge ck) begin a= din; b=a; c=b;endDCKQDINCKCC=DIN;DCKQCKCDCKQDCK

13、QABVerilogVerilog模塊編程要點模塊編程要點1 時序電路建模時,用非阻塞賦值。2 鎖存器電路建模時,用非阻塞賦值。3 用always塊建立組合邏輯模型時,用阻塞賦值。4 在同一個always塊中建立時序和組合邏輯電路時,用非阻塞賦值。5 在同一個always塊中不要既用非阻塞賦值又用阻塞賦值。6 不要在一個以上的always塊中為同一個變量賦值。7 用$strobe系統(tǒng)任務(wù)來顯示用非阻塞賦值的變量值8 在賦值時不要使用 #0 延遲Verilog 的層次化事件隊列說明事件是按照一定的規(guī)則被加入到事件是按照一定的規(guī)則被加入到5 個區(qū)域中任意一個區(qū)域的,個區(qū)域中任意一個區(qū)域的,但是只從

14、其中的但是只從其中的“活躍事件活躍事件”區(qū)域出隊,出隊之后該事件將區(qū)域出隊,出隊之后該事件將會立刻執(zhí)行。會立刻執(zhí)行。仿真器首先按照仿真時間對事件進行排序,然后再在當(dāng)前仿真仿真器首先按照仿真時間對事件進行排序,然后再在當(dāng)前仿真時間里按照事件的優(yōu)先級順序進行排序。時間里按照事件的優(yōu)先級順序進行排序?;钴S事件是優(yōu)先級最高的事件。在活躍事件之間,它們的執(zhí)行活躍事件是優(yōu)先級最高的事件。在活躍事件之間,它們的執(zhí)行順序是隨機的。阻塞賦值順序是隨機的。阻塞賦值(=)、連續(xù)賦值、連續(xù)賦值Cassign) 以及非阻以及非阻塞賦值的右式計算等都屬于活躍事件。塞賦值的右式計算等都屬于活躍事件。將來仿真時間里的所有事件

15、都將暫時存放在將來事件隊列中。將來仿真時間里的所有事件都將暫時存放在將來事件隊列中。當(dāng)仿真器前進到某個時刻后,該時刻的所有事件也會被分類當(dāng)仿真器前進到某個時刻后,該時刻的所有事件也會被分類到當(dāng)前仿真時間事件隊列中,而仿真時刻未到的事件則仍然到當(dāng)前仿真時間事件隊列中,而仿真時刻未到的事件則仍然留在將來事件隊列中。留在將來事件隊列中。自觸發(fā)自觸發(fā)alwaysalways塊塊 例例3 使用阻塞賦值的非自觸發(fā)振蕩器使用阻塞賦值的非自觸發(fā)振蕩器 module osc1 (clk); output clk; reg clk; initial #10 clk = 0; always (clk) #10 cl

16、k = clk; endmodule例4 采用非阻塞賦值的自觸發(fā)振蕩器module osc2 (clk); output clk; reg clk; initial #10 clk = 0; always (clk) #10 clk = clk;Endmodule 移位寄存器模型移位寄存器模型下圖表示是一個簡單的移位寄存器方框圖。下圖表示是一個簡單的移位寄存器方框圖。例5 不正確地使用的阻塞賦值來描述移位寄存器。(方式 #1) module pipeb1 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q

17、1; always (posedge clk) begin q1 = d; q2 = q1; q3 = q2; end endmoduleD的值賦給Q1以后,再執(zhí)行Q2 = Q1;同樣在Q2的值更新以后,才執(zhí)行Q3 = Q2。這樣,最終的計算結(jié)果就是Q3 = D。即在每一個clk邊沿,輸入值被無延遲地傳到q3的輸出。這很明顯并沒有建立一個流水線而只是為一個寄存器建模-例例6 用阻塞賦值來描述移位寄存器也是可行的,但這種風(fēng)格用阻塞賦值來描述移位寄存器也是可行的,但這種風(fēng)格并不好。(方式并不好。(方式 #2 )module pipeb2 (q3, d, clk); output 7:0 q3; i

18、nput 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) begin q3 = q2; q2 = q1; q1 = d; end endmodule阻塞賦值被仔細地安排了次序以使得行為仿真正確。這種建阻塞賦值被仔細地安排了次序以使得行為仿真正確。這種建模同樣也可以得到正確的綜合結(jié)果模同樣也可以得到正確的綜合結(jié)果 例例7 不好的用阻塞賦值來描述移位時序邏輯的風(fēng)格不好的用阻塞賦值來描述移位時序邏輯的風(fēng)格(方式(方式 #3) module pipeb3 (q3, d, clk); output 7:0 q3; input 7:0

19、d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) q1 = d; always (posedge clk) q2 = q1; always (posedge clk) q3 = q2; endmodule阻塞賦值”被安排在不同的always塊里面。這樣Verilog標準允許以任意的次序來仿真執(zhí)行3個always塊-這也許會使得該流水線仿真結(jié)果產(chǎn)生錯誤,因為這產(chǎn)生了Verilog競爭條件。由不同的always塊執(zhí)行順序會產(chǎn)生不同的結(jié)果。盡管這樣,它的綜合結(jié)果將是正確的! 這就意味著綜合前仿真和綜合后仿真不匹配 例例8 不好的用阻塞賦值來

20、描述移位時序邏輯的風(fēng)格不好的用阻塞賦值來描述移位時序邏輯的風(fēng)格(方式(方式 #4) module pipeb4 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) q2 = q1; always (posedge clk) q3 = q2; always (posedge clk) q1 = d; endmodule顛倒了一下賦值次序,對實際仿真次序卻不產(chǎn)生決定作用 ,綜合結(jié)果是對的,但是仿真結(jié)果也許不正確 例例9 正確的用非阻塞賦值來描述時序邏輯的設(shè)計風(fēng)正確

21、的用非阻塞賦值來描述時序邏輯的設(shè)計風(fēng)格格 #1 module pipen1 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) begin q1 = d; q2 = q1; q3 = q2; end endmodule注意* *仿真器首先按照仿真時間對事件進行排序,仿真器首先按照仿真時間對事件進行排序,然后再在當(dāng)前仿真時間里按照事件的優(yōu)先級然后再在當(dāng)前仿真時間里按照事件的優(yōu)先級順序進行排序。順序進行排序。* *活躍事件是優(yōu)先級最高的事件。在活躍事件活躍事件是優(yōu)

22、先級最高的事件。在活躍事件之間,它們的執(zhí)行順序是隨機的。阻塞賦值之間,它們的執(zhí)行順序是隨機的。阻塞賦值(= =)、連續(xù)賦值()、連續(xù)賦值(assignassign)以及非阻塞賦值)以及非阻塞賦值的右式計算等都屬于活躍事件。的右式計算等都屬于活躍事件。例例10 正確的用非阻塞賦值來描述時序邏輯的設(shè)計正確的用非阻塞賦值來描述時序邏輯的設(shè)計風(fēng)格風(fēng)格 #2 module pipen2 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) begin q3 = q2; q

23、2 = q1; q1 = d; end endmodule例例11 正確的用非阻塞賦值來描述時序邏輯正確的用非阻塞賦值來描述時序邏輯的設(shè)計風(fēng)格的設(shè)計風(fēng)格 #3 module pipen3 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) q1 = d; always (posedge clk) q2 = q1; always (posedge clk) q3 = q2; endmodule例例12 正確的用非阻塞賦值來描述時序邏輯的設(shè)計正確的用非阻塞賦值來描

24、述時序邏輯的設(shè)計風(fēng)格風(fēng)格 #4module pipen4 (q3, d, clk); output 7:0 q3; input 7:0 d; input clk; reg 7:0 q3, q2, q1; always (posedge clk) q2 = q1; always (posedge clk) q3 = q2; always (posedge clk) q1 = d; endmodule例題總結(jié)四種阻塞賦值設(shè)計方式中有一種可以保證仿真正確四種阻塞賦值設(shè)計方式中有一種可以保證仿真正確四種阻塞賦值設(shè)計方式中有三種可以保證綜合正確四種阻塞賦值設(shè)計方式中有三種可以保證綜合正確四種非阻塞賦值設(shè)

25、計方式全部可以保證仿真正確四種非阻塞賦值設(shè)計方式全部可以保證仿真正確四種非阻塞賦值設(shè)計方式全部可以保證綜合正確四種非阻塞賦值設(shè)計方式全部可以保證綜合正確 雖然在一個雖然在一個alwaysalways塊中正確的安排賦值順序,塊中正確的安排賦值順序,用阻塞賦值也可以實現(xiàn)移位寄存器時序流水線邏用阻塞賦值也可以實現(xiàn)移位寄存器時序流水線邏輯。但是,用非阻塞賦值實現(xiàn)同一時序邏輯要相對輯。但是,用非阻塞賦值實現(xiàn)同一時序邏輯要相對簡單,而且,非阻塞賦值可以保證仿真和綜合的結(jié)簡單,而且,非阻塞賦值可以保證仿真和綜合的結(jié)果都是一致和正確的。果都是一致和正確的。因此建議大家在編寫因此建議大家在編寫VerilogVe

26、rilog時序邏輯時要用非阻塞賦值的方式。時序邏輯時要用非阻塞賦值的方式。 時序反饋移位寄存器建模時序反饋移位寄存器建模 線性反饋移位寄存器(線性反饋移位寄存器(Linear Feedback Shift-Register 簡稱簡稱LFSR)是帶反饋回路的)是帶反饋回路的時序邏輯時序邏輯 。module lfsrb1 (q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; wire n1; assign n1 = q1 q3; always (posedge clk or negedge pre_n) if (!pre_n)

27、 begin q3 = 1b1; q2 = 1b1; q1 = 1b1; end線性反饋移位寄存器RTL級電路思考思考:真正的:真正的LFSR電路圖是什么樣子?電路圖是什么樣子?用阻塞賦值描述的線性反饋移位寄存器,其功能正用阻塞賦值描述的線性反饋移位寄存器,其功能正確,但模型的含義較難理解。確,但模型的含義較難理解。 module lfsrb2 (q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; always (posedge clk or negedge pre_n) if (!pre_n) q3,q2,q1 = 3b

28、111; else q3,q2,q1 = q2,(q1q3),q3; endmodule 把所有賦值弄到一個等式的方式(把所有賦值弄到一個等式的方式(one-line equations)來)來避免使用臨時變量編碼顯得更難于理解尤其當(dāng)涉及的表達避免使用臨時變量編碼顯得更難于理解尤其當(dāng)涉及的表達式更大更長時,編寫代碼和調(diào)試都變得比較困難,因此不式更大更長時,編寫代碼和調(diào)試都變得比較困難,因此不鼓勵使用這種風(fēng)格鼓勵使用這種風(fēng)格 用非阻塞語句描述的LFSR,可綜合,其功能正確。module lfsrb1 (q3, clk, pre_n); output q3; input clk, pre_n; r

29、eg q3, q2, q1; wire n1; assign n1 = q1 q3; always (posedge clk or negedge pre_n) if (!pre_n) begin q3 = 1b1; q2 = 1b1; q1 = 1b1; end else begin q3 = q2; q2 = n1; q1 = q3; endendmoduleRTL級電路 例例 用非阻塞語句描述的用非阻塞語句描述的LFSR,可綜合其功,可綜合其功能正確。能正確。 module lfsrn2 (q3, clk, pre_n); output q3; input clk, pre_n; reg

30、 q3, q2, q1; always (posedge clk or negedge pre_n) if (!pre_n) q3,q2,q1 = 3b111; else q3,q2,q1 = q2,(q1q3),q3; endmodule移位寄存器設(shè)計1 含同步預(yù)置功能的移位寄存器設(shè)計含同步預(yù)置功能的移位寄存器設(shè)計REG86:0=REG87:1;工作時序圖模式可控的移位寄存器設(shè)計2 使用移位操作符設(shè)計移位寄存器使用移位操作符設(shè)計移位寄存器移位寄存器的RTL圖阻塞賦值及一些簡單的例子阻塞賦值及一些簡單的例子 例例13 module dffb (q, d, clk, rst); output q

31、; input d, clk, rst; reg q; always (posedge clk) if (rst) q = 1b0; else q = d;endmodule雖然可行也很簡單,但我們不建議這種用阻塞賦值來描述D觸發(fā)器模型的風(fēng)格。如果要把所有的模塊寫到一個always塊里,是可以采用阻塞賦值得到正確的建模、仿真并綜合成期望的邏輯。但是,這種想法將導(dǎo)致使用阻塞賦值的習(xí)慣,而在較為復(fù)雜的多個always塊的情況下可能會導(dǎo)致競爭冒險 例例14 使用非阻塞賦值來描述使用非阻塞賦值來描述D觸發(fā)器是建觸發(fā)器是建議使用的風(fēng)格議使用的風(fēng)格 module dffx (q, d, clk, rst)

32、; output q; input d, clk, rst; reg q; always (posedge clk) if (rst) q = 1b0; else q = d; endmodule小結(jié) 從上面介紹的移位寄存器的例子以及LFSR的例子,建議使用非阻塞賦值實現(xiàn)時序邏輯。而用非阻塞賦值語句實現(xiàn)鎖存器也是最為安全的 。原則1 :時序電路建模時,用非阻塞賦值。原則2 :鎖存器電路建模時,用非阻塞賦值。 組合邏輯組合邏輯 使用阻塞賦值使用阻塞賦值 用用VerilogVerilog可以有很多種方法為組合邏輯建模,但是可以有很多種方法為組合邏輯建模,但是當(dāng)使用當(dāng)使用alwaysalways塊來

33、為組合邏輯建模時,應(yīng)該使用阻塞塊來為組合邏輯建模時,應(yīng)該使用阻塞賦值(賦值(blocking assignmentblocking assignment)。)。 如果在某個如果在某個alwaysalways塊里面只有一個賦值(表達),塊里面只有一個賦值(表達),使用阻塞或者非阻塞賦值都可以正確工作。但是如果使用阻塞或者非阻塞賦值都可以正確工作。但是如果您對養(yǎng)成好的編碼習(xí)慣有興趣的話,還是要您對養(yǎng)成好的編碼習(xí)慣有興趣的話,還是要“總是用總是用阻塞賦值對組合邏輯建模阻塞賦值對組合邏輯建?!?。 對于簡單的組合對于簡單的組合alwasysalwasys塊不僅可以用于時序邏輯,塊不僅可以用于時序邏輯,也

34、可以用于組合邏輯,但是當(dāng)也可以用于組合邏輯,但是當(dāng)alwaysalways塊中有多個賦值塊中有多個賦值語句時語句時使用了不含延遲(使用了不含延遲(delaydelay)的非阻塞賦值會造)的非阻塞賦值會造成仿真不正確,或者要使仿真正確您需要另外的添加成仿真不正確,或者要使仿真正確您需要另外的添加敏感事件列表(敏感事件列表(sensitivity list entriessensitivity list entries),和),和“多輸入路徑多輸入路徑”(multiple passesmultiple passes)來貫穿)來貫穿always always 塊以使得仿真正確。因而從仿真的時間效率角

35、度看也塊以使得仿真正確。因而從仿真的時間效率角度看也不合算。不合算。例例module ao4 (y, a, b, c, d); output y; input a, b, c, d; reg y, tmp1, tmp2; always (a or b or c or d) begin tmp1 = a & b; tmp2 = c & d; y = tmp1 | tmp2; end endmodule y y輸出建立在輸出建立在3 3個依次執(zhí)行的順序上。由于非阻塞賦值的個依次執(zhí)行的順序上。由于非阻塞賦值的LHSLHS變量值更新是變量值更新是在對在對RHSRHS表達式估值之后,所以

36、表達式估值之后,所以tmp1tmp1和和tmp2tmp2的值仍然是該的值仍然是該alwaysalways塊上一個塊上一個輸入口的值而不是在這一個仿真時間步(輸入口的值而不是在這一個仿真時間步(simulation time stepsimulation time step)結(jié)束)結(jié)束時被更新的值。因此時被更新的值。因此y y的值將受舊的的值將受舊的tmp1tmp1和和tmp2tmp2影響,而不是這次掃描過影響,而不是這次掃描過的的alwaysalways塊內(nèi)被更新的值。塊內(nèi)被更新的值。 例例 module ao5 (y, a, b, c, d); output y; input a, b, c

37、, d; reg y, tmp1, tmp2;5 always (a or b or c or d or tmp1 or tmp2) begin tmp1 = a & b; tmp2 = c & d; y = tmp1 | tmp2; end endmodule 不同之處在于不同之處在于tmp1和和tmp2被添加到事被添加到事件列表中去了,當(dāng)非阻塞賦值更新件列表中去了,當(dāng)非阻塞賦值更新LHS變量時,變量時,always塊將會塊將會“自觸發(fā)自觸發(fā)”并使用并使用最新的最新的tmp1和和tmp2來更新來更新y輸出?,F(xiàn)在輸出。現(xiàn)在y輸出值正確了因為增加使用了兩條輸出值正確了因為增加使用

38、了兩條“登登入路徑入路徑”(two passes)貫穿整個)貫穿整個always塊。使用更多的塊。使用更多的“登入路徑登入路徑”來貫穿來貫穿always塊等于降低仿真器的性能,因此如塊等于降低仿真器的性能,因此如果可以有合理的一些代碼變化可以取代果可以有合理的一些代碼變化可以取代這這 種用法的話,就盡量避免這種用法。種用法的話,就盡量避免這種用法。 例例 使用阻塞賦值實現(xiàn)組合邏輯是推薦使用的編碼使用阻塞賦值實現(xiàn)組合邏輯是推薦使用的編碼風(fēng)格。風(fēng)格。 module ao2 (y, a, b, c, d); output y; input a, b, c, d; reg y, tmp1, tmp2;

39、 always (a or b or c or d) begin tmp1 = a & b; tmp2 = c & d; y= tmp1 | tmp2; end endmodule 小結(jié)原則3 :用always塊描述組合邏輯時,應(yīng)采用阻塞賦值語句 時序和組合的混合邏輯時序和組合的混合邏輯使用非阻塞賦值使用非阻塞賦值有時候?qū)⒑唵蔚慕M合邏輯和時序邏輯寫在一起很方便。當(dāng)把有時候?qū)⒑唵蔚慕M合邏輯和時序邏輯寫在一起很方便。當(dāng)把組合邏輯和時序邏輯寫到一個組合邏輯和時序邏輯寫到一個always塊中時,應(yīng)遵從時序邏塊中時,應(yīng)遵從時序邏輯建模的原則,使用非阻塞賦值,如例所示。輯建模的原則,使用非

40、阻塞賦值,如例所示。例例2 在一個在一個always塊中同時實現(xiàn)組合邏輯和時序邏輯塊中同時實現(xiàn)組合邏輯和時序邏輯 module nbex2 (q, a, b, clk, rst_n); output q; input clk, rst_n; input a, b; reg q; always (posedge clk or negedge rst_n) if (!rst_n) q = 1b0; / 時序邏輯時序邏輯 else q = a b;/ 異或,為組合邏輯異或,為組合邏輯 endmodule例例 將組合和時序邏輯分別寫在兩個將組合和時序邏輯分別寫在兩個alwaysalways塊中,一塊中

41、,一個是純粹的時序邏輯(使用非阻塞賦值),另一個是純粹的個是純粹的時序邏輯(使用非阻塞賦值),另一個是純粹的組合邏輯(使用阻塞賦值)建模組合邏輯(使用阻塞賦值)建模 module nbex1 (q, a, b, clk, rst_n); output q; input clk, rst_n; input a, b; reg q, y; always (a or b) y = a b; always (posedge clk or negedge rst_n) if (!rst_n) q = 1b0; else q = y; endmodule小結(jié) 原則4:在同一個always塊中描述時序和組合

42、邏輯混合電路時,用非阻塞賦值。 其它混合其它混合“阻塞阻塞”與與“非阻塞非阻塞”賦值建模賦值建模方針方針 Verilog語法并沒有禁止將阻塞和非阻塞賦語法并沒有禁止將阻塞和非阻塞賦值自由地組合在一個值自由地組合在一個always塊里。雖然塊里。雖然Verilog語法是允許這種寫法的,但我們不建語法是允許這種寫法的,但我們不建議在可綜合模塊的編寫中采用這種風(fēng)格議在可綜合模塊的編寫中采用這種風(fēng)格 例例24 在在always塊中同時使用阻塞和非阻塞賦值的例子。塊中同時使用阻塞和非阻塞賦值的例子。 module ba_nba2 (q, a, b, clk, rst_n); output q; inpu

43、t a, b, rst_n; input clk; reg q; always (posedge clk or negedge rst_n) begin: ff reg tmp; if (!rst_n) q = 1b0; else begin tmp = a & b; q = tmp; end end endmodule仿真和綜合都將是正確的,因為“阻塞”與“非阻塞”賦值不是針對同一個變量來的。盡管這可以“正常工作”,但是不推薦這種風(fēng)格。 例例 對同一變量既進行阻塞賦值對同一變量既進行阻塞賦值,又進行非阻塞賦值又進行非阻塞賦值有時會產(chǎn)生綜合錯誤。有時會產(chǎn)生綜合錯誤。 module ba

44、_nba6 (q, a, b, clk, rst_n); output q; input a, b, rst_n; input clk; reg q, tmp; always (posedge clk or negedge rst_n) if (!rst_n) q = 1b0; / 對對 q進行阻塞賦值進行阻塞賦值 else begin tmp = a & b; q = tmp; / 對對 q進行非阻塞賦值進行非阻塞賦值 end endmodule小結(jié)原則5:不要在同一個always塊中同時使用阻塞和非阻塞賦值 對同一變量進行多次賦值對同一變量進行多次賦值 在一個以上在一個以上alwa

45、ys塊中對同一個變量進行多塊中對同一個變量進行多次賦值可能會導(dǎo)致競爭冒險,即使使用非阻次賦值可能會導(dǎo)致競爭冒險,即使使用非阻塞賦值也可能產(chǎn)生競爭冒險。在下例中,兩塞賦值也可能產(chǎn)生競爭冒險。在下例中,兩個個always塊都對輸出塊都對輸出q進行賦值。由于兩個進行賦值。由于兩個always塊執(zhí)行的順序是隨機的,所以仿真時塊執(zhí)行的順序是隨機的,所以仿真時會產(chǎn)生競爭冒險會產(chǎn)生競爭冒險 例例25 使用非阻塞賦值語句,由于兩個使用非阻塞賦值語句,由于兩個always塊對同塊對同一變量一變量q賦值產(chǎn)生競爭冒險的程序:賦值產(chǎn)生競爭冒險的程序: module badcode1 (q, d1, d2, clk,

46、rst_n); output q; input d1, d2, clk, rst_n; reg q; always (posedge clk or negedge rst_n) if (!rst_n) q = 1b0; else q = d1; always (posedge clk or negedge rst_n) if (!rst_n) q = 1b0; else q = d2; endmodule在在synplify Pro下綜合,產(chǎn)生錯誤信息下綜合,產(chǎn)生錯誤信息: E: Only one always block may assign a given variable q綜合出現(xiàn)的錯

47、誤小結(jié)原則6:嚴禁在多個always塊中對同一個變量賦值 常見的對于非阻塞賦值的誤解常見的對于非阻塞賦值的誤解 1 非阻塞賦值和非阻塞賦值和$display誤解誤解1: “使用使用$display命令不能用來顯示非阻塞語句命令不能用來顯示非阻塞語句的賦值的賦值”事實是:事實是: 非阻塞語句的賦值在所有的非阻塞語句的賦值在所有的$display命令執(zhí)行命令執(zhí)行以后才更新數(shù)值以后才更新數(shù)值2 #0 延時賦值延時賦值 誤解誤解2: “0延時把賦值強制到仿真時間步的末尾延時把賦值強制到仿真時間步的末尾”事實是:事實是: 0延時將賦值事件強制加入停止運行事件延時將賦值事件強制加入停止運行事件隊列中。隊列

48、中。例例module display_cmds; reg a; initial $monitor($monitor: a = %b, a); initial begin $strobe ($strobe : a = %b, a); a = 0; a = 1; $display ($display: a = %b, a); #1 $finish; end endmodule下面是上面模塊的仿真結(jié)果說明下面是上面模塊的仿真結(jié)果說明$display命令命令的執(zhí)行是安排在活動事件隊列中,但排在非的執(zhí)行是安排在活動事件隊列中,但排在非阻塞賦值數(shù)據(jù)更新事件之前。阻塞賦值數(shù)據(jù)更新事件之前。 $display: a = 0 $monitor: a = 1 $strobe : a = 1 例例28 module nb_schedule1; reg a, b; initial begin a = 0; b = 1; a = b; b = a; $monitor (%0dns: $monitor: a=%b b=%b, $stime, a, b); $display (%0dns: $display: a=%b b=%b, $stime, a, b); $strobe (%0dns: $strobe : a=%b b=%bn, $stime, a, b); #0 $di

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論