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

下載本文檔

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

文檔簡(jiǎn)介

深入理解阻塞和非阻塞賦值的不同,概述,1、阻塞賦值對(duì)應(yīng)的電路往往與觸發(fā)沿沒有關(guān)系,只與輸入電平的變化有關(guān)系。阻塞賦值符號(hào): = 2 非阻塞賦值對(duì)應(yīng)的電路結(jié)構(gòu)往往與觸發(fā)沿有關(guān)系,只有在觸發(fā)沿時(shí)才有可能發(fā)生賦值的情況。非阻塞賦值符號(hào): =,阻塞賦值和非阻塞賦值,阻塞(Blocking)賦值方式 “= ”, 如 b = a; 賦值語句執(zhí)行完后,塊才結(jié)束。 b的值在賦值語句執(zhí)行完后立刻就改變的。 非阻塞(Non_Blocking)賦值方式 “”,如 b = a; 塊結(jié)束后才完成賦值操作。 b的值并不是立刻就改變的。 這是一種比較常用的賦值方法(特別在編寫可綜合時(shí)序模塊時(shí))。,阻塞賦值,阻塞賦值操作符用等號(hào)(即 = )表示。阻塞賦值時(shí)先計(jì)算等 號(hào)右手方向(RHS)部分的值,這時(shí)賦值語句不允許任何別的 語句的干擾,直到現(xiàn)行的賦值完成時(shí)刻,即把RHS賦值給 LHS 的時(shí)刻,它才允許別的賦值語句的執(zhí)行。 一般可綜合的阻塞賦值操作在RHS不能設(shè)定有延遲,(即使 是零延遲也不允許)。若在RHS 加上延遲,則在延遲期間會(huì)阻 止賦值語句的執(zhí)行, 延遲后才執(zhí)行賦值,這種賦值語句是不可 綜合的,在需要綜合的模塊設(shè)計(jì)中不可使用這種風(fēng)格的代碼。 阻塞賦值的執(zhí)行可以認(rèn)為是只有一個(gè)步驟的操作: 所謂阻塞的概念是指在同一個(gè)always塊中,其后面的賦值語 句從概念上(即使不設(shè)定延遲)是在前一句賦值語句結(jié)束后再 開始賦值的。,非阻塞賦值,非阻塞賦值操作符用小于等于號(hào) (即 = )表示。在賦值操 作時(shí)刻開始時(shí)計(jì)算非阻塞賦值符的RHS表達(dá)式,賦值操作時(shí)刻 結(jié)束時(shí)更新LHS。在計(jì)算非阻塞賦值的RHS表達(dá)式和更新LHS期 間,其他的Verilog語句,包括其他的Verilog非阻塞賦值語句 都能同時(shí)計(jì)算RHS表達(dá)式和更新LHS。非阻塞賦值允許其他的 Verilog語句同時(shí)進(jìn)行操作。 非阻塞賦值的操作可以看作為兩個(gè)步驟的過程: 1)在賦值時(shí)刻開始時(shí),計(jì)算非阻塞賦值RHS表達(dá)式。 2)在賦值時(shí)刻結(jié)束時(shí),更新非阻塞賦值LHS表達(dá)式。 非阻塞賦值操作只能用于對(duì)寄存器類型變量進(jìn)行賦值,因此只 能用在“initial”塊和“always”塊等過程塊中。非阻塞賦值不 允許用于連續(xù)賦值。,難點(diǎn),1 何時(shí)使用非阻塞賦值,何時(shí)使用阻塞賦值才能設(shè)計(jì)出符合要求的電路。 2 在可綜合風(fēng)格的Verilog模塊的設(shè)計(jì)中,為什么還要用非阻塞賦值,以及符合IEEE 標(biāo)準(zhǔn)的Verilog 仿真器究竟如何來處理非阻塞賦值的仿真。 本小節(jié)明確地提出可綜合的Verilog模塊編程在使用賦 值操作時(shí)應(yīng)注意的要點(diǎn),按照這些要點(diǎn)來編寫代碼就 可以避免在Verilog 仿真時(shí)出現(xiàn)冒險(xiǎn)和競(jìng)爭(zhēng)的現(xiàn)象,非阻塞賦初值導(dǎo)致錯(cuò)誤,阻塞賦初值正確,綜合后波形對(duì)比,仿真波形對(duì)比,要 點(diǎn),1 在描述組合邏輯的always塊中用阻塞賦值,則綜 合成組合邏輯的電路結(jié)構(gòu)。 2 在描述時(shí)序邏輯的always塊中用非阻塞賦值,則 綜合成時(shí)序邏輯的電路結(jié)構(gòu)。 RHS 方程式右手方向的表達(dá)式或變量可分別縮寫為: RHS表達(dá)式或RHS變量。 LHS 方程式左手方向的表達(dá)式或變量可分別縮寫為: LHS表達(dá)式或LHS變量。,深入理解阻塞的概念,阻塞賦值的執(zhí)行可以認(rèn)為是只有一個(gè)步驟的操作: 計(jì)算RHS并更新LHS,此時(shí)不能允許有來自任何其他Verilog 語句的干擾。 所謂阻塞的概念是指在同一個(gè)always塊中,其后面的賦 值語句從概念上(即使不設(shè)定延遲)是在前一句賦值語句結(jié) 束后再開始賦值的。 如果在一個(gè)過程塊中阻塞賦值的RHS變量正好是另一個(gè)過 程塊中阻塞賦值的LHS變量,這兩個(gè)過程塊又用同一個(gè)時(shí)鐘 沿觸發(fā),這時(shí)阻塞賦值操作會(huì)出現(xiàn)問題,即如果阻塞賦值的 次序安排不好,就會(huì)出現(xiàn)競(jìng)爭(zhēng)。若這兩個(gè)阻塞賦值操作用同 一個(gè)時(shí)鐘沿觸發(fā),則執(zhí)行的次序是無法確定的。,深入理解非阻塞的概念,非阻塞賦值的操作可以看作為兩個(gè)步驟的過程: 1 在賦值時(shí)刻開始時(shí),計(jì)算非阻塞賦值RHS表達(dá)式。 2 在賦值時(shí)刻結(jié)束時(shí),更新非阻塞賦值LHS表達(dá)式。 非阻塞賦值操作只能用于對(duì)寄存器類型變量進(jìn)行 賦值,因此只能用在“initial”塊和“always”塊等過程塊中。非阻塞賦值不允許用于連續(xù)賦值。,阻塞賦值,非阻塞賦值,阻塞賦值,wire din reg a, b, c; always (posedge ck) begin a= din; b=a; c=b; end,非阻塞賦值,wire din reg a, b, c; always (posedge ck) begin a= din; b=a; c=b; end,wire din reg a, b, c; always (posedge ck) begin a= din; b=a; c=b; end,阻塞賦值,非阻塞賦值,wire din reg a, b, c; always (posedge ck) begin a= din; b=a; c=b; end,D,CK,Q,DIN,CK,C,C=DIN;,CK,C,A,B,Verilog模塊編程要點(diǎn),1 時(shí)序電路建模時(shí),用非阻塞賦值。 2 鎖存器電路建模時(shí),用非阻塞賦值。 3 用always塊建立組合邏輯模型時(shí),用阻塞賦值。 4 在同一個(gè)always塊中建立時(shí)序和組合邏輯電路 時(shí),用非阻塞賦值。 5 在同一個(gè)always塊中不要既用非阻塞賦值又用阻 塞賦值。 6 不要在一個(gè)以上的always塊中為同一個(gè)變量賦值。 7 用$strobe系統(tǒng)任務(wù)來顯示用非阻塞賦值的變量值 8 在賦值時(shí)不要使用 #0 延遲,Verilog 的層次化事件隊(duì)列,說明,事件是按照一定的規(guī)則被加入到5 個(gè)區(qū)域中任意一個(gè)區(qū)域的,但是只從其中的“活躍事件”區(qū)域出隊(duì),出隊(duì)之后該事件將會(huì)立刻執(zhí)行。 仿真器首先按照仿真時(shí)間對(duì)事件進(jìn)行排序,然后再在當(dāng)前仿真時(shí)間里按照事件的優(yōu)先級(jí)順序進(jìn)行排序。 活躍事件是優(yōu)先級(jí)最高的事件。在活躍事件之間,它們的執(zhí)行順序是隨機(jī)的。阻塞賦值(=)、連續(xù)賦值Cassign) 以及非阻塞賦值的右式計(jì)算等都屬于活躍事件。 將來仿真時(shí)間里的所有事件都將暫時(shí)存放在將來事件隊(duì)列中。當(dāng)仿真器前進(jìn)到某個(gè)時(shí)刻后,該時(shí)刻的所有事件也會(huì)被分類到當(dāng)前仿真時(shí)間事件隊(duì)列中,而仿真時(shí)刻未到的事件則仍然留在將來事件隊(duì)列中。,自觸發(fā)always塊,例3 使用阻塞賦值的非自觸發(fā)振蕩器 module osc1 (clk); output clk; reg clk; initial #10 clk = 0; always (clk) #10 clk = clk; endmodule,例4 采用非阻塞賦值的自觸發(fā)振蕩器,module osc2 (clk); output clk; reg clk; initial #10 clk = 0; always (clk) #10 clk = clk; Endmodule,移位寄存器模型,下圖表示是一個(gè)簡(jiǎn)單的移位寄存器方框圖。,例5 不正確地使用的阻塞賦值來描述移位寄存器。(方式 #1),module pipeb1 (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的值賦給Q1以后,再執(zhí)行Q2 = Q1;同樣在Q2的值更新以后,才執(zhí)行Q3 = Q2。這樣,最終的計(jì)算結(jié)果就是Q3 = D。即在每一個(gè)clk邊沿,輸入值被無延遲地傳到q3的輸出。這很明顯并沒有建立一個(gè)流水線而只是為一個(gè)寄存器建模-,例6 用阻塞賦值來描述移位寄存器也是可行的,但這種風(fēng)格并不好。(方式 #2 ) module pipeb2 (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; q2 = q1; q1 = d; end endmodule 阻塞賦值被仔細(xì)地安排了次序以使得行為仿真正確。這種建模同樣也可以得到正確的綜合結(jié)果,例7 不好的用阻塞賦值來描述移位時(shí)序邏輯的風(fēng)格(方式 #3) module pipeb3 (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,阻塞賦值”被安排在不同的always塊里面。這樣Verilog標(biāo)準(zhǔn)允許以任意的次序來仿真執(zhí)行3個(gè)always塊-這也許會(huì)使得該流水線仿真結(jié)果產(chǎn)生錯(cuò)誤,因?yàn)檫@產(chǎn)生了Verilog競(jìng)爭(zhēng)條件。由不同的always塊執(zhí)行順序會(huì)產(chǎn)生不同的結(jié)果。盡管這樣,它的綜合結(jié)果將是正確的! 這就意味著綜合前仿真和綜合后仿真不匹配,例8 不好的用阻塞賦值來描述移位時(shí)序邏輯的風(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,顛倒了一下賦值次序,對(duì)實(shí)際仿真次序卻不產(chǎn)生決定作用 ,綜合結(jié)果是對(duì)的,但是仿真結(jié)果也許不正確,例9 正確的用非阻塞賦值來描述時(shí)序邏輯的設(shè)計(jì)風(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,注意,*仿真器首先按照仿真時(shí)間對(duì)事件進(jìn)行排序,然后再在當(dāng)前仿真時(shí)間里按照事件的優(yōu)先級(jí)順序進(jìn)行排序。 *活躍事件是優(yōu)先級(jí)最高的事件。在活躍事件之間,它們的執(zhí)行順序是隨機(jī)的。阻塞賦值(=)、連續(xù)賦值(assign)以及非阻塞賦值的右式計(jì)算等都屬于活躍事件。,例10 正確的用非阻塞賦值來描述時(shí)序邏輯的設(shè)計(jì)風(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; q2 = q1; q1 = d; end endmodule,例11 正確的用非阻塞賦值來描述時(shí)序邏輯的設(shè)計(jì)風(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í)序邏輯的設(shè)計(jì)風(fēng)格 #4 module 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è)計(jì)方式中有一種可以保證仿真正確 四種阻塞賦值設(shè)計(jì)方式中有三種可以保證綜合正確 四種非阻塞賦值設(shè)計(jì)方式全部可以保證仿真正確 四種非阻塞賦值設(shè)計(jì)方式全部可以保證綜合正確 雖然在一個(gè)always塊中正確的安排賦值順序, 用阻塞賦值也可以實(shí)現(xiàn)移位寄存器時(shí)序流水線邏 輯。但是,用非阻塞賦值實(shí)現(xiàn)同一時(shí)序邏輯要相對(duì) 簡(jiǎn)單,而且,非阻塞賦值可以保證仿真和綜合的結(jié) 果都是一致和正確的。因此建議大家在編寫Verilog 時(shí)序邏輯時(shí)要用非阻塞賦值的方式。,時(shí)序反饋移位寄存器建模,線性反饋移位寄存器(Linear Feedback Shift-Register 簡(jiǎn)稱LFSR)是帶反饋回路的 時(shí)序邏輯 。,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) begin q3 = 1b1; q2 = 1b1; q1 = 1b1; end,else begin q3 = q2; q2 = n1; q1 = q3; end endmodule,線性反饋移位寄存器,RTL級(jí)電路,思考:真正的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 = 3b111; else q3,q2,q1 = q2,(q1q3),q3; endmodule 把所有賦值弄到一個(gè)等式的方式(one-line equations)來避免使用臨時(shí)變量編碼顯得更難于理解尤其當(dāng)涉及的表達(dá)式更大更長(zhǎng)時(shí),編寫代碼和調(diào)試都變得比較困難,因此不鼓勵(lì)使用這種風(fēng)格,用非阻塞語句描述的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) begin q3 = 1b1; q2 = 1b1; q1 = 1b1; end,else begin q3 = q2; q2 = n1; q1 = q3; end endmodule,RTL級(jí)電路,例 用非阻塞語句描述的LFSR,可綜合其功能正確。 module lfsrn2 (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 = 3b111; else q3,q2,q1 = q2,(q1q3),q3; endmodule,移位寄存器設(shè)計(jì),1 含同步預(yù)置功能的移位寄存器設(shè)計(jì) REG86:0=REG87:1;,工作時(shí)序圖,模式可控的移位寄存器設(shè)計(jì),2 使用移位操作符設(shè)計(jì)移位寄存器,移位寄存器的RTL圖,阻塞賦值及一些簡(jiǎn)單的例子,例13 module dffb (q, d, clk, rst); output q; input d, clk, rst; reg q; always (posedge clk) if (rst) q = 1b0; else q = d; endmodule,雖然可行也很簡(jiǎn)單,但我們不建議這種用阻塞賦值來描述D觸發(fā)器模型的風(fēng)格。 如果要把所有的模塊寫到一個(gè)always塊里,是可以采用阻塞賦值得到正確的建模、仿真并綜合成期望的邏輯。但是,這種想法將導(dǎo)致使用阻塞賦值的習(xí)慣,而在較為復(fù)雜的多個(gè)always塊的情況下可能會(huì)導(dǎo)致競(jìng)爭(zhēng)冒險(xiǎn),例14 使用非阻塞賦值來描述D觸發(fā)器是建議使用的風(fēng)格 module dffx (q, d, clk, rst); output q; input d, clk, rst; reg q; always (posedge clk) if (rst) q = 1b0; else q = d; endmodule,小結(jié),從上面介紹的移位寄存器的例子以及LFSR 的例子,建議使用非阻塞賦值實(shí)現(xiàn)時(shí)序邏輯。 而用非阻塞賦值語句實(shí)現(xiàn)鎖存器也是最為安全 的 。 原則1 :時(shí)序電路建模時(shí),用非阻塞賦值。 原則2 :鎖存器電路建模時(shí),用非阻塞賦值。,組合邏輯使用阻塞賦值,用Verilog可以有很多種方法為組合邏輯建模,但是當(dāng)使用always塊來為組合邏輯建模時(shí),應(yīng)該使用阻塞賦值(blocking assignment)。 如果在某個(gè)always塊里面只有一個(gè)賦值(表達(dá)),使用阻塞或者非阻塞賦值都可以正確工作。但是如果您對(duì)養(yǎng)成好的編碼習(xí)慣有興趣的話,還是要“總是用阻塞賦值對(duì)組合邏輯建?!薄?對(duì)于簡(jiǎn)單的組合alwasys塊不僅可以用于時(shí)序邏輯,也可以用于組合邏輯,但是當(dāng)always塊中有多個(gè)賦值語句時(shí)使用了不含延遲(delay)的非阻塞賦值會(huì)造成仿真不正確,或者要使仿真正確您需要另外的添加敏感事件列表(sensitivity list entries),和“多輸入路徑”(multiple passes)來貫穿always 塊以使得仿真正確。因而從仿真的時(shí)間效率角度看也不合算。,例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 end endmodule y輸出建立在3個(gè)依次執(zhí)行的順序上。由于非阻塞賦值的LHS變量值更新是 在對(duì)RHS表達(dá)式估值之后,所以tmp1和tmp2的值仍然是該always塊上一個(gè) 輸入口的值而不是在這一個(gè)仿真時(shí)間步(simulation time step)結(jié)束 時(shí)被更新的值。因此y的值將受舊的tmp1和tmp2影響,而不是這次掃描過 的always塊內(nèi)被更新的值。,例 module ao5 (y, a, b, c, d); output y; input a, b, c, d; reg y, tmp1, tmp2;5 always (a or b or c or d or tmp1 or tmp2) begin tmp1 = a end endmodule,不同之處在于tmp1和tmp2被添加到事件列表中去了,當(dāng)非阻塞賦值更新LHS變量時(shí),always塊將會(huì)“自觸發(fā)”并使用最新的tmp1和tmp2來更新y輸出?,F(xiàn)在y輸出值正確了因?yàn)樵黾邮褂昧藘蓷l“登入路徑”(two passes)貫穿整個(gè)always塊。使用更多的“登入路徑”來貫穿always塊等于降低仿真器的性能,因此如果可以有合理的一些代碼變化可以取代這 種用法的話,就盡量避免這種用法。,例 使用阻塞賦值實(shí)現(xiàn)組合邏輯是推薦使用的編碼風(fēng)格。 module ao2 (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 end endmodule,小結(jié),原則3 :用always塊描述組合邏輯時(shí),應(yīng)采 用阻塞賦值語句,時(shí)序和組合的混合邏輯使用非阻塞賦值,有時(shí)候?qū)⒑?jiǎn)單的組合邏輯和時(shí)序邏輯寫在一起很方便。當(dāng)把 組合邏輯和時(shí)序邏輯寫到一個(gè)always塊中時(shí),應(yīng)遵從時(shí)序邏輯建模的原則,使用非阻塞賦值,如例所示。 例2 在一個(gè)always塊中同時(shí)實(shí)現(xiàn)組合邏輯和時(shí)序邏輯 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; / 時(shí)序邏輯 else q = a b;/ 異或,為組合邏輯 endmodule,例 將組合和時(shí)序邏輯分別寫在兩個(gè)always塊中,一 個(gè)是純粹的時(shí)序邏輯(使用非阻塞賦值),另一個(gè)是純粹的組合邏輯(使用阻塞賦值)建模 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:在同一個(gè)always塊中描述時(shí)序和組合邏輯混合電路時(shí),用非阻塞賦值。,其它混合“阻塞”與“非阻塞”賦值建模方針,Verilog語法并沒有禁止將阻塞和非阻塞賦 值自由地組合在一個(gè)always塊里。雖然 Verilog語法是允許這種寫法的,但我們不建 議在可綜合模塊的編寫中采用這種風(fēng)格,例24 在always塊中同時(shí)使用阻塞和非阻塞賦值的例子。 module ba_nba2 (q, a, b, clk, rst_n); output q; input 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 end end endmodule,仿真和綜合都將是正確的,因?yàn)椤白枞迸c“非阻塞”賦值不是針對(duì)同一個(gè)變量來的。盡管這可以“正常工作”,但是不推薦這種風(fēng)格。,例 對(duì)同一變量既進(jìn)行阻塞賦值,又進(jìn)行非阻塞賦值有時(shí)會(huì)產(chǎn)生綜合錯(cuò)誤。 module ba_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; / 對(duì) q進(jìn)行阻塞賦值 else begin tmp = a / 對(duì) q進(jìn)行非阻塞賦值 end endmodule,小結(jié),原則5:不要在同一個(gè)always塊中同時(shí)使用阻塞和非阻塞賦值,對(duì)同一變量進(jìn)行多次賦值,在一個(gè)以上always塊中對(duì)同一個(gè)變量進(jìn)行多 次賦值可能會(huì)導(dǎo)致競(jìng)爭(zhēng)冒險(xiǎn),即使使用非阻 塞賦值也可能產(chǎn)生競(jìng)爭(zhēng)冒險(xiǎn)。在下例中,兩 個(gè)always塊都對(duì)輸出q進(jìn)行賦值。由于兩個(gè) always塊執(zhí)行的順序是隨機(jī)的,所以仿真時(shí) 會(huì)產(chǎn)生競(jìng)爭(zhēng)冒險(xiǎn),例25 使用非阻塞賦值語句,由于兩個(gè)always塊對(duì)同一變量q賦值產(chǎn)生競(jìng)爭(zhēng)冒險(xiǎn)的程序: module badcode1 (q, d1, d2, clk, 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)生錯(cuò)誤信息: E: Only one always block may assign a given variable q,綜合出現(xiàn)的錯(cuò)誤,小結(jié),原則6:嚴(yán)禁在多個(gè)always塊中對(duì)同一個(gè)變量賦值,常見的對(duì)于非阻塞賦值的誤解,1 非阻塞賦值和$display 誤解1: “使用$display命令不能用來顯示非阻塞語句的賦值” 事實(shí)是: 非阻塞語句的賦值在所有的$display命令執(zhí)行以后才更新數(shù)值 2 #0 延時(shí)賦值 誤解2: “0延時(shí)把賦值強(qiáng)制到仿真時(shí)間步的末尾” 事實(shí)是: 0延時(shí)將賦值事件強(qiáng)制加入停止運(yùn)行事件隊(duì)列中。,例 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é)果說明$display命令的執(zhí)行是安排在活動(dòng)事件隊(duì)列中,但排在非阻塞賦值數(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“

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論