版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)字系統(tǒng)設(shè)計(jì)與VerilogHDL(第9版)數(shù)字系統(tǒng)設(shè)計(jì)與VerilogHDL(第9版)第10章
TestBench測(cè)試與時(shí)序檢查10.1系統(tǒng)任務(wù)與系統(tǒng)函數(shù)10.2顯示類任務(wù)10.3文件操作類任務(wù)
10.4控制和時(shí)間類任務(wù)10.5隨機(jī)數(shù)與概率分布函數(shù)10.6Verilog中的延時(shí)定義10.7specify塊與模塊路徑延時(shí)10.8時(shí)序檢查10.9TestBench測(cè)試10.10測(cè)試示例10.11ModelSimSE使用指南VerilogHDL的系統(tǒng)任務(wù)和系統(tǒng)函數(shù)主要用于仿真。系統(tǒng)任務(wù)和系統(tǒng)函數(shù)均以符號(hào)“$”開頭,一般在intial或always過程塊中對(duì)其進(jìn)行調(diào)用;用戶也可以通過編程語言接口(PLI)將自己定義的系統(tǒng)任務(wù)和系統(tǒng)函數(shù)加到系統(tǒng)中,用于仿真和調(diào)試。10.1系統(tǒng)任務(wù)與系統(tǒng)函數(shù)$display和$write用于輸出仿真結(jié)果,可以把變量和代碼運(yùn)行結(jié)果打印在TCL窗口上,供調(diào)試者知曉代碼運(yùn)行情況。使用格式:$display("格式控制符",輸出變量名列表);$write("格式控制符",輸出變量名列表);比如:$display($time,,,"a=%hb=%hc=%h",a,b,c);10.2顯示類任務(wù)10.2.1
$display與$write$strobe與$monitor都提供了監(jiān)控和輸出參數(shù)列表中字符或變量的值的功能。使用格式:$monitor(“格式控制符”,輸出變量名列表);$strobe(“格式控制符”,輸出變量名列表);示例:$monitor($time,"a=%bb=%h",a,b);10.2顯示類任務(wù)10.2.2$strobe與$monitor$fopen用于打開某個(gè)文件并準(zhǔn)備寫操作,其格式如下。fd=$fopen("file_name");fd=$fopen("file_name",mode);$fclose用于關(guān)閉文件,其格式如下。$fclose(fd);10.3文件操作類任務(wù)10.3.1$fopen與$fclose1.$fgetc$fgetc每次從文件讀取1個(gè)字符(character),其使用格式如下。c=$fgetc(fd)2.$fgets$fgets是按行(line)讀取文件,其使用方式如下。integercode=$fgets(str,fd);10.3文件操作類任務(wù)10.3.2$fgetc與$fgets$readmemh與$readmemb作用都是從外部文件中讀取數(shù)據(jù)并放入存儲(chǔ)器中。兩者的區(qū)別在于讀取數(shù)據(jù)的格式不同,$readmemh為讀取十六進(jìn)制數(shù)據(jù),而$readmemb為讀取二進(jìn)制數(shù)據(jù)。$readmemb的使用方式。1)$readmemb("數(shù)據(jù)文件名",存儲(chǔ)器名);2)$readmemb("數(shù)據(jù)文件名",存儲(chǔ)器名,起始地址);3)$readmemb("數(shù)據(jù)文件名",存儲(chǔ)器名,起始地址,結(jié)束地址);10.3文件操作類任務(wù)10.3.3$readmemh與$readmemb例10.4$readmemh使用示例`timescale10ns/1nsmodulerm_tp;reg[15:0]my_mem[0:5];reg[4:0]n;initialbegin$readmemh("myfile.txt",my_mem);for(n=0;n<=5;n=n+1)$display("%h",my_mem[n]);endendmodule在當(dāng)前工程目錄下準(zhǔn)備一個(gè)名為myfile.txt的文件,將其內(nèi)容填寫如下0123456789ABCDEF用ModelSim仿真后的輸出如下,說明myfile.txt中的數(shù)據(jù)已裝載到存儲(chǔ)器中0123456789abcdefxxxxxxxxendmodule系統(tǒng)任務(wù)$finish與$stop用于控制仿真的執(zhí)行過程,$finish是結(jié)束本次仿真;$stop是暫停(中斷)當(dāng)前的仿真,仿真暫停后通過仿真工具菜單或命令行還可以使仿真繼續(xù)進(jìn)行。使用格式:$stop;$stop(n);$finish;$finish(n);10.4控制和時(shí)間類任務(wù)10.4.1$finish與$stop$time、$stime和$realtime都屬于顯示仿真時(shí)間標(biāo)度的系統(tǒng)函數(shù)。這3個(gè)函數(shù)被調(diào)用時(shí),均返回當(dāng)前時(shí)刻距離仿真開始時(shí)刻的時(shí)間量值,不同之處如下。
$time:返回一個(gè)64位整數(shù)型時(shí)間值。
$stime:返回一個(gè)32位整數(shù)型時(shí)間值。
$realtime:返回一個(gè)實(shí)數(shù)型時(shí)間值,可以是浮點(diǎn)數(shù)。10.4控制和時(shí)間類任務(wù)10.4.2$time、$stime與$realtime1.$printtimescale$printtimescale用于顯示指定模塊的時(shí)間單位和精度。其使用格式如下。$printtimescale(模塊名);2.$timeformat$timeformat的用法如下。$timeformat(units,precision,suffix_string,min_width);10.4控制和時(shí)間類任務(wù)10.4.3$printtimescale與$timeformat例10.7任務(wù)$printtimescale的用法示例。`timescale1ns/1psmodulea_dat();b_datb1();initial$printtimescale();initial$printtimescale(b1);initial$printtimescale(b1.c1);endmodule//---------------------------------`timescale10fs/1fsmoduleb_dat();c_datc1();endmodule//---------------------------------`timescale10ns/1nsmodulec_dat();endmodule運(yùn)行例10.7的輸出信息如下所示:Timescaleof(a_dat)is1ns/1psTimescaleof(a_dat.b1)is10fs/1fsTimescaleof(a_dat.b1.c1)is10ns/1ns10.5隨機(jī)數(shù)及概率分布函數(shù)$random$random是產(chǎn)生隨機(jī)數(shù)的系統(tǒng)函數(shù),每次調(diào)用該函數(shù)將返回一個(gè)32位的隨機(jī)數(shù)(有符號(hào)整數(shù))。使用格式。
$random<seed>;例10.9$random函數(shù)的使用示例`timescale1ns/1nsmodulerandom_gen;reg[23:0]rand1;reg[15:0]rand2;regclk;integerseed=21000;parameterCY=10;initial$monitor($time,,,"rand1=%brand2=%b",rand1,rand2);initialbeginrepeat(12)@(posedgeclk)beginrand1<=$random(seed);rand2<=$random%100;//每次產(chǎn)生一個(gè)-99~99之間的隨機(jī)數(shù)endendinitialbeginclk=0; //用initial過程產(chǎn)生時(shí)鐘clkforever#(CY/2)clk=~clk;endendmodule產(chǎn)生隨機(jī)數(shù)10.6Verilog中的延時(shí)定義門延時(shí)是從門輸入端發(fā)生變化到門輸出端發(fā)生變化的延遲時(shí)間,其表示方法如下:#(delay) //指定1項(xiàng)門延時(shí)#delay //指定1項(xiàng)門延時(shí),括號(hào)可省略#(d1,d2) //指定2項(xiàng)門延時(shí)#(d1,d2,d3) //指定3項(xiàng)門延時(shí)10.6.1門延時(shí)例10.10采用門元件例化實(shí)現(xiàn)的鎖存器模塊。moduletri_latch(inputclock,data,enable,outputtriqout,nqout);not#5n1(ndata,data);nand#(3,5)n2(wa,data,clock),n3(wb,ndata,clock);nand#(12,15)n4(q,nq,wa),n5(nq,q,wb);bufif1#(3,7,13)q_drive(qout,q,enable),nq_drive(nqout,nq,enable);endmodule10.6Verilog中的延時(shí)定義1.賦值延時(shí)assign賦值延時(shí)指賦值符號(hào)右端表達(dá)式的操作數(shù)值發(fā)生變化到等號(hào)左端發(fā)生相應(yīng)變化的延時(shí)時(shí)間。如果沒有指定賦值延時(shí)值,默認(rèn)賦值延時(shí)為0。2.線網(wǎng)延時(shí)net型變量聲明時(shí)的延時(shí)與對(duì)其連續(xù)賦值的延時(shí),其含義是不同的,比如:wire#5sum; //線網(wǎng)延時(shí)assign#10sum=a+b; //連續(xù)賦值延時(shí)10.6.2賦值延時(shí)10.6Verilog中的延時(shí)定義1.賦值延時(shí)assign賦值延時(shí)指賦值符號(hào)右端表達(dá)式的操作數(shù)值發(fā)生變化到等號(hào)左端發(fā)生相應(yīng)變化的延時(shí)時(shí)間。如果沒有指定賦值延時(shí)值,默認(rèn)賦值延時(shí)為0。2.線網(wǎng)延時(shí)net型變量聲明時(shí)的延時(shí)與對(duì)其連續(xù)賦值的延時(shí),其含義是不同的,比如:wire#5sum; //線網(wǎng)延時(shí)assign#10sum=a+b; //連續(xù)賦值延時(shí)10.6.2賦值延時(shí)10.7specify塊與路徑延時(shí)模塊路徑延時(shí)需要用關(guān)鍵字specify和endspecify描述,這兩個(gè)關(guān)鍵字之間組成specify塊。specify塊是模塊中獨(dú)立的一部分,不能出現(xiàn)在其他語句塊(如initial、always等)中,specify塊有一個(gè)專用的關(guān)鍵字specparam來定義參數(shù),用法和parameter一樣。10.7.1specify塊specify示例,用specparam語句定義延時(shí)參數(shù)。moduledff_path(inputd,inputclk,outputregq);specifyspecparamt_rise=2:2.5:3;specparamt_fall=2:2.6:3;specparamt_turnoff=1.5:1.8:2.0;(clk=>q)=(t_rise,t_fall,t_turnoff);endspecifyalways@(posedgeclk)q<=d;endmodule10.7specify塊與路徑延時(shí)在specify塊中描述的路徑,稱為模塊路徑(modulepath),模塊路徑將信號(hào)源(source)與信號(hào)目標(biāo)(destination)配對(duì),信號(hào)源可以是單向(input端口)或雙向(inout端口);信號(hào)目標(biāo)也可以是單向(output端口)或雙向(inout端口),模塊路徑可以連接向量和標(biāo)量的任意組合。10.7.2模塊路徑延時(shí)系統(tǒng)任務(wù)$setup用來檢查設(shè)計(jì)中時(shí)序元件的建立時(shí)間約束條件;$hold用來檢查保持時(shí)間約束條件。(1)$setup的使用格式為:$setup(data_event,ref_event,setup_limit);
data_event:被檢查的信號(hào);
ref_event:用于檢查的參考信號(hào),一般為時(shí)鐘信號(hào)的跳變沿;
setup_limit:設(shè)置的最小建立時(shí)間。10.8.1$setup和$hold10.8時(shí)序檢查(2)$hold的使用格式為:$hold(ref_event,data_event,hold_limit);
data_event:被檢查的信號(hào);
ref_event:用于檢查的參考信號(hào),一般為時(shí)鐘信號(hào)的跳變沿;
hold_limit:設(shè)置的最小保持時(shí)間。10.8.1$setup和$hold10.8時(shí)序檢查$width的用法如下。$width(ref_event,time_limit);
ref_event:邊沿觸發(fā)事件;
time_limit:脈沖的最小寬度。$period的用法如下。$period(ref_event,time_limit);$period檢查邊沿觸發(fā)事件ref_event到下一個(gè)同向跳變沿之間的時(shí)間,用于時(shí)鐘周期的檢查,如果兩次同向跳邊沿之間的時(shí)間小于time_limit,則報(bào)告存在違反時(shí)序約束。10.8.2$width和$period10.8時(shí)序檢查激勵(lì)模塊(stimulus)類似于一個(gè)測(cè)試向量發(fā)生器(testvectorgenerator),向待測(cè)模塊(DesignUnderTest,DUT)施加激勵(lì)信號(hào),輸出檢測(cè)器(outputchecker)檢測(cè)輸出響應(yīng),將待測(cè)模塊在激勵(lì)向量作用下產(chǎn)生的輸出按規(guī)定的格式和方式(波形、文本或者VCD文件)進(jìn)行展示,供用戶檢查驗(yàn)證。10.9.1TestBench10.9TestBench測(cè)試?yán)?0.11產(chǎn)生復(fù)位信號(hào)和激勵(lì)信號(hào)的示例`timescale1ns/1nsmodulestimu_gen;regrst_n1,rst_n2;regclk=0; //clk賦初值rega,b;initialbegin //產(chǎn)生異步復(fù)位信號(hào)rst_n1=1;#65;rst_n1=0;#50;rst_n1=1;endinitialbeginrst_n2=1;@(negedgeclk)rst_n2=0;repeat(5)@(posedgeclk); //持續(xù)5個(gè)時(shí)鐘周期@(posedgeclk)rst_n2=1;end10.9.2產(chǎn)生激勵(lì)信號(hào)例10.11產(chǎn)生復(fù)位信號(hào)和激勵(lì)信號(hào)的示例alwaysbegin#10clk=~clk;end //產(chǎn)生時(shí)鐘信號(hào)initialbegina=0;b=0; //激勵(lì)波形描述#150a=1;b=0;#80b=1;#80a=0;#90$stop;endinitial$monitor($time,,,"rst_n1=%brst_n2=%b",rst_n1,rst_n2);//顯示initial$monitor($time,,,"a=%db=%d",a,b);endmodule10.9.2產(chǎn)生激勵(lì)信號(hào)復(fù)位信號(hào)和激勵(lì)信號(hào)波形例10.12產(chǎn)生時(shí)鐘信號(hào)`timescale1ns/1nsmoduleclk_gene;parameterCYCLE=20;regclk1,clk2,clk3,clk4;initial{clk1,clk2}=2'b01; //賦初值always#(CYCLE/2)clk1=~clk1; //用always過程產(chǎn)生時(shí)鐘clk1initialrepeat(12)#(CYCLE/2)clk2=~clk2;initialbeginclk3=0; //用initial過程產(chǎn)生時(shí)鐘clk3forever#(CYCLE/2)clk3=~clk3;endinitialbeginclk4=0;foreverbegin //用initial過程產(chǎn)生占空比非50%的時(shí)鐘clk4#(CYCLE/4)clk4=0;#(3*CYCLE/4)clk4=1;endendinitial$monitor($time,,,"clk1=%bclk2=%bclk3=%bclk4=%b",clk1,clk2,clk3,clk4);endmodule10.9.3產(chǎn)生時(shí)鐘信號(hào)時(shí)鐘信號(hào)波形例10.158位乘法器的TestBench測(cè)試示例`timescale1ns/100psmodulemult8_tb();parameterWIDTH=8;reg[WIDTH:1]a=0; //輸入信號(hào)reg[WIDTH:1]b=0;wire[WIDTH*2:1]out;//輸出信號(hào)parameterp=20;integeri,j;mult8#(.SIZE(WIDTH))i1(.opa(a),.opb(b),.resul(out));//待測(cè)模塊initial$monitor($time,,,"a*b=%b=%d",out,out);initialbeginfor(i=0;i<6;i=i+1)#pa={$random}%255; //產(chǎn)生隨機(jī)數(shù)#300$stop;end10.10測(cè)試示例例10.158位乘法器的TestBench測(cè)試示例initialbeginfor(j=0;j<6;j=i+1)#(p*2)b={$random}%255; //產(chǎn)生隨機(jī)數(shù)#300$stop;endendmodule//------------------------------------------modulemult8#(parameterSIZE=8) //8位乘法器(input[SIZE:1]opa,opb, //操作數(shù)output[2*SIZE:1]resul); //結(jié)果assignresul=opa*opb;endmodule10.10測(cè)試示例8位乘法器的測(cè)試波形圖例10.175位格雷碼計(jì)數(shù)器的TestBench測(cè)試代碼`timescale1ns/1nsmodulegray_count_tb;parameterWIDTH=5;parameterPERIOD=20; //定義時(shí)鐘周期為20nsregclk,rst;wire[WIDTH-1:0]count;wirecount_done;initialbeginclk=0;foreverbegin#(PERIOD/2)clk=~clk;endendinitialbeginrst<=0; //復(fù)位信號(hào)repeat(2)@(posedgeclk);rst<=1;endgray_count#(.WIDTH(WIDTH))i1(.rst(rst),.clk(clk),.count(count),.count_done(count_done));initial$monitor($time,,,"count=%b",count);endmodule10.10測(cè)試示例//---------待測(cè)的5位格雷碼計(jì)數(shù)器模塊---------------modulegray_count#(parameterWIDTH=5)(inputclk,rst,output[WIDTH-1:0]count,outputcount_done);reg[WIDTH-1:0]bin_cnt=0;reg[WIDTH-1:0]gray_cnt;always@(posedgeclk)beginif(!rst)beginbin_cnt<=0;gray_cnt<=0;endelsebeginbin_cnt<=bin_cnt+1;gray_cnt<=bin_cnt^bin_cnt>>>1;//二進(jìn)制轉(zhuǎn)格雷碼endendassigncount=gray_cnt;assigncount_done=(gray_cnt==0)?1:0;endmodule10.10測(cè)試示例5位格雷碼計(jì)數(shù)器的測(cè)試波形圖例10.188位二進(jìn)制加法器模塊和TestBench測(cè)試代碼。`timescale1ns/1nsmoduleadd8_tp; //測(cè)試模塊無端口列表reg[7:0]a,b; //輸入激勵(lì)信號(hào)定義為reg型regcin;wire[7:0]sum; //輸出信號(hào)定義為wire型wirecout;parameterDELY=100;add8u1(.a(a),.b(b),.cin(cin),.sum(sum),.cout(cout)); //待測(cè)試模
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年蚌埠經(jīng)濟(jì)技術(shù)職業(yè)學(xué)院輔導(dǎo)員招聘?jìng)淇碱}庫附答案
- 雷管制造工崗前生產(chǎn)安全培訓(xùn)考核試卷含答案
- 網(wǎng)球制作工創(chuàng)新方法測(cè)試考核試卷含答案
- 木門窗工安全知識(shí)考核試卷含答案
- 藏藥材種植員安全宣貫水平考核試卷含答案
- 精制鹽工安全風(fēng)險(xiǎn)能力考核試卷含答案
- 汽車發(fā)動(dòng)機(jī)再制造裝調(diào)工操作規(guī)程考核試卷含答案
- 2024年淮南師范學(xué)院馬克思主義基本原理概論期末考試題附答案
- 2025年上海電子信息職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘考試真題匯編附答案
- 2025年云南農(nóng)業(yè)大學(xué)輔導(dǎo)員招聘?jìng)淇碱}庫附答案
- 線纜及線束組件檢驗(yàn)標(biāo)準(zhǔn)
- 人工智能在金融策略中的應(yīng)用
- 口述史研究活動(dòng)方案
- 加工中心點(diǎn)檢表
- 水庫清淤工程可行性研究報(bào)告
- THBFIA 0004-2020 紅棗制品標(biāo)準(zhǔn)
- GB/T 25630-2010透平壓縮機(jī)性能試驗(yàn)規(guī)程
- GB/T 19610-2004卷煙通風(fēng)的測(cè)定定義和測(cè)量原理
- 精排版《化工原理》講稿(全)
- 市場(chǎng)營銷學(xué)-第12章-服務(wù)市場(chǎng)營銷課件
評(píng)論
0/150
提交評(píng)論