Verilog中的延時、阻塞與非阻塞賦值仿真_第1頁
Verilog中的延時、阻塞與非阻塞賦值仿真_第2頁
Verilog中的延時、阻塞與非阻塞賦值仿真_第3頁
Verilog中的延時、阻塞與非阻塞賦值仿真_第4頁
Verilog中的延時、阻塞與非阻塞賦值仿真_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

從仿真語義的角度看Verilog中的延

時、阻塞與非阻塞賦值#/12達式置于等號右邊。阻塞賦值可以很好的建模電路中的數(shù)據(jù)流,請考慮清單6中的代碼片斷。清單6組合邏輯的阻塞賦值regtemp1,temp2;always@(XorYorCIN)begintempi=X八Y;temp2=temp1&CIN;SUM=tempi八CIN;COUT=temp2|(X&Y);End清單6是一個全加器的描述,其中所有的賦值語句都是阻塞賦值,特點是:等號“=”右邊表達式的結(jié)果計算和將計算結(jié)果賦值給左邊變量的操作,是一個統(tǒng)一、連續(xù)的過程,不允許在其中插入其他動作;阻塞賦值語句會阻塞其后代碼中語句的執(zhí)行,也就是說Verilog仿真器在完成一句阻塞賦值語句前,不會響應(yīng)其他事件。由此可見清單6中各語句的意義是:首先將X異或Y的結(jié)果賦值給tempi,接著執(zhí)行第二條語句將tempi和CIN相與的結(jié)果賦值給temp2,并最終計算出SUM和COUT。很好的反映了組合邏輯中的數(shù)據(jù)流動順序。如果將這里的阻塞賦值替換為非阻塞賦值,如清單7所示。清單7組合邏輯的非阻塞賦值iregtempi,temp2;always@(XorYorCIN)begintempi<=X八Y;temp2<=tempi&CIN;SUM<=tempi八CIN;COUT<=temp2|(X&Y);endVerilog中使用小于等號“<=”來表示非阻塞賦值,被賦值的變量放在等號的左邊,計算賦值的表達式置于等號的右邊。與阻塞賦值不同,非阻塞賦值不能反映電路的數(shù)據(jù)流。因為在Verilog仿真語義中規(guī)定:非阻塞賦值對于左邊賦值變量的更新操作的優(yōu)先級要低于阻塞賦值,也要低于非阻塞賦值本身等號右邊的表達式計算,需要等到當(dāng)前仿真周期結(jié)束時才被執(zhí)行。所謂的當(dāng)前仿真周期結(jié)束,指的是某一時刻的所有仿真事件全部完成。在清單7中,某時刻當(dāng)敏感事件表中的信號發(fā)生變化導(dǎo)致always進程啟動,進程中的賦值語句在該時刻被依次執(zhí)行。由于非阻塞賦值的特點,X異或Y首先計算,但是所得的結(jié)果并不會立刻賦值給temp1,所以第二句中引用的是temp1的原值,不是第一句中X與上Y的結(jié)果。同樣,第二句中temp1和CIN相與的結(jié)果也不會立刻用于更新temp2。所有的左側(cè)變量在該仿真時刻的事件執(zhí)行完畢,也就是5條賦值語句的右側(cè)表達式全部計算完畢后才被更新。這顯然不是我們所期望的邏輯結(jié)果,不過可以通過將中間變量temp1和temp2放入always語句的敏感事件表中來解決這個問題,如清單7所示。這樣在每次temp1或temp2發(fā)生變化的時候,always語句都會重新啟動,從而將temp1和temp2的更新代入計算得到正確的SUM和COUT。清單8組合邏輯的非阻塞賦值2regtempi,temp2;always@(XorYorCINortemp1ortemp2)begintempi<=X八Y;temp2<=temp1&CIN;SUM<=tempi八CIN;COUT<=temp2|(X&Y);end通過上面的示例可以看出,非阻塞賦值不能反映組合邏輯中的數(shù)據(jù)流,除非將所有的中間變量都列入敏感事件表中。所以建議在對組合邏輯建模時采用阻塞賦值。時序邏輯時序邏輯中也存在變量更新與讀取的沖突和順序問題,當(dāng)更新與讀取分別在兩個always進程中時,請考慮清單9中的代碼片斷。清單9雙進程阻塞更新always@(posedgeCLK)//進程Abegintemp=X八Y;endalways@(posedgeCLK)//進程BbeginXxorY=temp;End從仿真語義的角度來看,這兩個always進程置于相同時鐘CLK的控制下,進程A更新寄存器變量temp的值,進程B讀取temp的值。當(dāng)CLK的上升沿到來時兩個進程被同時啟動,習(xí)慣性的誤認(rèn)為:由于語句的先后順序,進程A中的阻塞賦值首先執(zhí)行。當(dāng)X異或Y賦值給temp后,才會執(zhí)行進程B中的讀取語句,最后XxorY得到X異或Y的結(jié)果(D觸發(fā)器)。但是如果進程A和進程B的順序顛倒過來,讀取便會阻塞更新,XxorY得到的就不是該時鐘上升沿時刻X異或Y的結(jié)果,而是上一周期temp的原值(2位移位寄存器)。實際上,在Verilog的仿真語義中,always進程的執(zhí)行順序僅僅和敏感事件表相關(guān),并不取決于代碼的先后順序。在CLK上升沿的控制下,進程A和進程B同時啟動,temp的更新與讀取操作都作為當(dāng)前仿真時刻的事件被列入事件隊列。由于他們同為阻塞賦值,所以擁有相同的優(yōu)先級,仿真器的執(zhí)行順序是隨機的,有的仿真器會按照代碼的先后順序執(zhí)行,有的則會按照隨機順序執(zhí)行。這種仿真語義的不確定性會帶來綜合結(jié)果的不確定性,目前業(yè)界還沒有Verilog的綜合標(biāo)準(zhǔn),綜合的結(jié)果取決于綜合工具對于仿真語義的理解。雖然對于清單9中的代碼,似乎任何一種執(zhí)行順序都有一種仿真語義與之對應(yīng),但是設(shè)計者撰寫這段代碼所希望得到的硬件結(jié)構(gòu)確是一定的:希望以temp作為中間變量,用CLK時鐘將X異或Y的結(jié)果同步后再打一拍賦值給XxorY,硬件電路相當(dāng)于兩個D觸發(fā)器的串聯(lián),可以看作是一個2位的移位寄存器,如圖9所示。

圖9圖9希望得到的硬件電路從硬件結(jié)構(gòu)中可以看出,必須保證中間變量temp先被讀取再被賦值。這種保證在實際的電路中是通過觸發(fā)器的建立延時來實現(xiàn)的,即當(dāng)CLK同步變化時,雖然兩個D觸發(fā)器被同時啟動,但是由于輸入到輸出的信號建立需要一定的時間,所以觸發(fā)器XxorY得到的是觸發(fā)器temp輸出的原值,從而使XxorY在兩個周期后得到X異或Y的結(jié)果。在仿真語義中需要顯式的表明這種順序可以對temp使用非阻塞賦值。非阻塞賦值的優(yōu)先級較阻塞賦值低,temp的更新會被安排到仿真時刻的所有事件完成后執(zhí)行。無論語句的先后順序如何,作為阻塞賦值的temp讀取事件都會先于temp的更新事件執(zhí)行,保持了仿真語義與綜合結(jié)果的一致性。因此,建議當(dāng)對變量的賦值與讀取不在同一個always進程時,使用非阻塞賦值對該變量賦值,如清單10所示。清單10雙進程非阻塞更新always@(posedgeCLK)//進程Abegintemp<=X八Y;endalways@(posedgeCLK)//進程BbeginXxorY=temp;End仿真語義是有順序的,即使多個事件可能都包含在同一個的仿真時刻下。這是因為硬件電路是并行的,同一時刻可能有多個事件發(fā)生,但是仿真工具一般都是運行在通用計算機上的軟件程序,CPU的處理機制是順序的??梢哉J(rèn)為仿真語義是為了平衡并行的硬件電路與順序的仿真工具之間的一種橋梁。綜合結(jié)果是綜合軟件對仿真語義的理解,但是并不局限于仿真語義。實際的綜合工具會根據(jù)更多的元素來進行綜合,比如SynplifyPro對于清單8和9中的代碼均可綜合出正確的結(jié)果,但是有些綜合工具對于7中的描述,就會將中間變量temp當(dāng)作是冗余邏輯而優(yōu)化掉(XxorY在一個時鐘周期內(nèi)就得到了X異或Y的值)。如果對變量的賦值與讀取都出現(xiàn)在同一個時鐘控制的always進程中,可以認(rèn)為這是在一個時鐘節(jié)拍內(nèi)的組合邏輯塊,示例代碼如清單11所示。清單11單進程變量更新always@(posedgeCLK)begintempalways@(posedgeCLK)begintemp=X八Y;//阻塞賦值if(~temp)XequalY<=1'b1;ElseXequalY<=1'b0;Endalways@(posedgeCLK)begintemp<=X八Y;//非阻塞賦值if(~temp)XequalY<=1'b0;if(~temp)XequalY<=1'b0;XequalY<=1'b1;ElseEnd建議對組合邏輯采用阻塞賦值,對時序邏輯采用非阻塞賦值的目的是為了避免Verilog仿真模型與最終綜合結(jié)果的不一致。但是這并不是一條規(guī)定,只要能夠理解阻塞賦值與非阻塞賦值之間的語義差別,在很多情況下靈活的運用它們往往能夠得到意想不到的結(jié)果。阻塞賦值與非阻塞賦值的總結(jié)以下是就使用“阻塞賦值”或“非阻塞賦值”的一個概括和總結(jié):當(dāng)為時序邏輯建模時,使用“非阻塞賦值”;當(dāng)為鎖存器(latch)建模時,使

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論