




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第五章
仿真驗(yàn)證與Testbench編寫11/26/20221MicroelectronicsSchoolXidianUniversity第五章仿真驗(yàn)證與Testbench編寫11/26/2025.1VerilogHDL電路仿真和驗(yàn)證概述仿真,也叫模擬,是通過(guò)使用EDA仿真工具,通過(guò)輸入測(cè)試信號(hào),比對(duì)輸出信號(hào)(波形、文本或者VCD文件)和期望值,來(lái)確認(rèn)是否得到與期望所一致的正確的設(shè)計(jì)結(jié)果,驗(yàn)證設(shè)計(jì)的正確性。驗(yàn)證是一個(gè)證明設(shè)計(jì)思路如何實(shí)現(xiàn),保證設(shè)計(jì)在功能上正確的一個(gè)過(guò)程。驗(yàn)證在VerilogHDL設(shè)計(jì)的整個(gè)流程中分為4個(gè)階段:階段1:功能驗(yàn)證;階段2:綜合后驗(yàn)證;階段3:時(shí)序驗(yàn)證;階段4:板級(jí)驗(yàn)證。11/26/20222MicroelectronicsSchoolXidianUniversity5.1VerilogHDL電路仿真和驗(yàn)證概述5.2VerilogHDL測(cè)試程序設(shè)計(jì)基礎(chǔ)5.2.1Testbench及其結(jié)構(gòu)在仿真的時(shí)候Testbench用來(lái)產(chǎn)生測(cè)試激勵(lì)給待驗(yàn)證設(shè)計(jì)(DesignUnderVerification,DUV),或者稱為待測(cè)設(shè)計(jì)(DesignUnderTest,DUT)。
Testbench平臺(tái)結(jié)構(gòu)5.2VerilogHDL測(cè)試程序設(shè)計(jì)基礎(chǔ)5.2.1T測(cè)試程序的一般結(jié)構(gòu)
由于Testbench是一個(gè)測(cè)試平臺(tái),信號(hào)集成在模塊內(nèi)部,沒有輸入輸出。
在Testbench模塊內(nèi),例化待測(cè)設(shè)計(jì)的頂層模塊,并把測(cè)試行為的代碼封裝在內(nèi),直接對(duì)待測(cè)系統(tǒng)提供測(cè)試激勵(lì)。
例5.2-1T觸發(fā)器測(cè)試程序示例moduleTflipflop_tb;//數(shù)據(jù)類型聲明regclk,rst_n,T;wiredata_out;TFFU1(.data_out(data_out),.T(T),.clk(clk),.rst_n(rst_n));//對(duì)被測(cè)模塊實(shí)例化always//產(chǎn)生測(cè)試激勵(lì)#5clk=~clk;Initialbeginclk=0;#3rst_n=0;#5rst_n=1;T=1;#30T=0;#20T=1;endInitial//對(duì)輸出響應(yīng)進(jìn)行收集begin$monitor($time,"T=%b,clk=%b,rst_n=%b,data_out=%b",T,clk,rst_n,data_out);endendmodule例5.2-1T觸發(fā)器測(cè)試程序示例T觸發(fā)器的仿真波形和部分文本輸出結(jié)果
:部分文本輸出結(jié)果:0T=x,clk=0,rst_n=x,data_out=x3T=x,clk=0,rst_n=0,data_out=05T=x,clk=1,rst_n=0,data_out=08T=1,clk=1,rst_n=1,data_out=110T=1,clk=0,rst_n=1,data_out=1T觸發(fā)器的仿真波形和部分文本輸出結(jié)果:部分文本輸出結(jié)果:從圖中可以清晰地看出Testbench的主要功能:(1)為DUT提供激勵(lì)信號(hào)。(2)正確實(shí)例化DUT。(3)將仿真數(shù)據(jù)顯示在終端或者存為文件,也可以顯示在波形窗口中以供分析檢查。(4)復(fù)雜設(shè)計(jì)可以使用EDA工具,或者通過(guò)用戶接口自動(dòng)比較仿真結(jié)果與理想值,實(shí)現(xiàn)結(jié)果的自動(dòng)檢查。從圖中可以清晰地看出Testbench的主要功能:在編寫Testbench時(shí)需要注意的問(wèn)題
:(1)testbench代碼不需要可綜合Testbench代碼只是硬件行為描述不是硬件設(shè)計(jì)。(2)行為級(jí)描述效率高VerilogHDL語(yǔ)言具備5個(gè)描述層次,分別為開關(guān)級(jí)、門級(jí)、RTL級(jí)、算法級(jí)和系統(tǒng)級(jí)。(3)掌握結(jié)構(gòu)化、程式化的描述方式結(jié)構(gòu)化的描述有利于設(shè)計(jì)維護(hù),可通過(guò)initial、always以及assign語(yǔ)句將不同的測(cè)試激勵(lì)劃分開來(lái)。一般不要將所有的測(cè)試都放在一個(gè)語(yǔ)句塊中。在編寫Testbench時(shí)需要注意的問(wèn)題:5.2.2測(cè)試平臺(tái)舉例DUT的仿真平臺(tái)
測(cè)試平臺(tái)需要產(chǎn)生時(shí)鐘信號(hào)、復(fù)位信號(hào)和一系列的仿真向量,觀察DUT的響應(yīng),確認(rèn)仿真結(jié)果。5.2.2測(cè)試平臺(tái)舉例DUT的仿真平臺(tái)測(cè)試平臺(tái)需要產(chǎn)生時(shí)鐘(1)組合邏輯電路仿真環(huán)境的搭建moduleadder1(a,b,ci,so,co);inputa,b,ci;outputso,co;
assign{co,so}=a+b+ci;endmodule根據(jù)全加器的真值表(表5.2-1)編寫的全加器測(cè)試程序如下:moduleadder1_tb;wireso,co;rega,b,ci;adder1U1(a,b,ci,so,co); //模塊例化
initial //測(cè)試信號(hào)產(chǎn)生
begina=0;b=0;ci=0;#20a=0;b=0;ci=1;#20a=0;b=1;ci=0;#20a=0;b=1;ci=1;#20a=1;b=0;ci=0;#20a=1;b=0;ci=1;#20a=1;b=1;ci=0;#20a=1;b=1;ci=1;#200$finish;endendmodule(1)組合邏輯電路仿真環(huán)境的搭建moduleadder1(全加器的輸入a、b和ci定義為reg型變量;把輸出so和co定義為wire型變量用模塊例化語(yǔ)句“adder1U1(a,b,ci,so,co);”把全加器設(shè)計(jì)電路例化到測(cè)試仿真環(huán)境中;用initial塊語(yǔ)句改變輸入的變化并生成測(cè)試條件,輸入的變化語(yǔ)句完全根據(jù)全加器的真值表編寫仿真結(jié)果:全加器的輸入a、b和ci定義為reg型變量;把輸出so和co(2)時(shí)序邏輯電路仿真環(huán)境的搭建在于時(shí)序邏輯電路仿真環(huán)境中,需要考慮時(shí)序、定時(shí)信息和全局復(fù)位、置位等信號(hào)要求,并定義這些信號(hào)。用VerilogHDL編寫的十進(jìn)制加法計(jì)數(shù)器源程序代碼是:modulecnt10(clk,rst,ena,q,cout);inputclk,rst,ena;output[3:0]q;outputcout;reg[3:0]q;always@(posedgeclkorposedgerst)beginif(rst)q=4'b0000;elseif(ena)beginif(q<9)q=q+1;elseq=0;endendassigncout=q[3]&q[0];endmoduleVerilogHDL測(cè)試程序代碼是:modulecnt10_tb;regclk,rst,ena;wire[3:0]q;wirecout;cnt10U1(clk,rst,ena,q,cout);//模塊實(shí)例化
always#50clk=~clk; //時(shí)鐘信號(hào)產(chǎn)生
initialbeginclk=0;rst=0;ena=1; //控制信號(hào)產(chǎn)生
#1200rst=1;#120rst=0;#2000ena=0;#200ena=1;#20000$finish;endendmodule(2)時(shí)序邏輯電路仿真環(huán)境的搭建在于時(shí)序邏輯電路仿真環(huán)境中,實(shí)例化語(yǔ)句“cnt10U1(clk,rst,ena,q,cout);”把十進(jìn)制計(jì)數(shù)模塊例化到仿真環(huán)境中;在always中用語(yǔ)句“#50clk=~clk;”產(chǎn)生周期為100(標(biāo)準(zhǔn)時(shí)間單位)的時(shí)鐘方波;用initial塊生成復(fù)位信號(hào)rst和使能控制信號(hào)ena的測(cè)試條件。測(cè)試結(jié)果如圖:實(shí)例化語(yǔ)句“cnt10U1(clk,rst,ena,q,c5.2.3VerilogHDL仿真結(jié)果確認(rèn)(1)直接觀察波形通過(guò)直接觀察各信號(hào)波形的輸出,比較測(cè)試值和期望值的大小,來(lái)確定仿真結(jié)果的正確性。5.2.3VerilogHDL仿真結(jié)果確認(rèn)(1)直接觀察(2)打印文本輸出法moduleadder1_tb;wireso,co;rega,b,ci;adder1U1(a,b,ci,so,co);//模塊例化
initial//測(cè)試信號(hào)產(chǎn)生
begina=0;b=0;ci=0;#20a=0;b=0;ci=1;#20a=0;b=1;ci=0;#20a=0;b=1;ci=1;#20a=1;b=0;ci=0;#20a=1;b=0;ci=1;#20a=1;b=1;ci=0;#20a=1;b=1;ci=1;#200$finish;end$monitor($time,"%b%b%b->%b%b",a,b,ci,so,co);endmodule其輸出的結(jié)果是:0000->0020001->1040010->1060011->0180100->10系統(tǒng)任務(wù)打印任務(wù):$display,直接輸出到標(biāo)準(zhǔn)輸出設(shè)備;$monitor,監(jiān)控參數(shù)的變化;$fdisplay,輸出到文件等(2)打印文本輸出法moduleadder1_tb;其輸出(3)自動(dòng)檢查仿真結(jié)果自動(dòng)檢查仿真結(jié)果是通過(guò)在設(shè)計(jì)代碼中的關(guān)鍵節(jié)點(diǎn)添加斷言監(jiān)控器,形成對(duì)電路邏輯綜合的注釋或是對(duì)設(shè)計(jì)特點(diǎn)的說(shuō)明,以提高設(shè)計(jì)模塊的觀察性。(4)使用VCD文件VerilogHDL提供一系列系統(tǒng)任務(wù)用于記錄信號(hào)值變化保存到標(biāo)準(zhǔn)的VCD(ValueChangeDump)格式數(shù)據(jù)庫(kù)中。VCD文件是一種標(biāo)準(zhǔn)格式的波形記錄文件,只記錄發(fā)生變化的波形。VCD文件將在第5.3.7小節(jié)中詳細(xì)講述。(3)自動(dòng)檢查仿真結(jié)果5.2.4VerilogHDL仿真效率因?yàn)橐ㄟ^(guò)串行軟件代碼完成并行語(yǔ)義的轉(zhuǎn)化,VerilogHDL行為級(jí)仿真代碼的執(zhí)行時(shí)間比較長(zhǎng)。提高VerilogHDL代碼的仿真代碼執(zhí)行時(shí)間:(1)減小層次結(jié)構(gòu)仿真代碼的層次越少,執(zhí)行時(shí)間就越短。(2)減少門級(jí)代碼的使用由于門級(jí)建模屬于結(jié)構(gòu)級(jí)建模,建議仿真代碼盡量使用行為級(jí)語(yǔ)句,建模層次越抽象,執(zhí)行時(shí)間就越短。5.2.4VerilogHDL仿真效率因?yàn)橐ㄟ^(guò)串行軟件(3)仿真精度越高,效率越低計(jì)時(shí)單位值與計(jì)時(shí)精度值的差距越大,則模擬時(shí)間越長(zhǎng)。`timescale仿真時(shí)間標(biāo)度將在第5.9.3小節(jié)中詳細(xì)講述。(4)進(jìn)程越少,效率越高代碼中的語(yǔ)句塊越少仿真越快,這是因?yàn)榉抡嫫髟诓煌M(jìn)程之間進(jìn)行切換也需要時(shí)間。(5)減少仿真器的輸出顯示VerilogHDL語(yǔ)言包含一些系統(tǒng)任務(wù),可以在仿真器的控制臺(tái)顯示窗口輸出一些提示信息,但會(huì)降低仿真器的執(zhí)行效率。(3)仿真精度越高,效率越低5.3與仿真相關(guān)的系統(tǒng)任務(wù)5.3.1$display和$write語(yǔ)法格式如下:$display(“<format_specifiers>”,<signal1,signal2,...,signaln>);$write(“<format_specifiers>”,<signal1,signal2,...,signaln>);“<format_specifiers>”通常稱為“格式控制”“<signal1,signal2,……,signaln>”則為“信號(hào)輸出列表”$display自動(dòng)地在輸出后進(jìn)行換行$write輸出特定信息時(shí)不自動(dòng)換行5.3與仿真相關(guān)的系統(tǒng)任務(wù)5.3.1$display和$w輸出格式說(shuō)明,由“%”和格式字符組成,其作用是將輸出的數(shù)據(jù)轉(zhuǎn)換成指定的格式輸出。
常用的幾種輸出格式如右表。輸出格式說(shuō)明%h或%H以十六進(jìn)制數(shù)的形式輸出%d或%D以十進(jìn)制數(shù)的形式輸出%o或%O以八進(jìn)制數(shù)的形式輸出%b或%B以二進(jìn)制數(shù)的形式輸出%c或%C以ASCII碼字符的形式輸出%v或%V輸出網(wǎng)絡(luò)型數(shù)據(jù)信號(hào)強(qiáng)度%m或%M輸出等級(jí)層次的名字%s或%S以字符串的形式輸出%t或%T以當(dāng)前的時(shí)間格式輸出%e或%E以指數(shù)的形式輸出實(shí)型數(shù)%f或%F以十進(jìn)制數(shù)的形式輸出實(shí)型數(shù)%g或%G以指數(shù)或十進(jìn)制數(shù)的形式輸出實(shí)型數(shù)輸出格式說(shuō)明,由“%”和格式字符組成,其作用是將輸出的數(shù)據(jù)轉(zhuǎn)一些特殊的字符可以通過(guò)表中的轉(zhuǎn)換序列來(lái)輸出。換碼序列功能\n換行\(zhòng)t橫向跳格(即跳到下一個(gè)輸出區(qū))\\反斜杠字符\\"雙引號(hào)字符"\o1到3位八進(jìn)制數(shù)代表的字符%%百分符號(hào)%一些特殊的字符可以通過(guò)表中的轉(zhuǎn)換序列來(lái)輸出。換碼序列功能\n例5.3-1:$display和$write語(yǔ)句
moduledisp_tb;reg[31:0]rval;pulldown(pd);initialbeginrval=101;$display("\\\t%%\n\"\123");$display("rval=%hhex%ddecimal",rval,rval);$display("rval=%ootal%bbinary",rval,rval);$display("rvalhas%casciicharactervalue",rval);$display("pdstrengthvalueis%v",pd);$display("currentscopeis%m");$display("%sisasciivaluefor101",101);$write(“simulationtimeis”);$write(“%t\n”,$time);endendmodule其輸出結(jié)果為:\%"Srval=00000065hex101decimalrval=00000000145octal00000000000000000000000001100101binaryrvalhaseasciicharactervaluepdstrengthvalueisStXcurrentscopeisdispeisasciivaluefor101simulationtimeis0在$display中,輸出列表中數(shù)據(jù)的顯示寬度是自動(dòng)按照輸出格式進(jìn)行調(diào)整的,總是用表達(dá)式的最大可能值所占的位數(shù)來(lái)顯示表達(dá)式的當(dāng)前值。例5.3-1:$display和$write語(yǔ)句modul5.3.2$monitor和$strobe$monitor與$stobe都提供了監(jiān)控和輸出參數(shù)列表中字符或變量的值的功能(1)$monitor語(yǔ)法格式:$monitor(<“format_specifiers>”,<signal1,signal2,...,signaln>);任務(wù)$monitor提供了監(jiān)控和輸出參數(shù)列表中的表達(dá)式或變量值的功能。每當(dāng)參數(shù)列表中變量或表達(dá)式的值發(fā)生變化時(shí),整個(gè)參數(shù)列表中變量或表達(dá)式的值都將輸出顯示。
例如:$monitor($time,,"rxd=%btxd=%b",rxd,txd);注意在上面的語(yǔ)句中,“,,"代表一個(gè)空參數(shù)??諈?shù)在輸出時(shí)顯示為空格。
5.3.2$monitor和$strobe$monitor$monitoron和$monitoroff任務(wù)的作用是通過(guò)打開和關(guān)閉監(jiān)控標(biāo)志來(lái)控制監(jiān)控任務(wù)$monitor的啟動(dòng)和停止,這樣使得程序員可以很容易的控制$monitor何時(shí)發(fā)生。$monitor與$display的不同處在于$monitor往往在initial塊中調(diào)用,只要不調(diào)用$monitoroff,$monitor便不間斷地對(duì)所設(shè)定的信號(hào)進(jìn)行監(jiān)視。例5.3-2:$monitor系統(tǒng)任務(wù)的應(yīng)用實(shí)例modulemonitor_tb;integera,b;initialbegina=2;b=4;foreverbegin#5a=a+b;#5b=a-1;endend
initial#40$finish;
initial$monitor($time,"a=%d,b=%d",a,b);endmodule輸出結(jié)果為:0a=2,b=45a=6,b=410a=6,b=515a=11,b=520a=11,b=1025a=21,b=1030a=21,b=2035a=41,b=20$monitoron和$monitoroff任務(wù)的作用是通過(guò)(2)$strobe語(yǔ)法格式:$strobe(<functions_or_signals>);$strobe(“<string_and/or_variables>”,<functions_or_signals>);
探測(cè)任務(wù)用于在某時(shí)刻所有時(shí)間處理完后,在這個(gè)時(shí)間步的結(jié)尾輸出一行格式化的文本。常用的系統(tǒng)任務(wù)如下:$strobe:在所有時(shí)間處理完后,以十進(jìn)制格式輸出一行格式化的文本;$strobeb:在所有時(shí)間處理完后,以二進(jìn)制格式輸出一行格式化的文本;$strobeo:在所有時(shí)間處理完后,以八進(jìn)制格式輸出一行格式化的文本;$strobeh:在所有時(shí)間處理完后,以十六進(jìn)制格式輸出一行格式化的文本。(2)$strobe語(yǔ)法格式:$strobe任務(wù)在被調(diào)用的時(shí)刻所有的賦值語(yǔ)句都完成了,才輸出相應(yīng)的文字信息。$strobe任務(wù)提供了另一種數(shù)據(jù)顯示機(jī)制,可以保證數(shù)據(jù)只在所有賦值語(yǔ)句被執(zhí)行完畢后才被顯示。例5.3-3:$strobe系統(tǒng)任務(wù)的應(yīng)用實(shí)例modulestrobe_tb;rega,b;initialbegina=0;$display(“abydisplayis:”,a);$strobe(“abystrobeis:”,a);a=1;endinitialbeginb<=0;$display(“bbydisplayis:”,b);$strobe(“bbystrobeis:”,b);
#5;$display(“#5bbydisplayis:”,b);$display(“#5bbystrobeis:”,b);b<=1;endEndmodule顯示結(jié)果是:abydisplayis:0bbydisplayis:xabystrobeis:1bbystrobeis:0#5bbydisplayis:0#5bbystrobeis:0$strobe任務(wù)在被調(diào)用的時(shí)刻所有的賦值語(yǔ)句都5.3.3$time和$realtime用這兩個(gè)時(shí)間系統(tǒng)函數(shù)可以得到當(dāng)前的仿真時(shí)刻,所不同的是,$time函數(shù)以64位整數(shù)值的形式返回仿真時(shí)間,而$realtime函數(shù)則以實(shí)數(shù)型數(shù)據(jù)返回仿真時(shí)間。(1)系統(tǒng)函數(shù)$time例5.3-4:$time系統(tǒng)任務(wù)的應(yīng)用實(shí)例`timescale1ns/1nsmoduletime_tb;regts;parameterdelay=2;initialbegin#delayts=1;#delayts=0;#delayts=1;#delayts=0;endinitial$monitor($time,,,"ts=%b",ts);//使用函數(shù)$timeendmodule輸出結(jié)果為:0ts=x3ts=15ts=08ts=110ts=05.3.3$time和$realtime用這兩個(gè)時(shí)間系統(tǒng)函(2)$realtime系統(tǒng)函數(shù)$realtime返回的時(shí)間數(shù)字是一個(gè)實(shí)型數(shù),該數(shù)字也是以時(shí)間尺度為基準(zhǔn)的。例5.3-5:$realtime系統(tǒng)任務(wù)的應(yīng)用實(shí)例`timescale1ns/1nsmodulerealtime_tb;regset;parameterp=2;initialbegin$monitor($realtime,,"set=b%",set);//使用函數(shù)$realtime#pset=0;#pset=1;endendmodule輸出結(jié)果為:0set=x2set=04set=1(2)$realtime系統(tǒng)函數(shù)$realtime返回的時(shí)間5.3.4$finish和$stop系統(tǒng)任務(wù)$finish和$stop是用于對(duì)仿真過(guò)程進(jìn)行控制,分別表示結(jié)束仿真和中斷仿真。其語(yǔ)法格式:$finish;$finish(n);$stop;$stop(n);其中,n是$finish和$stop的參數(shù),n可以取0、1或2幾個(gè)值,分別表示如下含義,如下表所示。n的取值含義0不輸出任何信息1給出仿真時(shí)間和位置2給出仿真時(shí)間和位置,同時(shí)還有所用memory及CPU時(shí)間的統(tǒng)計(jì)5.3.4$finish和$stop系統(tǒng)任務(wù)$finish$finish的作用是退出仿真器,返回主操作系統(tǒng),也就是結(jié)束仿真過(guò)程。任務(wù)$finish可以帶參數(shù),根據(jù)參數(shù)的值輸出不同的特征信息。如果不帶參數(shù),默認(rèn)$finish的參數(shù)值為1。$stop任務(wù)的作用是把EDA工具(例如仿真器)置成暫停模式,在仿真環(huán)境下給出一個(gè)交互式的命令提示符,將控制權(quán)交給用戶。這個(gè)任務(wù)可以帶有參數(shù)表達(dá)式。根據(jù)參數(shù)值(0,1或2)的不同,輸出不同的信息。參數(shù)值越大,輸出的信息越多。$finish的作用是退出仿真器,返回主操作系統(tǒng),也就是結(jié)束$finish和$stop實(shí)例例5.3-6:$finish系統(tǒng)任務(wù)的應(yīng)用實(shí)例modulefinish_tb;integera,b;initialbegina=2;b=4;foreverbegin#5a=a+b;#5b=a-1;endendinitial#40$finish;initialbegin$monitor($time,"a=%d,b=%d",a,b);endendmodule在上例中,程序執(zhí)行到40個(gè)時(shí)間單位時(shí)退出仿真器。例5.3-7:$stop系統(tǒng)任務(wù)的應(yīng)用實(shí)例modulestop_tb;integera,b;initialbegina=2;b=4;foreverbegin#5a=a+b;#5b=a-1;endendinitial#40$stop;initialbegin$monitor($time,"a=%d,b=%d",a,b);endendmodule在上例中,程序執(zhí)行到40個(gè)時(shí)間單位時(shí)停止仿真,將EDA仿真器設(shè)置為暫停模式。$finish和$stop實(shí)例例5.3-6:$finish系5.3.5$readmemh和$readmem在VerilogHDL程序中有兩個(gè)系統(tǒng)任務(wù)$readmemb和$readmemh用來(lái)從文件中讀取數(shù)據(jù)到存儲(chǔ)器中。這兩個(gè)系統(tǒng)任務(wù)可以在仿真的任何時(shí)刻被執(zhí)行使用,其語(yǔ)法格式共有以下六種:(1)$readmemb("<file_name>",<memory_name>);(2)$readmemb("<file_name>",<memory_name>,<start_addr>);(3)$readmemb("<file_name>",<memory_name>,<start_addr>,<finish_addr>);(4)$readmemh("<file_name>",<memory_name>);(5)$readmemh("<file_name>",<memory_name>,<start_addr>);(6)$readmemh("<file_name>",<memory_name>,<start_addr>,<finish_addr>);11/26/202232MicroelectronicsSchoolXidianUniversity5.3.5$readmemh和$readmem在Veril11/26/202233MicroelectronicsSchoolXidianUniversity例$readmemh和$readmemb系統(tǒng)任務(wù)的應(yīng)用實(shí)例moduleread_mem_tb;reg[7:0]memory_b[0:7];reg[31:0]memory_h[0:31];integeri;initialbegin//把數(shù)據(jù)文件init_b.txt讀入存儲(chǔ)器中的給定地址$readmemb("init_b.txt",memory_b);//把數(shù)據(jù)文件init_h.txt讀入存儲(chǔ)器中的給定地址$readmemb("init_h.txt",memory_h);
//顯示初始化后的存儲(chǔ)器內(nèi)容for(i=0;i<8;i=i+1)begin$display("memory_b[%0d]=%b",i,memory_b[i]);$display("memory_h[%0h]=%h",i,memory_h[i]);endendendmodule11/26/202233MicroelectronicsS文件init_b.txt和init_h.txt包含初始化數(shù)據(jù)。用@<address>在數(shù)據(jù)文件中指定地址。其中,“init_b.txt”指定二進(jìn)制數(shù)據(jù)從第二位地址開始寫入;而“init_h.txt”指定十六進(jìn)制數(shù)據(jù)從地一位地址寫入。樣本文件如下所示。11/26/202234MicroelectronicsSchoolXidianUniversity“init_b.txt”文件:@00211111111010101010000000010101010@0061111zzzz00001111“init_h.txt”文件:@00100000000000000000000000000000011000000000000000000000000000001110000000000000000000000000000111100000000000000000000000000011111文件init_b.txt和init_h.txt包含初始化數(shù)據(jù)5.3.6$random$random是產(chǎn)生隨機(jī)數(shù)的系統(tǒng)函數(shù),每次調(diào)用該函數(shù)將返回一個(gè)32位的隨機(jī)數(shù),該隨機(jī)數(shù)是一個(gè)帶符號(hào)的整數(shù)。語(yǔ)法格式:$random%<number>;這個(gè)系統(tǒng)函數(shù)提供了一個(gè)產(chǎn)生隨機(jī)數(shù)的手段。當(dāng)函數(shù)被調(diào)用時(shí)返回一個(gè)32bit的隨機(jī)數(shù)。它是一個(gè)帶符號(hào)的整形數(shù)。$random一般的用法是:$ramdom%b,其中
b>0,它給出了一個(gè)范圍在(-b+1):(b-1)中的隨機(jī)數(shù)。11/26/202235MicroelectronicsSchoolXidianUniversity5.3.6$random$random是產(chǎn)生隨機(jī)數(shù)的系統(tǒng)函例$random系統(tǒng)任務(wù)的應(yīng)用實(shí)例11/26/202236MicroelectronicsSchoolXidianUniversity`timescale1ns/1nsmodulerandom_pulse(dout);output[9:0]dout;regdout;integerdelay1,delay2,k;initialbegin#10dout=0;for(k=0;k<100;k=k+1)begindelay1=20*({$random}%6); //delay1在0到100ns間變化delay2=20*(1+{$random}%3); //delay2在20到60ns間變化#delay1dout=1<<({$random}%10); //dout的0--9位中隨機(jī)出現(xiàn)1,并出現(xiàn)的時(shí)間在0-100ns間變化#delay2dout=0;
//脈沖的寬度在在20到60ns間變化endendendmodule
例$random系統(tǒng)任務(wù)的應(yīng)用實(shí)例11/26/202236M5.4信號(hào)時(shí)間賦值語(yǔ)句11/26/202237MicroelectronicsSchoolXidianUniversity5.4信號(hào)時(shí)間賦值語(yǔ)句11/26/202237Microel5.4.1時(shí)間延遲的語(yǔ)法說(shuō)明延遲語(yǔ)句用于對(duì)各條語(yǔ)句的執(zhí)行時(shí)間進(jìn)行控制,從而快速滿足用戶的時(shí)序要求。VerilogHDL語(yǔ)言中延時(shí)控制的語(yǔ)法格式有兩類:(1)#<延遲時(shí)間>行為語(yǔ)句;(2)#<延遲時(shí)間>;其中,符號(hào)“#”是延遲控制的關(guān)鍵字符,<延遲時(shí)間>可以是直接指定的延遲時(shí)間量,并以多少個(gè)仿真時(shí)間單位的形式給出。在仿真過(guò)程中,所有時(shí)延都根據(jù)時(shí)間單位定義。下面是帶時(shí)延的賦值語(yǔ)句示例。#2Sum=A^B;//#2指定2個(gè)時(shí)間單位后,將A異或B的值賦值給Sum。11/26/202238MicroelectronicsSchoolXidianUniversity5.4.1時(shí)間延遲的語(yǔ)法說(shuō)明延遲語(yǔ)句用于對(duì)各條語(yǔ)句的執(zhí)行時(shí)間根據(jù)時(shí)間控制部分在過(guò)程賦值語(yǔ)句中出現(xiàn)的位置,可以把過(guò)程賦值語(yǔ)句中的時(shí)間控制方式分為外部時(shí)間控制方式和內(nèi)部時(shí)間控制方式。(1)外部時(shí)間控制方式是時(shí)間控制出現(xiàn)在整個(gè)過(guò)程賦值語(yǔ)句的最左端,也就是出現(xiàn)賦值目標(biāo)變量的左邊的時(shí)間控制方式,其語(yǔ)法結(jié)構(gòu)如下例所示:#5a=b;在仿真執(zhí)行時(shí)就相當(dāng)于如下幾條語(yǔ)句的執(zhí)行:initialbegin#5;a=b;end11/26/202239MicroelectronicsSchoolXidianUniversity根據(jù)時(shí)間控制部分在過(guò)程賦值語(yǔ)句中出現(xiàn)的位置,可以把過(guò)程賦值語(yǔ)(2)內(nèi)部時(shí)間控制方式是過(guò)程賦值語(yǔ)句中的時(shí)間控制部分還可以出現(xiàn)在“賦值操作符”和“賦值表達(dá)式”之間的時(shí)間控制方式。其語(yǔ)法結(jié)構(gòu)如下例所示:a=#5b;其中時(shí)間控制部分“#5”就出現(xiàn)在賦值操作符“=”和賦值表達(dá)式“b”的中間,因此在這條過(guò)程賦值語(yǔ)句內(nèi)帶有內(nèi)部時(shí)間控制方式的時(shí)間控制。它在執(zhí)行時(shí)就相當(dāng)于如下幾條語(yǔ)句的執(zhí)行:initialbegintemp=b;//先求b的值#5;a=temp;end11/26/202240MicroelectronicsSchoolXidianUniversity(2)內(nèi)部時(shí)間控制方式是過(guò)程賦值語(yǔ)句中的時(shí)間控制部分還可以出5.4.2時(shí)間延遲的描述形式此處時(shí)間延遲的描述形式是指延時(shí)控制的描述形式,其分為串行延遲控制、并行延遲控制、阻塞式延遲控制和非阻塞式延遲控制四種形式。以實(shí)現(xiàn)兩組不同波形的信號(hào)為例(如圖所示q0_out和q1_out),說(shuō)明四種不同時(shí)間延遲的描述形式。11/26/202241MicroelectronicsSchoolXidianUniversity5.4.2時(shí)間延遲的描述形式此處時(shí)間延遲的描述形式是指延時(shí)控(1)串行延遲控制串行延遲控制是最為常見的信號(hào)延遲控制,它是由begin-end過(guò)程塊加上延遲賦值語(yǔ)句構(gòu)成,其中延遲賦值語(yǔ)句可以為外部時(shí)間控制方式,也可以為內(nèi)部時(shí)間控制方式。在<延遲時(shí)間>之后也可根據(jù)情況來(lái)確定是否執(zhí)行相應(yīng)的行為語(yǔ)句。在<延遲時(shí)間>后面有相應(yīng)的行為語(yǔ)句,則仿真進(jìn)程遇到這條帶有延遲控制的行為語(yǔ)句后并不立即執(zhí)行行為語(yǔ)句指定的操作,而是要延遲等待到“<延遲時(shí)間>”所指定的時(shí)間量過(guò)去后才真正開始執(zhí)行行為語(yǔ)句指定的操作。11/26/202242MicroelectronicsSchoolXidianUniversity(1)串行延遲控制11/26/202242Microelec11/26/202243MicroelectronicsSchoolXidianUniversity`timescale1ns/1nsmoduleserial_delay(q0_out,q1_out);outputq0_out,q1_out;regq0_out,q1_out;
initialbeginq0_out=1'b0;#50q0_out=1'b1;#100 q0_out=1'b0;#100 q0_out=1'b1;#50q0_out=1'b0;#100 q0_out=1'b1;#50q0_out=1'b0;#50q0_out=1'b1;#50q0_out=1'b0;endinitialbeginq1_out=1'b0;#100 q1_out=1'b1;#100 q1_out=1'b0;#50q1_out=1'b1;#100 q1_out=1'b0;#50q1_out=1'b1;#100 q1_out=1'b0;#50q1_out=1'b1;#50q1_out=1'b0;endendmodule例VerilogHDL串行延遲控制方式設(shè)計(jì)圖示信號(hào)11/26/202243MicroelectronicsS(2)并行延遲控制并行延遲控制方式是通過(guò)fork-join過(guò)程塊加上延遲賦值語(yǔ)句構(gòu)成,其中延遲賦值語(yǔ)句同串行延遲控制方式一樣,既可以是外部時(shí)間控制方式,也可以是內(nèi)部時(shí)間控制方式。在<延遲時(shí)間>之后也可根據(jù)情況來(lái)確定是否執(zhí)行相應(yīng)的行為語(yǔ)句。在<延遲時(shí)間>后面有相應(yīng)的行為語(yǔ)句,則仿真進(jìn)程遇到這條帶有延遲控制的行為語(yǔ)句后并不立即執(zhí)行行為語(yǔ)句指定的操作,而是要延遲等待到“<延遲時(shí)間>”所指定的時(shí)間量過(guò)去后才真正開始執(zhí)行行為語(yǔ)句指定的操作。但并行延遲控制方式與串行延遲控制方式不同在于并行延遲控制方式中的多條延遲語(yǔ)句時(shí)并行執(zhí)行的,并不需要等待上一條語(yǔ)句的執(zhí)行完成才開始執(zhí)行當(dāng)前的語(yǔ)句。11/26/202244MicroelectronicsSchoolXidianUniversity(2)并行延遲控制11/26/202244Microelec11/26/202245MicroelectronicsSchoolXidianUniversity`timescale1ns/1nsmoduleparallel_delay(q0_out,q1_out);outputq0_out,q1_out;regq0_out,q1_out;initialforkq0_out=1'b0;#50q0_out=1'b1;#150 q0_out=1'b0;#250 q0_out=1'b1;#300 q0_out=1'b0;#400 q0_out=1'b1;#450 q0_out=1'b0;#500 q0_out=1'b1;#600 q0_out=1'b0;joininitialfork q1_out=1'b0;#100 q1_out=1'b1;#200 q1_out=1'b0;#250 q1_out=1'b1;#350 q1_out=1'b0;#400 q1_out=1'b1;#500 q1_out=1'b0;#550 q1_out=1'b1;#600 q1_out=1'b0;joinendmodule例VerilogHDL并行延遲控制方式設(shè)計(jì)圖示信號(hào)11/26/202245MicroelectronicsS(3)阻塞式延遲控制以賦值操作符“=”來(lái)標(biāo)識(shí)的賦值操作稱為“阻塞式過(guò)程賦值”,阻塞式過(guò)程賦值在之前已經(jīng)介紹過(guò),在此介紹阻塞式延遲控制。阻塞式延遲控制是在阻塞式過(guò)程賦值基礎(chǔ)上帶有延時(shí)控制的情況,例如initialbegin a=0; a=#51; a=#100; a=#151;end11/26/202246MicroelectronicsSchoolXidianUniversity(3)阻塞式延遲控制11/26/202246Microele各條阻塞式賦值語(yǔ)句將依次得到執(zhí)行,并且在第一條語(yǔ)句所指定的賦值操作沒有完成之前第二條語(yǔ)句不會(huì)開始執(zhí)行。因此在仿真進(jìn)程開始時(shí)刻將“0”值賦給a,此條賦值語(yǔ)句完成之后才開始執(zhí)行第二條賦值語(yǔ)句;在完成第一條賦值語(yǔ)句之后,延遲5個(gè)時(shí)間單位將“1”賦值給a;同理第三條賦值語(yǔ)句是在第二條賦值語(yǔ)句完成之后延遲10個(gè)時(shí)間單位才開始執(zhí)行,將“0”賦值給a;最后一條賦值語(yǔ)句是在前三條語(yǔ)句都完成的時(shí)刻,延遲15個(gè)時(shí)間單位,將“1”賦值給a。下圖給出了上例中信號(hào)a的波形。上述兩例都采用的是阻塞式賦值語(yǔ)句。11/26/202247MicroelectronicsSchoolXidianUniversity各條阻塞式賦值語(yǔ)句將依次得到執(zhí)行,并且在第一條語(yǔ)句所指定的賦(4)非阻塞式延遲控制以賦值操作符“<=”來(lái)標(biāo)識(shí)的賦值操作稱為“非阻塞式過(guò)程賦值”,非阻塞式過(guò)程賦值也在之前講述過(guò),在此主要介紹非阻塞式延遲控制。非阻塞式延遲控制是在非阻塞式過(guò)程賦值基礎(chǔ)上帶有延時(shí)控制的情況。如下例所示:initialbegin a<=0; a<=#51; a<=#100; a<=#151;end11/26/202248MicroelectronicsSchoolXidianUniversity(4)非阻塞式延遲控制11/26/202248Microel在上例中各條非阻塞式賦值語(yǔ)句均以并行方式執(zhí)行,雖然執(zhí)行語(yǔ)句在begin-end串行塊中,但其執(zhí)行方式與并行延遲控制方式一致,在仿真進(jìn)程開始時(shí)刻同時(shí)執(zhí)行四條延遲賦值語(yǔ)句。在仿真進(jìn)程開始時(shí),將“0”值賦值給a;在離仿真開始時(shí)刻5個(gè)時(shí)間單位時(shí),將“1”值賦值給a;在離仿真開始時(shí)刻10個(gè)時(shí)間單位時(shí),將“0”值賦值給a;最后在離仿真開始時(shí)刻15個(gè)時(shí)間單位時(shí),將“1”值賦值給a。下圖給出了上例中信號(hào)a的波形。11/26/202249MicroelectronicsSchoolXidianUniversity在上例中各條非阻塞式賦值語(yǔ)句均以并行方式執(zhí)行,雖然執(zhí)行語(yǔ)句在11/26/202250MicroelectronicsSchoolXidianUniversity`timescale1ns/1nsmodulenon_blocking_delay(q0_out,q1_out);outputq0_out,q1_out;regq0_out,q1_out;initialbeginq0_out<=1'b0;q0_out<=#501'b1;q0_out<=#1501'b0;q0_out<=#2501'b1;q0_out<=#3001'b0;q0_out<=#4001'b1;q0_out<=#4501'b0;q0_out<=#5001'b1;q0_out<=#6001'b0;endinitialbeginq1_out<=1'b0;q1_out<=#1001'b1;q1_out<=#2001'b0;q1_out<=#2501'b1;q1_out<=#3501'b0;q1_out<=#4001'b1;q1_out<=#5001'b0;q1_out<=#5501'b1;q1_out<=#6001'b0;endendmodule例VerilogHDL非阻塞延遲控制方式設(shè)計(jì)11/26/202250MicroelectronicsS5.4.3邊沿觸發(fā)事件控制邊沿觸發(fā)事件控制的語(yǔ)法格式可以為如下四種形式:形式1:@(<事件表達(dá)式>)行為語(yǔ)句;形式2:@(<事件表達(dá)式>);形式3:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or<事件表達(dá)式n>)行為語(yǔ)句;形式4:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or<事件表達(dá)式n>);11/26/202251MicroelectronicsSchoolXidianUniversity5.4.3邊沿觸發(fā)事件控制邊沿觸發(fā)事件控制的語(yǔ)法格式可以為如1.事件表達(dá)式在事件表達(dá)式中,可以以三種形式出現(xiàn):形式1:<信號(hào)名>形式2:posedge<信號(hào)名>形式3:negedge<信號(hào)名>其中,“<信號(hào)名>”可以是任何數(shù)據(jù)類型的標(biāo)量或矢量。形式1中,代表觸發(fā)事件的“<信號(hào)名>”在指定的信號(hào)發(fā)生邏輯變化時(shí),執(zhí)行下面的語(yǔ)句,如例所示:@(in)
out=in;當(dāng)敏感事件in發(fā)生邏輯變化時(shí)(包括正跳變和負(fù)跳變),執(zhí)行對(duì)應(yīng)的賦值語(yǔ)句,將in的值賦值給out。11/26/202252MicroelectronicsSchoolXidianUniversity1.事件表達(dá)式11/26/202252Microelectr形式2中,代表觸發(fā)事件的“posedge<信號(hào)名>”在指定的信號(hào)發(fā)生了正跳變時(shí),執(zhí)行下面的語(yǔ)句,如下例所示:@(posedgein)
out=in;當(dāng)敏感事件in發(fā)生正跳變時(shí),執(zhí)行對(duì)應(yīng)的賦值語(yǔ)句,將in的值賦值給out。形式3中,代表觸發(fā)事件的“negedge<信號(hào)名>”在指定的信號(hào)發(fā)生了負(fù)跳變時(shí),執(zhí)行下面的語(yǔ)句,如下例所示:@(negedgein)out=in;當(dāng)敏感事件in發(fā)生負(fù)跳變時(shí),執(zhí)行對(duì)應(yīng)的賦值語(yǔ)句,將in的值賦值給out。11/26/202253MicroelectronicsSchoolXidianUniversity形式2中,代表觸發(fā)事件的“posedge<信號(hào)名>”在指定的在信號(hào)發(fā)生邏輯變化(正跳變或負(fù)跳變)的過(guò)程中,信號(hào)的值是從0、1、x、z四個(gè)值中的一個(gè)值變化到另一個(gè)值;而信號(hào)發(fā)生正跳變的過(guò)程是信號(hào)由低電平向高電平的轉(zhuǎn)變,負(fù)跳變是信號(hào)由高電平向低電平的轉(zhuǎn)變。表5.4-1為VerilogHDL中規(guī)定的正跳變和負(fù)跳變。11/26/202254MicroelectronicsSchoolXidianUniversity正跳變負(fù)跳變0→x1→x0→z1→z0→11→0x→1x→0z→1z→0在信號(hào)發(fā)生邏輯變化(正跳變或負(fù)跳變)的過(guò)程中,信號(hào)的值是從02.邊沿觸發(fā)語(yǔ)法格式形式1:@(<事件表達(dá)式>)行為語(yǔ)句;這種語(yǔ)法格式的敏感事件列表內(nèi)只包含了一個(gè)觸發(fā)事件,只有當(dāng)這個(gè)指定的觸發(fā)事件發(fā)生之后,后面的行為語(yǔ)句才能啟動(dòng)執(zhí)行。在仿真進(jìn)程中遇到這種帶有事件控制的行為語(yǔ)句時(shí),如果指定的觸發(fā)事件還沒有發(fā)生,則仿真進(jìn)程就會(huì)停留在此處等待,直到指定觸發(fā)事件發(fā)生之后再啟動(dòng)執(zhí)行后面的行為語(yǔ)句,仿真進(jìn)程繼續(xù)向下進(jìn)行。11/26/202255MicroelectronicsSchoolXidianUniversity例5.4-4:時(shí)鐘脈沖計(jì)數(shù)器moduleclk_counter(clk,count_out);inputclk;outputcount_out;reg[3:0]count_out;initialcount_out=0;always@(posedgeclk)count_out=count_out+1; //在clk的每個(gè)正跳變邊沿count_out增加1endmodule2.邊沿觸發(fā)語(yǔ)法格式11/26/202255Microele形式2:@(<事件表達(dá)式>);這種語(yǔ)法格式的敏感事件列表內(nèi)也只包含了一個(gè)觸發(fā)事件,沒有行為語(yǔ)句來(lái)指定觸發(fā)事件發(fā)生時(shí)要執(zhí)行的操作。這種格式的事件控制語(yǔ)句的執(zhí)行過(guò)程與延時(shí)控制語(yǔ)句中沒有行為語(yǔ)句的情況類似,仿真進(jìn)程在遇到這條事件控制語(yǔ)句后會(huì)進(jìn)入等待狀態(tài),直到指定的觸發(fā)事件發(fā)生后才結(jié)束等待狀態(tài),退出該事件控制語(yǔ)句的執(zhí)行并開始下一條語(yǔ)句的執(zhí)行。11/26/202256MicroelectronicsSchoolXidianUniversity形式2:@(<事件表達(dá)式>);11/26/202256Mic11/26/202257MicroelectronicsSchoolXidianUniversitymoduleclk_time_mea(clk);inputclk;timeposedge_time,negedge_time;timehigh_last_time,low_last_time,last_time;initialbegin@(posedgeclk); /*等待,直到時(shí)鐘發(fā)生正跳變后退出等待狀態(tài),繼續(xù)執(zhí)行下一條語(yǔ)句*/posedge_time=$time;@(negedgeclk); /*等待,直到時(shí)鐘發(fā)生負(fù)跳變后退出等待狀態(tài),
繼續(xù)執(zhí)行下一條語(yǔ)句*/negedge_time=$time;@(negedgeclk); /*等待,直到時(shí)鐘再次正跳變后退出等待狀態(tài),繼續(xù)執(zhí)行下一條語(yǔ)句*/last_time=$time-posedge_time;high_last_time=negedge_time-posedge_time;low_last_time=last_time-high_last_time;$display("TheclkstayinHighlevelfor:%t",high_last_time);$display("TheclkstayinLowlevelfor:%t",low_last_time);$display("TheclksignalPeriodis:%t",last_time);endendmodule例用于測(cè)定輸入時(shí)鐘正電平、負(fù)電平持續(xù)時(shí)間以及時(shí)鐘周期的模塊11/26/202257MicroelectronicsS形式3:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or<事件表達(dá)式n>)行為語(yǔ)句;這種語(yǔ)法格式的“敏感事件列表”內(nèi)指定了由不同“<事件表達(dá)式>”代表的多個(gè)觸發(fā)事件,這些“<事件表達(dá)式>”之間要用關(guān)鍵詞“or”組合起來(lái)。只要這些觸發(fā)事件中的任何一個(gè)得到發(fā)生,就啟動(dòng)行為語(yǔ)句的執(zhí)行。在仿真進(jìn)程遇到這種格式的邊沿觸發(fā)事件控制語(yǔ)句時(shí)如果所有的觸發(fā)事件都沒有發(fā)生,則仿真進(jìn)程就會(huì)進(jìn)入等待狀態(tài),直到其中的某一個(gè)觸發(fā)事件發(fā)生后才啟動(dòng)執(zhí)行后面給出的行為語(yǔ)句,仿真進(jìn)程繼續(xù)向下進(jìn)行。11/26/202258MicroelectronicsSchoolXidianUniversity形式3:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or形式4:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or<事件表達(dá)式n>);同第三種語(yǔ)法格式一樣,這種語(yǔ)法格式內(nèi)指定了多個(gè)觸發(fā)事件。但是在這種格式中沒有行為語(yǔ)句。在這種情況下,該語(yǔ)句的執(zhí)行過(guò)程與第二種語(yǔ)法格式的執(zhí)行過(guò)程類似,仿真進(jìn)程在遇到這條事件控制語(yǔ)句后會(huì)進(jìn)入等待狀態(tài),直到敏感事件列表包含的多個(gè)觸發(fā)事件中的任何一個(gè)得到發(fā)生后才結(jié)束等待狀態(tài),退出該事件控制語(yǔ)句并開始執(zhí)行該事件控制語(yǔ)句后的下一條語(yǔ)句。11/26/202259MicroelectronicsSchoolXidianUniversity例在觸發(fā)事件發(fā)生后退出事件控制語(yǔ)句moduledisplay_information_change(a,b);inputa,b;wirea,b;alwaysbegin@(posedgeaornegedgeb);/*等待,直到a或b發(fā)生變化后退出等待狀態(tài),并開始下一條語(yǔ)句的執(zhí)行*/display("Oneofaandbchangedintime:%t",$time);endendmodule形式4:@(<事件表達(dá)式1>or<事件表達(dá)式2>or……or5.4.4電平敏感事件控制電平敏感時(shí)間控制是另一種事件控制方式,與邊沿觸發(fā)事件控制不同,它是在指定的條件表達(dá)式為真時(shí)啟動(dòng)需要執(zhí)行的語(yǔ)句。電平敏感時(shí)間控制是用關(guān)鍵詞“wait”來(lái)表示。電平觸發(fā)事件控制的語(yǔ)法格式可以為如下兩種:形式1:wait(條件表達(dá)式)行為語(yǔ)句;形式2:wait(條件表達(dá)式);電平敏感事件控制的第一種形式中包含了行為語(yǔ)句,它可以是串行塊(begin-end)語(yǔ)句或并行塊(fork-join)語(yǔ)句,也可以是單條行為語(yǔ)句。在這種事件控制語(yǔ)句形式下,行為語(yǔ)句啟動(dòng)執(zhí)行的觸發(fā)條件是:條件表達(dá)式的值為“真(邏輯1)”。如果當(dāng)仿真進(jìn)程執(zhí)行到這條電平敏感控制語(yǔ)句時(shí)條件表達(dá)式的值是“真”,那么語(yǔ)句塊立即得到執(zhí)行;否則語(yǔ)句塊要一直等到條件表達(dá)式變?yōu)椤罢妗睍r(shí)再開始執(zhí)行。11/26/202260MicroelectronicsSchoolXidianUniversity5.4.4電平敏感事件控制電平敏感時(shí)間控制是另一種事件控制方11/26/202261MicroelectronicsSchoolXidianUniversity例如:wait(enable==1)begin d=a&b; d=d|c;endwait語(yǔ)句的作用是根據(jù)條件表達(dá)式的真假來(lái)控制下面begin-end語(yǔ)句塊的執(zhí)行,在使能信號(hào)enable變?yōu)楦唠娖胶?,也就是enable==1的語(yǔ)句為真時(shí)進(jìn)行a,b,c之間的與或操作;若使能信號(hào)enable未變?yōu)楦唠娖?,則begin-end語(yǔ)句塊的執(zhí)行需要等到enable變?yōu)楦唠娖街蟛砰_始執(zhí)行。11/26/202261MicroelectronicsS電平敏感事件控制的第2種形式中沒有包含行為語(yǔ)句。在這種電平敏感事件控制語(yǔ)句形式下,如果當(dāng)仿真進(jìn)程執(zhí)行到該wait控制語(yǔ)句時(shí)條件表達(dá)式的值是“真”,那么立即結(jié)束該wait事件控制語(yǔ)句的執(zhí)行,仿真進(jìn)程繼續(xù)往下進(jìn)行;而如果當(dāng)仿真進(jìn)程執(zhí)行到這條wait控制語(yǔ)句時(shí)條件表達(dá)式的值是“假”,則仿真進(jìn)程進(jìn)入等待狀態(tài),一直等到條件表達(dá)式取值變?yōu)椤罢妗睍r(shí)才退出等待狀態(tài)同時(shí)結(jié)束該wait語(yǔ)句的執(zhí)行,仿真進(jìn)程繼續(xù)往下進(jìn)行。這種形式的電平敏感時(shí)間控制常常用來(lái)對(duì)串行塊中各條語(yǔ)句的執(zhí)行時(shí)序進(jìn)行控制。11/26/202262MicroelectronicsSchoolXidianUniversity例如:begin wait(enable==1); d=a&b; d=d|c;end電平敏感事件控制的第2種形式中沒有包含行為語(yǔ)句。在這種電平敏5.5任務(wù)和函數(shù)在VerilogHDL語(yǔ)言中提供了任務(wù)和函數(shù),可以將較大的行為級(jí)設(shè)計(jì)劃分為較小的代碼段,允許設(shè)計(jì)者將需要在多個(gè)地方重復(fù)使用的相同代碼提取出來(lái),編寫成任務(wù)和函數(shù),這樣可以使代碼更加簡(jiǎn)潔和易懂。5.5.1任務(wù)1.任務(wù)的定義任務(wù)定義的語(yǔ)法格式:11/26/202263MicroelectronicsSchoolXidianUniversitytask<任務(wù)名>;
端口和類型聲明
局部變量聲明 begin
語(yǔ)句1;
語(yǔ)句2; ……
語(yǔ)句n; endendtask5.5任務(wù)和函數(shù)在VerilogHDL語(yǔ)言中提供了任務(wù)和函任務(wù)定義是嵌入在關(guān)鍵字task和endtask之間的,其中關(guān)鍵詞task標(biāo)志著一個(gè)任務(wù)定義結(jié)構(gòu)的開端,endtask標(biāo)志著一個(gè)任務(wù)定義結(jié)構(gòu)的結(jié)束?!?lt;任務(wù)名>”是所定義任務(wù)的名稱。在“<任務(wù)名>”后面不能出現(xiàn)輸入輸入端口列表。例以讀存儲(chǔ)器數(shù)據(jù)為例說(shuō)明任務(wù)定義的操作11/26/202264MicroelectronicsSchoolXidianUniversitytaskread_memory; //任務(wù)定義的開頭,指定任務(wù)名為read_memory input[15:0]address; //輸入端口說(shuō)明 output[31:0]data; //輸出端口說(shuō)明 reg[3:0]counter; //變量類型說(shuō)明 reg[7:0]temp[1:4]; //變量類型說(shuō)明 begin //語(yǔ)句塊,任務(wù)被調(diào)用時(shí)執(zhí)行 for(counter=1;counter<=4;counter=counter+1) temp[counter]=mem[address+counter-1]; data={temp[1],temp[2],temp[3],temp[4]}; endendtask //任務(wù)定義結(jié)束任務(wù)定義是嵌入在關(guān)鍵字task和endtask之間的,其中關(guān)任務(wù)定義時(shí)需注意以下事項(xiàng):(1)在第一行“task”語(yǔ)句中不能列出端口名列表。(2)任務(wù)中可以有延時(shí)語(yǔ)句、敏感事件控制語(yǔ)句等事件控制語(yǔ)句。(3)任務(wù)可以沒有或可以有一個(gè)或多個(gè)輸入、輸出和雙向端口。(4)任務(wù)可以沒有返回值,也可以通過(guò)輸出端口或雙向端口返回一個(gè)或多個(gè)返回值。(5)任務(wù)可以調(diào)用其它的任務(wù)或函數(shù),也可以調(diào)用該任務(wù)本身。(6)任務(wù)定義結(jié)構(gòu)內(nèi)不允許出現(xiàn)過(guò)程塊(initial或always過(guò)程塊)。(7)任務(wù)定義結(jié)構(gòu)內(nèi)可以出現(xiàn)disable終止語(yǔ)句,這條語(yǔ)句的執(zhí)行將中斷正在執(zhí)行的任務(wù)。在任務(wù)被中斷后,程序流程將返回到調(diào)用任務(wù)的地方繼續(xù)向下執(zhí)行。11/26/202265MicroelectronicsSchoolXidianUniversity任務(wù)定義時(shí)需注意以下事項(xiàng):11/26/202265Micro2、任務(wù)的調(diào)用任務(wù)的調(diào)用是通過(guò)“任務(wù)調(diào)用語(yǔ)句”來(lái)實(shí)現(xiàn)的。任務(wù)調(diào)用語(yǔ)句列出了傳入任務(wù)的參數(shù)值和接收結(jié)果的變量值,任務(wù)的調(diào)用格式如下:<任務(wù)名>(端口1,端口2……,端口n);例以測(cè)試仿真中常用的方式來(lái)說(shuō)明任務(wù)的調(diào)用11/26/202266MicroelectronicsSchoolXidianUniversitymoduledemo_task_invo_tb;reg[7:0]mem[127:0];reg[15:0]a;reg[31:0]b;initialbegina=0;read_mem(a,b);//任務(wù)的第一次調(diào)用#10;a=64;read_mem(a,b);//任務(wù)的第二次調(diào)用end
taskread_mem;//任務(wù)定義部分input[15:0]address;output[31:0]data;reg[3:0]counter;reg[7:0]temp[1:4];beginfor(counter=1;counter<=4;counter=counter+1)temp[counter]=mem[address+counter-1];data={temp[1],temp[2],temp[3],temp[4]};endendtaskendmodule2、任務(wù)的調(diào)用11/26/202266Microelectr使用任務(wù)可以使程序更加簡(jiǎn)潔易懂,以實(shí)際中的交通燈控制為例說(shuō)明任務(wù)的定義、調(diào)用的特點(diǎn)。11/26/202267MicroelectronicsSchoolXidianUniversitymoduletraffic_lights(red,amber,green);outputred,amber,green;reg[2:1]order;regclock,red,amber,green;parameterON=1,OFF=0,RED_TICS=350,AMBER_TICS=30,GREEN_TICS=200;//產(chǎn)生時(shí)鐘脈沖alwaysbegin#100clock=0;#100clock=1;end//任務(wù)的定義,該任務(wù)用于實(shí)現(xiàn)交通燈的開啟tasklight;outputred;outputamber;outputgreen;input[31:0]tic_time;input[2:1]order;beginred=OFF;green=OFF;amber=OFF;case(order)2'b01:red=ON;2'b10:green=ON;2'b11:amber=ON;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度電視劇導(dǎo)演聘用合同書(古裝戰(zhàn)爭(zhēng))
- 2025年度個(gè)人出租車承包運(yùn)營(yíng)管理及車輛更新合同
- 2025年吉林工業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及答案1套
- 健康管理融資居間合同
- 2025年度教育培訓(xùn)借款居間服務(wù)合同協(xié)議書
- 2025年度農(nóng)村別墅裝修與設(shè)施配套合同
- 2025年度房屋租賃權(quán)轉(zhuǎn)讓及租賃保證金合同協(xié)議書
- 歷史建筑保護(hù)扶梯改造合同
- 2025年度協(xié)議離婚孩子撫養(yǎng)權(quán)及父母子女法律咨詢服務(wù)合同
- 2025年度員工股份激勵(lì)與股權(quán)激勵(lì)評(píng)估協(xié)議
- LY/T 3400-2024荒漠與荒漠化防治術(shù)語(yǔ)
- 2024-2025學(xué)年第二學(xué)期英語(yǔ)教研組工作計(jì)劃
- 2025年往年教師職稱考試試題
- 幼兒園開學(xué)前的廚房人員培訓(xùn)
- 《幼兒教育政策與法規(guī)》教案-單元6 幼兒園的工作人員
- 虛擬制片技術(shù)在VRAR應(yīng)用中的角色建模與渲染-洞察分析
- GB/T 45167-2024熔模鑄鋼件、鎳合金鑄件和鈷合金鑄件表面質(zhì)量目視檢測(cè)方法
- 2023年?yáng)|北公司加油站賬務(wù)人員考試題庫(kù)
- 2024年四川綿陽(yáng)初中學(xué)業(yè)水平考試英語(yǔ)試卷真題(含答案詳解)
- 《鴉片戰(zhàn)爭(zhēng)改》課件
- 消防員證考試題庫(kù)2000題中級(jí)
評(píng)論
0/150
提交評(píng)論