數(shù)字系統(tǒng)設(shè)計12-bak_第1頁
數(shù)字系統(tǒng)設(shè)計12-bak_第2頁
數(shù)字系統(tǒng)設(shè)計12-bak_第3頁
數(shù)字系統(tǒng)設(shè)計12-bak_第4頁
數(shù)字系統(tǒng)設(shè)計12-bak_第5頁
已閱讀5頁,還剩78頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PATHPULSE$Specparam可以在specifyblock中使用控制脈沖傳播。脈沖在模塊的輸出上有兩個比通過模塊輸出延遲短的預定跳變。缺省情況下,脈沖會被模擬器濾掉;這意味著只有長于延遲的跳變才會通過模塊傳輸。這種效果叫做慣性延遲。PATHPULSE$可以改變?nèi)笔〉男袨榉绞?。還可以用于指定促使輸出出現(xiàn)x的脈沖寬度范圍。路徑脈沖控制使用PATHPULSE$控制模塊路徑脈沖保持。Syntax:PATHPULSE$=(reject_limit[,error_limit]);PATHPULSE$Input$Output=(reject_limit[,error_limit]);Limit=ConstantMinTypMaxExpression如果errorlimit沒給出,則它與rejectlimit相同。短于rejectlimit的脈沖將不被傳輸?shù)捷敵觥1萺ejectlimit長但是比errorlimit短的脈沖會被當做1‘bX傳輸。比errorlimit長的脈沖則正常傳輸。PATHPULSE$input$outputspecparam優(yōu)先于普通的同一模塊中的PATHPULSE$specparam

起作用。specify(en=>q)=12;(data=>q)=10;(clr,pre*>q)=4;specparamPATHPULSE$=3,PATHPULSE$en$q=(2,9),PATHPULSE$clr$q=1;endspecify

定時校驗任務(wù)定時檢查用于校驗設(shè)計的定時。定時檢查完成以下功能:測定兩個事件之間的共用時間。比較共用時間和指定的時間限制。如果共用時間超指定的時間限制報告時間沖突。(沖突被當作warning報告并不影響模塊輸出。)Verilog執(zhí)行的時間檢查有:建立保持脈沖寬度時鐘周期傾斜恢復定時校驗任務(wù)$hold$nochange$period$recovery$setup$setuphold$skew$width$setup$setup(DataEvent,ReferenceEvent,Limit,[Notifier]);如果(time_of_reference_event-time_of_data_event)<limit則報告時序沖突(timingviolation);系統(tǒng)調(diào)用實例如下:$setup(data,posedge

clk,4);$hold$hold(ReferenceEvent,DataEvent,Limit[,Notifier]);如果(time_of_data_event-time_of_reference_event)<limit,則報數(shù)據(jù)保持時間時序沖突。例如:$hold(posedge

clk,data,3);$setuphold系統(tǒng)任務(wù)$setuphold是$setup和$hold任務(wù)的結(jié)合:$setuphold(ReferenceEvent,DataEvent,SetupLimit,HoldLimit[,Notifier]);實例:$setuphold(posedge

clk,data,4,3);$width$width(ReferenceEvent,Limit[,Threshold[,Notifier]]);則檢查信號的脈沖寬度限制,如果threshold<(time_of_data_event-time_of_reference_event)<limit則報告信號上出現(xiàn)脈沖寬度不夠?qū)挼臅r序錯誤。數(shù)據(jù)事件來源于基準事件:它是帶有相反邊沿的基準事件,例如:$width(negedge

Ck,10,0.3);$period$period(ReferenceEvent,Limit[,Notifier]);檢查信號的周期,若(time_of_data_event-time_of_reference_event)<limit則報告時序錯誤?;鶞适录仨毷沁呇赜|發(fā)事件。數(shù)據(jù)事件來源于基準事件:它是帶有相同邊沿的基準事$skew$skew(ReferenceEvent,DataEvent,Limit[,Notifier]);檢查信號之間(尤其是成組的時鐘控制信號之間)的偏斜(skew)是否滿足要求,若time_of_data_event-time_of_reference_event>limit則報告信號之間出現(xiàn)時序偏斜太大的錯誤。如果data_event的時間等于reference_event的時間,則不報出錯。$recovery$recovery(ReferenceEvent,DataEvent,Limit[,Notifier]);主要檢查時序狀態(tài)元件(觸發(fā)器、鎖存器、RAM和ROM等)的時鐘信號與相應(yīng)的置/復位信號之間的時序約束關(guān)系,若(time_of_data_event-time_of_reference_event)<limit則報告時序沖突。該系統(tǒng)任務(wù)的基準事件必須是邊沿觸發(fā)事件。該系統(tǒng)任務(wù)在執(zhí)行定時校檢前記錄新基準事件時間;因此,如果數(shù)據(jù)事件和基準事件在相同的模擬時間同時發(fā)生,就報告時序沖突錯誤。$nochange$nochange(ReferenceEvent,DataEvent,StartEdgeOffset,EndEdgeOffset[,Notifier]);如果在指定的基準事件區(qū)間發(fā)生數(shù)據(jù)變化,就報告時序沖突錯誤?;鶞适录仨毷沁呇赜|發(fā)事件。例如:$nochange(negedge

Clear,Perset,0,0);如果在Clear為低時Preset發(fā)生變化,將報告時序沖突錯誤。當發(fā)生時序沖突時,系統(tǒng)任務(wù)根據(jù)下列case語句改變自身的值來更新參數(shù)notifier。case(notifier)'bx:notifier='b0;'b0:notifier='b1;'b1:notifier='b0;'bz:notifier='bz;endnotifier參數(shù)可提供關(guān)于時序沖突或傳播x到輸出的時序沖突。使用參數(shù)notifier的例子如下:regNotifyDin;...$setuphold(negedgeClock,Din,tSETUP,tHOLD,NotifyDin);在這一實例中,NotifyDin是參數(shù)notifier。如果時序沖突發(fā)生,寄存參數(shù)NotifyDin根據(jù)前面對參數(shù)notifier描述的case語句改變其值?;鶞适录奶兘槎〞r校驗建立基準時間。基準事件必須是與模塊input或inout相關(guān)的。數(shù)據(jù)事件的跳變發(fā)起時間校驗。數(shù)據(jù)事件必須是與模塊input或inout相關(guān)的。當基準事件和數(shù)據(jù)事件同時發(fā)生無建立沖突報告。而保持沖突會被報告。對于$width脈沖短于threshold(如果給出)將不產(chǎn)生違規(guī)。以下時間校驗基準事件必須是邊沿觸發(fā)狀態(tài):$width,$period,$recovery,$nochange?;鶞适录梢允褂藐P(guān)鍵詞edge,$recovery和$nochange除外,只能使用posedge

和negedge

。有條件定時校驗

(使用

&&&符號)僅當條件為真(1、x、z)時發(fā)生作用。

如果存在Notifier參量則必須是寄存器。當沖突發(fā)生時寄存器值發(fā)生變化。如果它的值是X則變?yōu)?,如果是0則變?yōu)?,如果是1則變?yōu)?。如果是Z則不變。定時校驗系統(tǒng)任務(wù)只能在specifyblock中調(diào)用。對于復雜條件,在specifyblock外描述條件,并且驅(qū)動一個用在specifyblock內(nèi)的,條件信號。regErr,FastClock;//Notifierregistersspecifyspecparam

Tsetup=3.5,Thold=1.5,Trecover=2.0,Tskew=2.0,Tpulse=10.5,Tspike=0.5;$hold(posedge

Clk,Data,Thold);$nochange(posedgeClock,Data,0,0);$period(posedge

Clk,20,FastClock);$recovery(posedge

Clk,Rst,Trecover);$setup(Data,posedge

Clk,Tsetup);$setuphold(posedge

Clk&&&!Reset,Data,Tsetup,Thold,Err);$skew(posedgeClk1,posedgeClk2,Tskew);$width(negedge

Clk,Tpulse,Tspike);endspecify模擬時間函數(shù)下列系統(tǒng)函數(shù)返回模擬時間。$time:返回64位的整型模擬時間給調(diào)用它的模塊,返回值被四舍五入。$stime:返回32位的整型模擬時間。$realtime:向調(diào)用它的模塊返回實型模擬時間。變換函數(shù)下列系統(tǒng)函數(shù)是數(shù)字類型變換的功能函數(shù):$rtoi(real_value):通過截斷小數(shù)值將實數(shù)變換為整數(shù)。$itor(integer_value):將整數(shù)變換為實數(shù)。$realtobits(real_value):將實數(shù)變換為64位的實數(shù)向量表示法(實數(shù)的IEEE745表示法)$bitstoreal(bit_value):將位模式變換為實數(shù)(與$realtobits相反)概率分布函數(shù)函數(shù):$random[(seed)]根據(jù)種子變量(seed)的取值按32位的有符號整數(shù)形式返回一個隨機數(shù)。種子變量(必須是寄存器、整數(shù)或時間寄存器類型)控制函數(shù)的返回值,即不同的種子將產(chǎn)生不同的隨機數(shù)。如果沒有指定種子,每次$random函數(shù)被調(diào)用時根據(jù)缺省種子產(chǎn)生隨機數(shù)。integerSeed,Rnum;wireClk;initialSeed=12;always@(Clk)Rnum=$random(Seed);在Clk的每個邊沿,$random被調(diào)用并返回一個32位有符號整型隨機數(shù)。如果數(shù)字在取值范圍內(nèi),下述模運算符可產(chǎn)生-10~+10之間的數(shù)字。Rnum

=$random(Seed)%11;下面是沒有顯式指定種子的例子。Rnum=$random;//種子變量是可選的。數(shù)字產(chǎn)生的順序是偽隨機排序的,即對于一個初始種子值產(chǎn)生相同的數(shù)字序列。表達式:{random}%11產(chǎn)生0~10之間的一個隨機數(shù)。并置操作符({})將$random函數(shù)返回的有符號整數(shù)變換為無符號數(shù)。$dist_chi_square(Seed,DegreeOfFreedom);$dist_erlang(Seed,K_stage,Mean);愛爾蘭$dist_exponential(Seed,Mean);指數(shù)$dist_normal(Seed,Mean,StandardDeviation);$dist_poisson(Seed,Mean);泊松$dist_t(Seed,DegreeOfFreedom);$dist_uniform(Seed,Start,End);統(tǒng)一所有參數(shù)都必須是整數(shù)禁止語句禁止語句是過程性語句(因此它只能出現(xiàn)在always或initial語句塊內(nèi))。禁止語句能夠在任務(wù)或程序塊沒有執(zhí)行完它的所有語句前終止其執(zhí)行。它能夠用于對硬件中斷和全局復位的建模。其形式如下:disabletask_id;disableblock_id;終止命名的block(begin-end或fork-join)或任務(wù)。命名的blocktask可以用內(nèi)部的disable語句終止自身。當任務(wù)被終止時,以下的內(nèi)容不確定:任何outputs或inouts的值尚未生效的非阻塞性賦值事件持續(xù)賦值和force語句函數(shù)不能被終止。任務(wù)終止其自身不同于任務(wù)返回,輸出不定。disable只有在終止自身的時候才可綜合。建議最好在任務(wù)定義中不要使用disable禁止語句,尤其是當任務(wù)具有一定的返回值時更是如此。這是因為當任務(wù)被禁止時,Verilog語言給出的輸出和輸入?yún)?shù)值是不確定的。如果必須在任務(wù)中這樣做,一種比較穩(wěn)妥的方法是:如果有,就在任務(wù)中禁止順序程序塊。taskExample;output[0:3]Count;begin:LOCAL_BLK//語句10。Count=10;disableExample;

//Count的值不確定。endendtasktaskExample;output[0:3]Count;begin:LOCAL_BLK//語句10。Count=10;disableLOCAL_BLK;//Count的值為10endendtask命名事件Events可以用于描述通訊和行為建模中同步。SyntaxeventName,...;{Declaretheevent}->EventName;{Triggertheevent}Event聲明可以出現(xiàn)在以下位置:module-<HERE>-endmodulebegin:Label-<HERE>-endfork:Label-<HERE>-jointask-<HERE>-endtaskfunction-<HERE>-endfunction命名事件moduleadd_mult(out,a,b);input[2:0]a,b;output[3:0]out;reg[3:0]out;eventadd,mult;//defineeventsalways@(aorb)if(a>b)->add;//triggereventelse->mult;//triggereventalways@(add)//respondtoaneventtriggerout=a+b;always@(mult)//respondtoaneventtriggerout=a*b;endmoduleEvents沒有值或者延遲,是簡單的事件觸發(fā)語句觸發(fā)的事件,并且有邊沿敏感定時控制檢測。命名事件在測試和系統(tǒng)級建模時,同一module中兩個always塊之間或者層次化中不同module之間通訊是很有用的。不可綜合。層次路徑名Verilog

HDl中的標識符具有一個唯一的層次路徑名。層次路徑名通過由句點(.)隔開的名字組成。新層次由以下定義:1)模塊實例化2)任務(wù)定義3)函數(shù)定義4)命名程序塊所有的nets,registers,events,parameters,tasks和functions都可以通過層次名從block外訪問。數(shù)據(jù)不僅可讀,而且可以通過路徑名更新任何層次中的數(shù)據(jù)項的值。較低層模塊能夠通過使用模塊實例名限定變量引用高層(稱為向上引用)或低層(稱為向下引用)模塊。moduleSeparate;parameterP=5;//Separate.PendmodulemoduleTop;regR;//Top.RBottomU1();endmodulemoduleBottom;regR;//Top.U1.RtaskT;//Top.U1.TregR;//Top.U1.T.R;...endtaskinitialbegin:InitialBlockregR;//Top.U1.InitialBlock.R;$display(Bottom.R);//向上引用Top.U1.R$display(U1.R);//向上引用Top.U1.R...endendmodule共享任務(wù)和函數(shù)一種在不同模塊間共享任務(wù)和函數(shù)的方法是在文本文件中編寫共享任務(wù)和函數(shù)的定義,然后使用`include編譯指令在需要的模塊中包含這些定義。另一種可選的方法是在模塊內(nèi)定義共享任務(wù)和函數(shù),然后用層次名在不同的模塊中引用需要的任務(wù)或函數(shù)。share.hfunctionSignedPlus;...endfunctionfunctionSignedMinus;...endfunctiontaskPresetClear;...endtaskmoduleSignedAlu(A,B,Operation,Z);input[0:3]A,B;inputOperation;output[0:3]Z;reg

[0:3]Z;//包含共享函數(shù)的定義。`include“share.h”always@(AorBorOperation)if(Operation)Z=SignedPlus(A,B);elseZ=SignedMinus(A,B);endmodulemoduleShare;functionSignedPlus;...endfunctionfunctionSignedMinus;...endfunctiontaskPresetClear;...endtaskendmodulemoduleSignedAlu2(A,B,Operation,Z);input[0:3]A,B;inputOperation;output[0:3]Z;reg

[0:3]Z;always@(AorBorOperation)if(Operation)Z=Share.SignedPlus

(A,B);elseZ=Share.SignedMinus

(A,B);endmodule值變轉(zhuǎn)儲文件值變轉(zhuǎn)儲(VCD)文件包含設(shè)計中指定變量取值變化的信息。它的主要目的是為其它后處理工具提供信息。Verilog提供了一套系統(tǒng)任務(wù)用于以標準VCD格式記錄信號值的變化。大多數(shù)的波形顯示工具讀取這種格式。$dumpfile(“file.dump”); 為記錄打開一個VCD文件$dumpvars(); 為記錄選擇信號$dumpflush; 刷新所有的VCD數(shù)據(jù)$dumpoff; 停止記錄$dumpon; 再次開始記錄$dumplimit(<file_size>); 限制創(chuàng)建的VCD文件的大小$dumpall; 轉(zhuǎn)儲所有當前指定的變量值VCD文件記錄你的設(shè)計模擬期間所發(fā)生的數(shù)據(jù)信號變化。你可以指定所要記錄的信號。除了$dumpvars其他所有$dump系統(tǒng)任務(wù)都很簡單。必須首先用$dumpfile系統(tǒng)任務(wù)打開一個VCD文件,并且每次模擬只能打開一個。為了看到全部的歷史值,必須在0時刻就探測波形。周期性的刷新磁盤數(shù)據(jù)是一個好方法,這可以避免記錄任何意外的系統(tǒng)錯誤。VCD數(shù)據(jù)庫不記錄模擬結(jié)束時刻,因此如果要波形工具在最后模擬值變化后顯示波形,必須在仿真結(jié)束前用$dumpall(轉(zhuǎn)儲當前值)。$dumpvars[(<levels>,<scope>*)];scope引用信號、實例或?qū)哟位K。Levels是要轉(zhuǎn)儲的指定模塊的層次,0轉(zhuǎn)儲指定的層次和低級的所有實例,1只轉(zhuǎn)儲指定層次。如果沒有參數(shù),設(shè)計中的所有變量都被轉(zhuǎn)儲。.$dumpvars可以多次調(diào)用,但是必須在同一時刻(通常在仿真起始時)。5~12之間計數(shù)的可逆計數(shù)器moduleCountUpDown(Clk,Count,Up_Down);inputClk,Up_Down;output[0:3]Count;reg

[0:3]Count;initialCount=‘d5;always@(posedge

Clk)beginif(Up_Down)beginCount=Count+1;if(Count>12)Count=12;endelsebeginCount=Count-1;if(Count<5)Count=5;endendendmodulemoduleTest;reg

Clock,UpDn;wire[0:3]Cnt_Out;parameterON_DELAY=1, OFF_DELAY=2;CountUpDownC1(Clock,Cnt_Out,UpDn);alwaysbeginClock=1;#ON_DELAY;Clock=0;#OFF_DELAY;endinitialbeginUpDn=0;#50UpDn=1;#100$dumpflush;$stop;//停止模擬。endinitialbegin$dumpfile

(count.dump”);$dumplimit

(4096);$dumpvars

(0,Test;)$dumpvars

(0,Cl.Count,Cl.Clk,C1.Up_Down);endendmoduleVCD文件格式VCD文件是ASCII文件。VCD文件包含如下信息:?文件頭信息:提供日期、模擬器版本和時間標度單位。?節(jié)點信息:定義轉(zhuǎn)儲作用域和變量類型。?取值變化:實際取值隨時間變化。記錄絕對模擬時間。VCD文件實例強度在VerilogHDL中除了指定四個基本值0、1、x和z外,還可以對這些值指定如驅(qū)動強度和電荷強度等屬性。邏輯強度建模是Verilog建模的一個重要部分。

一般只用于元件建模(如FPGA、ASIClibrary開發(fā)工具),電路設(shè)計者必須了解電路的各種可能性。Verilog提供了多個級別的邏輯強度。邏輯強度建模解決信號組合跳變?yōu)橐阎臀粗?,以最大精度描述硬件行為?/p>

邏輯強度建模的幾種情況:集電極開路輸出(pulluprequired)單一節(jié)點的多個三態(tài)驅(qū)動MOS電荷存儲射極耦合邏輯門(ECLGates)驅(qū)動強度驅(qū)動強度可以在如下情況中指定:1)在線網(wǎng)說明中帶賦值的線網(wǎng)。2)原語門實例中的輸出端口。3)在連續(xù)賦值語句中。驅(qū)動強度定義有兩個值:一個是線網(wǎng)被賦值為1時的強度值;另一個是線網(wǎng)被賦值為0時的強度值。形式如下:(strength_for_1,strength_for_0)對于值1的賦值,允許如下的信號驅(qū)動強度:?supply1?strong1?pull1?weak1?highz1(禁止對門級原語使用)對于值0的賦值,允許如下的信號驅(qū)動強度:?supply0?strong0?pull0?weak0?highz0(禁止對門級原語使用)缺省的信號驅(qū)動強度定義為(strong0,strong1)。線網(wǎng)的強度:wire(pull1,weak0)#(2,4)Lrk=Pol&&Ord;信號的驅(qū)動強度定義僅適用于標量類型的信號,如:wire、wand、wor

、tri、triand、trior、trireg、tri0和tri1。門級原語輸出端口的驅(qū)動強度定義:nand

(pull1,strong0)#(3:4:4)A1(Mout,MinA,MinB,MinC);信號驅(qū)動強度僅適用于定義下列門級原語的外部端口:and、or、xor、na

溫馨提示

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

評論

0/150

提交評論