第11章仿真教材_第1页
第11章仿真教材_第2页
第11章仿真教材_第3页
第11章仿真教材_第4页
第11章仿真教材_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章仿真◆系统任务与系统函数◆用户自定义元件◆延时模型的表示◆数字电路的仿真内容第11章仿真11.1系统任务与系统函数

概述1)系统任务和系统函数主要是用于仿真的;2)系统任务和系统函数一般以符号“$”开头。例如:

$monitor,$readmemh等。3)使用不同的Verilog仿真工具(如:VCS、Verilog-XL、

ModelSim等)进行仿真时,这些系统任务和系统函数在使用方法上可能存在差异,应根据使用手册来使用。4)一般在intial或always过程块中,调用系统任务和系统函数。5)用户可以通过编程语言接口(PLI)将自己定义的系统任务和系统函数加到语言中,以进行仿真和调试。$display和$write是两个系统任务,两者的功能相同,都用于显示仿真结果,其区别是$display在输出结束后能自动换行,而$write不能。$display和$write的使用格式为:$display(“格式控制符”,输出变量名列表);$write(“格式控制符”,输出变量名列表);格式控制符:控制显示信号的格式输出变量名列表:要显示的信号的名称。1.$display与$write格式控制符说明%h或%H以16进制形式显示%d或%D以10进制形式显示%o或%O以8进制形式显示%b或%B以2进制形式显示%c或%C以ASCII字符形式显示%v或%V显示net型数据的驱动强度%m或%M显示层次名%s或%S以字符串形式输出%t或%T以当前的时间格式显示转义字符说明\n换行\tTAB键\\符号\\“符号“\ddd

八进制数ddd对应的ASCII字符%%符号%格式控制符转义字符1.$display与$write1)用于仿真结果的输出`timescale1ns/1nsmodulewytest;reg

a,b,c;initialbegina=0;b=1;c=0;#100c=1;

$display($time,,,"a=%db=%dc=%d",a,b,c);b=0;

$display($time,,,"a=%db=%dc=%d",a,b,c);#100a=1;b=1;endendmodule100a=0b=1c=1100a=0b=0c=1

$write($time,,,"a=%db=%dc=%d",a,b,c);

$write($time,,,"a=%db=%dc=%d",a,b,c);

100a=0b=1c=1100a=0b=0c=1赋值方式都改为非阻塞型赋值`timescale1ns/1nsmodulewytest;reg

a,b,c;initialbegina<=0;b<=1;c<=0;#100c<=1;

$display($time,,,"a=%db=%dc=%d",a,b,c);b<=0;

$display($time,,,"a=%db=%dc=%d",a,b,c);#100a<=1;b<=1;endendmodule100a=0b=1c=0100a=0b=1c=0

2)用display可以显示字符串

$display(“itisaexamplefordisplay!\n”)转义字符的显示:moduledisp;initialbegin

$display(“\\\t\\\n\”\123”);end显示结果:\\“s//八进制数123对应的ASCII的字符为S$monitor、$strobe与$display、$write一样也是属于输出控制类的系统任务,$monitor与$strobe都提供了监控和输出参数列表中字符或变量的值的功能.使用格式为:$monitor(“格式控制符”,输出变量名列表);$strobe(“格式控制符”,输出变量名列表);

这里的格式控制符、输出变量名列表与$display和$write中定义的完全相同。运行机制:$monitor:相当于一个实时监控器,只要输出变量列表中的任何变量发生了变化,则系统按$monitor中指定的格式将结果输出一次。$strobe:只有当仿真模拟时间发生变化时,并且在该时刻的所有事件都处理完成了,才输出结果2.$monitor与$strobe0a=0b=1c=0100a=1b=1c=1200a=1b=0c=1300a=0b=1c=0400a=1b=0c=1`timescale1ns/1nsmodulewytest;reg

a,b,c;initialbegina<=0;b<=1;c<=0;#100a<=1;b<=1;c<=1;#100a<=1;b<=0;c<=1;#100a<=0;b<=1;c<=0;#100a<=1;b<=0;c<=1;endinitialbegin$monitor($time,,,"a=%db=%dc=%d",a,b,c);endendmodule`timescale1ns/1nsmodulewytest;reg

a,b,c;initialbegina=0;b=1;c=0;#100a=1;

$strobe($time,,,"a=%db=%dc=%d",a,b,c);b=1;c=1;#100a=1;b=0;

$strobe($time,,,"a=%db=%dc=%d",a,b,c);c=1;endendmodule100a=1b=1c=1200a=1b=0c=1100a=1b=1c=0200a=1b=0c=1

$display($time,,,"a=%db=%dc=%d",a,b,c);

$display($time,,,"a=%db=%dc=%d",a,b,c);

`timescale1ns/1nsmodulewytest;reg

a,b,c;initialbegina<=0;b<=1;c<=0;#100a<=1;b<=1;c<=1;

$strobe($time,,,"a=%db=%dc=%d",a,b,c);

#100a<=1;b<=0;c<=1;

$strobe($time,,,"a=%db=%dc=%d",a,b,c);

endendmodule#100a=1b=1c=1#200a=1b=0c=1

$display($time,,,"a=%db=%dc=%d",a,b,c);

$display($time,,,"a=%db=%dc=%d",a,b,c);

#100a=0b=1c=0#200a=1b=1c=1$time、$realtime是属于显示仿真时间标度的系统函数。这两个函数被调用时,都返回当前时刻距离仿真开始时刻的时间量值,$time函数以64位整数值的形式返回模拟时间(基本仿真时间的个数,而不是绝对的时间值);$realtime

函数则以实数型数据返回模拟时间(基本仿真时间的个数,而不是绝对的时间值)。

3.$time与$realtime`timescale10ns/1nsmodulewytest;reg

ts;parameterdelay=2.6;initialbegin#delayts=1;#delayts=0;#delayts=1;#delayts=0;endinitial$monitor($time,,,"ts=%b",ts);endmodule3.$time与$realtime#0ts=x#3ts=1#5ts=0#8ts=1#10ts=0($realtime,,,"ts=%b",ts);#0ts=x#2.6ts=1#5.2ts=0#7.8ts=1#10.4ts=0系统任务$finish与$stop用于对仿真过程进行控制,分别表示结束仿真和中断仿真。$finish与$stop的使用格式如下:$stop;$stop(n);$finish;$finish(n);n是$finish和$stop的参数,n可以是0、1、2等值,分别表示如下含义。0:不输出任何信息;1:给出仿真时间和位置;2:给出仿真时间和位置,还有其他一些运行统计数据。$stop、$finish不带参数,则默认参数值为1.4.$finish与$stop4.$finish与$stop`timescale10ns/1nsmodulewytest;reg

ts;parameterdelay=2.6;initialbegin#delayts=1;#delayts=0;#delayts=1;#delayts=0;#delay$stop(2);endinitial$monitor($realtime,,,"ts=%b",ts);endmodule#$stop:C:/modeltech_6.5/examples/wytest.v(11)#Time:130nsIteration:0Instance:/wytest#BreakinModulewytestatC:/modeltech_6.5/examples/wytest.vline11vsim28>quit作用:$readmemh与$readmemb是属于文件读写控制的系统任务,其都是从外部文件中读取数据并

放入存储器中。区别:读取数据的格式不同,$readmemh为读取十六进制数据,而$readmemb为读取二进制数据。使用格式:$readmemh("数据文件名",存储器名,起始地址,结束地址);$readmemb("数据文件名",存储器名,起始地址,结束地址);其中,起始地址和结束地址均可以缺省,如果缺省起始地址,表示从存储器的首地址开始存储;如果缺省结束地址,表示一直存储到存储器的结束地址。5.$readmemh与$readmembreg[7:0]my_mem[0:255];//定义一个256个地址的存储器initialbegin$readmemh(“mem.hex”,my_mem);end//将mem.hex的数据装载到存储器my_mem,从起始地址0

一直装到存储器结束地址。initialbegin$readmemh(“mem.hex”,my_mem,80);end//将mem.hex的数据装载到存储器my_mem,从起始地址80

一直装到存储器结束地址。5.$readmemh与$readmemb$random是产生随机数的系统函数,每次调用该函数将返回一个32位的随机数,该随机数是一个带符号的整数。6.$random#10data=00010010000101010011010100100100#20data=11000000100010010101111010000001#30data=10000100100001001101011000001001#40data=10110001111100000101011001100011#50data=00000110101110010111101100001101#60data=01000110110111111001100110001101`timescale10ns/1nsmodulewytest;integerdata;integeri;parameterdelay=10;initialbegin$monitor($time,,,"data=%b",data);endinitialbegin

for(i=0;i<=5;i=i+1)#delaydata=$random;endendmodule与c语言类似,Verilog也提供了很多文件输出类的系统任务,可将结果输出到文件中。这类任务有:$fdisplay、$fwrite、$fmonitor、$fstrobe、$fopen和$fclose等。$fopen用于打开某个文件并准备写操作,$fclose用于关闭文件,$fdisplay、$fwrite、$fmonitor等系统任务则用于把文本写入文件。7.文件输出11.3延时模型的表示

延时:包括门延时、assign赋值延时和连线延时等。门延时:门输入端发生变化到输出端发生变化的延迟时间;assign赋值延时:等号右端某个值发生变化到等号左端发生相应变化的延迟时间;连线延时:信号在连线上的传输延时。如果没有定义时延值,缺省时延为0。11.3.1时间标尺定义’timescale

`timescale语句用途:用于定义模块的时间单位和时间精度。使用格式:

`timescale<时间单位>/<时间精度>

其中用来表示时间度量的符号有:

smsusnsps

fs

秒10-3秒10-6秒10-9秒10-12秒10-15秒例如:`timescale1ns/100ps

表示延时单位为1ns,时延精度为100ps(即精确到0.1ns)。

`timescale编译器指令在模块说明外部出现,并且影响后面所有的时延值。11.3.1时间标尺定义’timescale

例:`timescale1ns/1nsmodulewytest;reg

a,b,c;initialbegina<=0;b<=1;c<=0;#50.8a<=1;b<=1;c<=1;#100.4a<=1;b<=0;c<=1;endendmodule#50.851ns#100.4100ns1ns/100ps#50.850.8ns#100.4100.4ns11.3.2延时的表示与延时说明块

1.延时的表示方法延时的表示方法有下面几种:

#delaytime#(d1,d2)#(d1,d2,d3)

#delaytime表示延迟时间为delaytime,,为一个常数。

d1表示上升延迟,d2表示下降延迟,d3则表示转换到高阻态z的延迟,这些延迟的具体时间由时间定义语句‘timescale规定的时间刻度所决定。

如果没有定义时延值,缺省时延为0。例:

not#4gate1(out,in);//延时时间为4的非门

and#(5,7)gate2(out,a,b)//与门的上升延时为5,下降延时为7or#5gate3(out,a,b)//或门的上升、下降延时都为5

bufif0#(3,4,6)gate(out,in,enable)

//三态门的上升时延为3,下降时延为4,高阻时延为6

assign#(50)out=a+b;//a或b发生变化,到out发生变化的时间为5011.3.2延时的表示与延时说明块

Verilog可对程序模块中某一指定的路径进行延迟定义。

这一路径连接模块的输入端口(或inout端口)与输出端口(或inout端口)。在延迟定义块中要描述模块中的不同路径并给这些路径赋值。延迟定义块的内容应放在关键字specify与endspecify之间,且必须放在一个模块中。2.延时说明块(specify块)例:moduledelay(out,a,b,c);inputa,b,c;outputout;anda1(n1,a,b);oro1(out,c,n1);

specify(a=>out)=2;(b=>out)=3;(c=>out)=1;

endspecify

endmodule

2.延时说明块(specify块)cabout11.4数字电路的仿真

11.4.1测试平台(TestBanch)1.概念

为测试或仿真一个verilog程序而搭建的一个平台。平台的核心是一个用于产生仿真激励信号给被测程序模块,同时调用系统函数显示仿真结果的verilog仿真测试程序。配合仿真软件提供的环境和其他工具,构成一个仿真测试的平台。11.4.1测试平台(TestBanch)测试平台仿真程序被测模块激励信号(reg)激励向量输入端口输出端口显示信号(wire)输出显示波形或打印显示2.仿真测试程序的特点及要求◆测试模块只有模块名字,没有端口列表;◆输入信号(激励信号)必须定义为reg型,以保持信号值;输出信号(显示信号)必须定义为wire型;◆在测试模块中调用被测试模块,在调用时,应注意端口排列的顺序与模块定义时一致;◆一般用initial、always过程块来定义激励信号波形;使用系统任务和系统函数来定义输出显示格式;◆在激励信号的定义中,可使用如下一些控制语句:

if-else,for,forever,case,while,repeat,

wait,disable,force,release,begin-end,

fork-join等,这些控制语句一般只用在always、

initial、function、task等过程块中。

11.4.1测试平台(TestBanch)11.4.1测试平台(TestBench)测试程序的一般结构数据类型说明//激励信号reg型//输出显示信号wire型intergerparameter调用被测试模块激励信号定义(always、initial等)显示格式定义($monitor等)module仿真模块名//无端口列表激励波形的产生例11.13用initial语句产生激励波形`timescale1ns/1nsmodulewytest;reg

a,b,c;initialbegina=0;b=1;c=0;#100c=1;#100a=1;b=0;#100a=0;#100c=0;#100$finish;endinitial$monitor($time,,,"a=%db=%dc=%d",a,b,c);endmodule例11.14用always语句产生时钟波形激励波形的产生`timescale1ns/1nsmodulewytest;reg

clk;parameterCYCLE=100;always#(CYCLE/2)clk=~clk;initialclk=1;endmodule11.4.2组合电路的仿真

`timescale10ns/1nsmodulemult_tp;//测试模块的名字reg[7:0]a,b; //测试输入信号定义为reg型wire[15:0]out; //测试输出信号定义为wire型integeri,j;mult8m1(out,a,b); //调用测试对象initial //激励波形设定begin a=0;b=0;for(i=1;i<255;i=i+1)#10a=i;end

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论