版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字系统设计与VerilogHDL(第9版)数字系统设计与VerilogHDL(第9版)第10章
TestBench测试与时序检查10.1系统任务与系统函数10.2显示类任务10.3文件操作类任务
10.4控制和时间类任务10.5随机数与概率分布函数10.6Verilog中的延时定义10.7specify块与模块路径延时10.8时序检查10.9TestBench测试10.10测试示例10.11ModelSimSE使用指南VerilogHDL的系统任务和系统函数主要用于仿真。系统任务和系统函数均以符号“$”开头,一般在intial或always过程块中对其进行调用;用户也可以通过编程语言接口(PLI)将自己定义的系统任务和系统函数加到系统中,用于仿真和调试。10.1系统任务与系统函数$display和$write用于输出仿真结果,可以把变量和代码运行结果打印在TCL窗口上,供调试者知晓代码运行情况。使用格式:$display("格式控制符",输出变量名列表);$write("格式控制符",输出变量名列表);比如:$display($time,,,"a=%hb=%hc=%h",a,b,c);10.2显示类任务10.2.1
$display与$write$strobe与$monitor都提供了监控和输出参数列表中字符或变量的值的功能。使用格式:$monitor(“格式控制符”,输出变量名列表);$strobe(“格式控制符”,输出变量名列表);示例:$monitor($time,"a=%bb=%h",a,b);10.2显示类任务10.2.2$strobe与$monitor$fopen用于打开某个文件并准备写操作,其格式如下。fd=$fopen("file_name");fd=$fopen("file_name",mode);$fclose用于关闭文件,其格式如下。$fclose(fd);10.3文件操作类任务10.3.1$fopen与$fclose1.$fgetc$fgetc每次从文件读取1个字符(character),其使用格式如下。c=$fgetc(fd)2.$fgets$fgets是按行(line)读取文件,其使用方式如下。integercode=$fgets(str,fd);10.3文件操作类任务10.3.2$fgetc与$fgets$readmemh与$readmemb作用都是从外部文件中读取数据并放入存储器中。两者的区别在于读取数据的格式不同,$readmemh为读取十六进制数据,而$readmemb为读取二进制数据。$readmemb的使用方式。1)$readmemb("数据文件名",存储器名);2)$readmemb("数据文件名",存储器名,起始地址);3)$readmemb("数据文件名",存储器名,起始地址,结束地址);10.3文件操作类任务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在当前工程目录下准备一个名为myfile.txt的文件,将其内容填写如下0123456789ABCDEF用ModelSim仿真后的输出如下,说明myfile.txt中的数据已装载到存储器中0123456789abcdefxxxxxxxxendmodule系统任务$finish与$stop用于控制仿真的执行过程,$finish是结束本次仿真;$stop是暂停(中断)当前的仿真,仿真暂停后通过仿真工具菜单或命令行还可以使仿真继续进行。使用格式:$stop;$stop(n);$finish;$finish(n);10.4控制和时间类任务10.4.1$finish与$stop$time、$stime和$realtime都属于显示仿真时间标度的系统函数。这3个函数被调用时,均返回当前时刻距离仿真开始时刻的时间量值,不同之处如下。
$time:返回一个64位整数型时间值。
$stime:返回一个32位整数型时间值。
$realtime:返回一个实数型时间值,可以是浮点数。10.4控制和时间类任务10.4.2$time、$stime与$realtime1.$printtimescale$printtimescale用于显示指定模块的时间单位和精度。其使用格式如下。$printtimescale(模块名);2.$timeformat$timeformat的用法如下。$timeformat(units,precision,suffix_string,min_width);10.4控制和时间类任务10.4.3$printtimescale与$timeformat例10.7任务$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运行例10.7的输出信息如下所示:Timescaleof(a_dat)is1ns/1psTimescaleof(a_dat.b1)is10fs/1fsTimescaleof(a_dat.b1.c1)is10ns/1ns10.5随机数及概率分布函数$random$random是产生随机数的系统函数,每次调用该函数将返回一个32位的随机数(有符号整数)。使用格式。
$random<seed>;例10.9$random函数的使用示例`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;//每次产生一个-99~99之间的随机数endendinitialbeginclk=0; //用initial过程产生时钟clkforever#(CY/2)clk=~clk;endendmodule产生随机数10.6Verilog中的延时定义门延时是从门输入端发生变化到门输出端发生变化的延迟时间,其表示方法如下:#(delay) //指定1项门延时#delay //指定1项门延时,括号可省略#(d1,d2) //指定2项门延时#(d1,d2,d3) //指定3项门延时10.6.1门延时例10.10采用门元件例化实现的锁存器模块。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中的延时定义1.赋值延时assign赋值延时指赋值符号右端表达式的操作数值发生变化到等号左端发生相应变化的延时时间。如果没有指定赋值延时值,默认赋值延时为0。2.线网延时net型变量声明时的延时与对其连续赋值的延时,其含义是不同的,比如:wire#5sum; //线网延时assign#10sum=a+b; //连续赋值延时10.6.2赋值延时10.6Verilog中的延时定义1.赋值延时assign赋值延时指赋值符号右端表达式的操作数值发生变化到等号左端发生相应变化的延时时间。如果没有指定赋值延时值,默认赋值延时为0。2.线网延时net型变量声明时的延时与对其连续赋值的延时,其含义是不同的,比如:wire#5sum; //线网延时assign#10sum=a+b; //连续赋值延时10.6.2赋值延时10.7specify块与路径延时模块路径延时需要用关键字specify和endspecify描述,这两个关键字之间组成specify块。specify块是模块中独立的一部分,不能出现在其他语句块(如initial、always等)中,specify块有一个专用的关键字specparam来定义参数,用法和parameter一样。10.7.1specify块specify示例,用specparam语句定义延时参数。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块与路径延时在specify块中描述的路径,称为模块路径(modulepath),模块路径将信号源(source)与信号目标(destination)配对,信号源可以是单向(input端口)或双向(inout端口);信号目标也可以是单向(output端口)或双向(inout端口),模块路径可以连接向量和标量的任意组合。10.7.2模块路径延时系统任务$setup用来检查设计中时序元件的建立时间约束条件;$hold用来检查保持时间约束条件。(1)$setup的使用格式为:$setup(data_event,ref_event,setup_limit);
data_event:被检查的信号;
ref_event:用于检查的参考信号,一般为时钟信号的跳变沿;
setup_limit:设置的最小建立时间。10.8.1$setup和$hold10.8时序检查(2)$hold的使用格式为:$hold(ref_event,data_event,hold_limit);
data_event:被检查的信号;
ref_event:用于检查的参考信号,一般为时钟信号的跳变沿;
hold_limit:设置的最小保持时间。10.8.1$setup和$hold10.8时序检查$width的用法如下。$width(ref_event,time_limit);
ref_event:边沿触发事件;
time_limit:脉冲的最小宽度。$period的用法如下。$period(ref_event,time_limit);$period检查边沿触发事件ref_event到下一个同向跳变沿之间的时间,用于时钟周期的检查,如果两次同向跳边沿之间的时间小于time_limit,则报告存在违反时序约束。10.8.2$width和$period10.8时序检查激励模块(stimulus)类似于一个测试向量发生器(testvectorgenerator),向待测模块(DesignUnderTest,DUT)施加激励信号,输出检测器(outputchecker)检测输出响应,将待测模块在激励向量作用下产生的输出按规定的格式和方式(波形、文本或者VCD文件)进行展示,供用户检查验证。10.9.1TestBench10.9TestBench测试例10.11产生复位信号和激励信号的示例`timescale1ns/1nsmodulestimu_gen;regrst_n1,rst_n2;regclk=0; //clk赋初值rega,b;initialbegin //产生异步复位信号rst_n1=1;#65;rst_n1=0;#50;rst_n1=1;endinitialbeginrst_n2=1;@(negedgeclk)rst_n2=0;repeat(5)@(posedgeclk); //持续5个时钟周期@(posedgeclk)rst_n2=1;end10.9.2产生激励信号例10.11产生复位信号和激励信号的示例alwaysbegin#10clk=~clk;end //产生时钟信号initialbegina=0;b=0; //激励波形描述#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产生激励信号复位信号和激励信号波形例10.12产生时钟信号`timescale1ns/1nsmoduleclk_gene;parameterCYCLE=20;regclk1,clk2,clk3,clk4;initial{clk1,clk2}=2'b01; //赋初值always#(CYCLE/2)clk1=~clk1; //用always过程产生时钟clk1initialrepeat(12)#(CYCLE/2)clk2=~clk2;initialbeginclk3=0; //用initial过程产生时钟clk3forever#(CYCLE/2)clk3=~clk3;endinitialbeginclk4=0;foreverbegin //用initial过程产生占空比非50%的时钟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产生时钟信号时钟信号波形例10.158位乘法器的TestBench测试示例`timescale1ns/100psmodulemult8_tb();parameterWIDTH=8;reg[WIDTH:1]a=0; //输入信号reg[WIDTH:1]b=0;wire[WIDTH*2:1]out;//输出信号parameterp=20;integeri,j;mult8#(.SIZE(WIDTH))i1(.opa(a),.opb(b),.resul(out));//待测模块initial$monitor($time,,,"a*b=%b=%d",out,out);initialbeginfor(i=0;i<6;i=i+1)#pa={$random}%255; //产生随机数#300$stop;end10.10测试示例例10.158位乘法器的TestBench测试示例initialbeginfor(j=0;j<6;j=i+1)#(p*2)b={$random}%255; //产生随机数#300$stop;endendmodule//------------------------------------------modulemult8#(parameterSIZE=8) //8位乘法器(input[SIZE:1]opa,opb, //操作数output[2*SIZE:1]resul); //结果assignresul=opa*opb;endmodule10.10测试示例8位乘法器的测试波形图例10.175位格雷码计数器的TestBench测试代码`timescale1ns/1nsmodulegray_count_tb;parameterWIDTH=5;parameterPERIOD=20; //定义时钟周期为20nsregclk,rst;wire[WIDTH-1:0]count;wirecount_done;initialbeginclk=0;foreverbegin#(PERIOD/2)clk=~clk;endendinitialbeginrst<=0; //复位信号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测试示例//---------待测的5位格雷码计数器模块---------------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;//二进制转格雷码endendassigncount=gray_cnt;assigncount_done=(gray_cnt==0)?1:0;endmodule10.10测试示例5位格雷码计数器的测试波形图例10.188位二进制加法器模块和TestBench测试代码。`timescale1ns/1nsmoduleadd8_tp; //测试模块无端口列表reg[7:0]a,b; //输入激励信号定义为reg型regcin;wire[7:0]sum; //输出信号定义为wire型wirecout;parameterDELY=100;add8u1(.a(a),.b(b),.cin(cin),.sum(sum),.cout(cout)); //待测试模
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025 年食品卫生知识竞赛培训试题及答案
- 地震科普教育班会
- 2026年中国保温杯行业市场前景分析预测报告(节选-市场需求)
- 心血管疾病的营养治疗与护理
- 2026年工业控制系统组态实习报告
- 2026年中国电子鼻咽喉内镜行业市场前景预测及投资价值评估分析报告
- 2026年中国电动油泵行业市场前景预测及投资价值评估分析报告
- 财会入门技能实训案例讲解
- 互联网企业数据隐私保护政策与实务
- 幼儿园家长沙龙活动策划方案
- 非因工伤病劳动能力鉴定申请表
- 危大工程全面判定表
- 安全生产管理机构设置和人员配备制度
- 郭店竹简《老子》考释札记
- 导电高分子与其复合材料
- 攻略:炎龙骑士团2
- 市北资优六年级分册 第10章 10.6 探索用平面截正方体所得截面形状 郑斌
- 高二物理竞赛力学课件
- GA 423-2015警用防弹盾牌
- 材料作文“空白罚单”作文导写
- 农业机械安全操作规程手册课件
评论
0/150
提交评论