EDA技术与Verilog设计王金明版第11章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第11章仿真◆系统任务与系统函数◆用户自定义元件◆延时模型的表示◆数字电路的仿真内容第11章仿真11.1系统任务与系统函数系统任务和系统函数有以下一些共同的特点:◆系统任务和系统函数一般以符号“$”开头。例如:$monitor,$readmemh等。◆使用不同的Verilog仿真工具(如:VCS、Verilog-XL、ModelSim等)进行仿真时,这些系统任务和系统函数在使用方法上可能存在差异,应根据使用手册来使用。◆一般在intial或always过程块中,调用系统任务和系统函数。◆用户可以通过编程语言接口(PLI)将自己定义的系统任务和系统函数加到语言中,以进行仿真和调试。$display和$write是两个系统任务,两者的功能相同,都用于显示模拟结果,其区别是$display在输出结束后能自动换行,而$write不能。$display和$write的使用格式为:$display(“格式控制符”,输出变量名列表);$write(“格式控制符”,输出变量名列表);$display($time,,,“a=%hb=%hc=%h”,a,b,c);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字符%%符号%格式控制符转义字符$monitor、$strobe与$display、$write一样也是属于输出控制类的系统任务,$monitor与$strobe都提供了监控和输出参数列表中字符或变量的值的功能,其使用格式为:$monitor(“格式控制符”,输出变量名列表);$strobe(“格式控制符”,输出变量名列表);这里的格式控制符、输出变量名列表与$display和$write中定义的完全相同。2.$monitor与$strobe$time、$realtime是属于显示仿真时间标度的系统函数。这两个函数被调用时,都返回当前时刻距离仿真开始时刻的时间量值,所不同的是,$time函数以64位整数值的形式返回模拟时间,$realtime函数则以实数型数据返回模拟时间。3.$time与$realtime系统任务$finish与$stop用于对仿真过程进行控制,分别表示结束仿真和中断仿真。$finish与$stop的使用格式如下:$stop;$stop(n);$finish;$finish(n);n是$finish和$stop的参数,n可以是0、1、2等值,分别表示如下含义。0:不输出任何信息;1:给出仿真时间和位置;2:给出仿真时间和位置,还有其他一些运行统计数据。4.$finish与$stop$readmemh与$readmemb是属于文件读写控制的系统任务,其作用都是从外部文件中读取数据并放入存储器中。两者的区别在于读取数据的格式不同,$readmemh为读取十六进制数据,而$readmemb为读取二进制数据。$readmemh与$readmemb的使用格式为:$readmemh(数据文件名,存储器名,起始地址,结束地址);$readmemb(数据文件名,存储器名,起始地址,结束地址);其中,起始地址和结束地址均可以缺省,如果缺省起始地址,表示从存储器的首地址开始存储;如果缺省结束地址,表示一直存储到存储器的结束地址。5.$readmemh与$readmembreg[7:0]my_mem[0:255];//首先定义一个256个地址的存储器my_memintialbegin$readmemh(“mem.hex”,my_mem);end//将mem.hex中得数据装载到存储器my_mem中,起始地址从0开始intialbegin$readmemh(“mem.hex”,my_mem,80);end//将mem.hex中得数据装载到存储器my_mem中,起始地址从80开始5.$readmemh与$readmemb$random是产生随机数的系统函数,每次调用该函数将返回一个32位的随机数,该随机数是一个带符号的整数。6.$random与c语言类似,Verilog也提供了很多文件输出类的系统任务,可将结果输出到文件中。这类任务有:$fdisplay、$fwrite、$fmonitor、$fstrobe、$fopen和$fclose等。$fopen用于打开某个文件并准备写操作,$fclose用于关闭文件,而$fdisplay、$fwrite、$fmonitor等系统任务则用于把文本写入文件。7.文件输出11.2用户自定义元件利用UDP(UserDefinedPrimitives)用户可以自己定义基本逻辑元件的功能,用户可以象调用基本门元件一样来调用这些自己定义的元件。UDP关键词为primitive和endprimitive。与一般的模块相比,UDP模块具有下面一些特点:◆UDP的输出端口只能有一个,且必须位于端口列表的第一项。只有输出端口能被定义为reg类型。◆UDP的输入端口可有多个,一般时序电路UDP的输入端口可多至9个,组合电路UDP的输入端口可多至10个。◆所有的端口变量必须是1位标量。◆在table表项中,只能出现0、1、x三种状态,不能出现z状态。primitive元件名(输出端口,输入端口1,输入端口2,…)output输出端口名;input输入端口1,输入端口2,…;reg输出端口名;initialbegin输出端口或内部寄存器赋初值(0,1或x);endtable//输入1输入2……:输出真值列表endtableendprimitive定义UDP的语法11.2.1组合电路UDP元件primitivecarry_udp(cout,cin,a,b);inputcin,a,b;outputcout;table//cinab:cout//真值表000:0;010:0;001:0;011:1;100:0;101:1;110:1;111:1;endtableendprimitive1位全加器进位输出UDP11.2.1组合电路UDP元件primitivecarry_udpx(cout,cin,a,b);inputcin,a,b;outputcout;table//cinab:cout//真值表000:0;010:0;001:0;011:1;100:0;101:1;110:1;111:1;00x:0;0x0:0;x00:0;11x:1;1x1:1;x11:1;endtableendprimitive包含x态输入的1位全加器进位输出UDP元件primitivecarry_udpx(cout,cin,a,b);inputcin,a,b;outputcout;table//cinab:cout//真值表?00:0;//只要有两个输入为0,则进位输出肯定为00?0:0;00?:0;?11:1;//只要有两个输入为1,则进位输出肯定为11?1:1;11?:1;endtableendprimitive用简缩符“?”表述的1位全加器进位输出UDP元件11.2.2时序逻辑UDP元件primitivelatch(Q,clk,reset,D);inputclk,reset,D;outputQ;regQ;initialQ=1'b1;//初始化table//clkresetD:state:Q?1?:?:0;000:?:0;001:?:1;10?:?:-;endtableendprimitive电平敏感的1位数据锁存器UDP元件primitiveDFF(Q,D,clk);inputD,clk;outputQ;regQ;table//clkD:state:Q(01)0:?:0;//上升沿到来,输出Q=D(01)1:?:1;(0x)1:1:1;(0x)0:0:0;(?0)?:?:-;//没有上升沿到来,输出Q保持原值?(??):?:-;//时钟不变,输出也不变endtableendprimitive上升沿触发的D触发器UDP元件缩记符含义说明x不定态?0、1或x只能表示输入b0或1只能表示输入-保持不变只用于时序元件的输出(vy)代表(01),(10),(0x),(1x),(x1),(x0),(?1)等从逻辑v到逻辑y的转变*同(??)表示输入端有任何变化R或r同(01)表示上升沿F或f同(10)表示下降沿P或p(01),(0x)或(x1)包含x态的上升沿跳变N或n(10),(1x)或(x0)包含x态的下降沿跳变UDP中的缩记符11.3延时模型的表示在仿真中,还涉及到延时表示的问题。延时包括门延时、assign赋值延时和连线延时等。门延时是从门输入端发生变化到输出端发生变化的延迟时间;assign赋值延时指等号右端某个值发生变化到等号左端发生相应变化的延迟时间;连线延时则体现了信号在连线上的传输延时。如果没有定义时延值,缺省时延为0。11.3.1时间标尺定义’timescale`timescale语句用于定义模块的时间单位和时间精度,其使用格式如下:`timescaletime_unit/time_precision`timescale时间单位/时间精度其中用来表示时间度量的符号有:s、ms、us、ns、ps和fs。例如:`timescale1ns/100ps上面的语句表示时延单位为1ns,时延精度为100ps(即精确到0.1ns)。`timescale编译器指令在模块说明外部出现,并且影响后面所有的时延值。’timescale使用举例`timescale1ns/100psmoduleAndgate(out,A,B);inputA,B;outputout;and#(4.34,5.86)A1(out,A,B);//#(4.34,5.86)规定了上升及下降延时值endmodule11.3.2延时的表示与延时说明块1.延时的表示方法延时的表示方法有下面几种:#delaytime#(d1,d2)#(d1,d2,d3)#delaytime表示延迟时间为delaytime,d1表示上升延迟,d2表示下降延迟,d3则表示转换到高阻态z的延迟,这些延迟的具体时间由时间定义语句'timescale确定。时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。如果没有定义时延值,缺省时延为0。Verilog可对模块中某一指定的路径进行延迟定义,这一路径连接模块的输入端口(或inout端口)与输出端口(或inout端口),利用延迟定义块在一个独立的块结构中定义模块的延时。在延迟定义块中要描述模块中的不同路径并给这些路径赋值。延迟定义块的内容应放在关键字specify与endspecify之间,且必须放在一个模块中,还可以使用specparam关键字定义参数2.延时说明块(specify块)延时定义块举例moduledelay(out,a,b,c);inputa,b,c;outputout;anda1(n1,a,b);oro1(out,c,n1);specify(a=out)=2;//定义从a到out的延时为2(b=out)=3;//定义从b到out的延时为3(c=out)=1;//定义从c到out的延时为1endspecifyendmodule11.4数字电路的仿真11.4.1测试平台(TestBanch)◆测试模块只有模块名字,没有端口列表;◆输入信号(激励信号)必须定义为reg型,以保持信号值;输出信号(显示信号)必须定义为wire型;◆在测试模块中调用被测试模块,在调用时,应注意端口排列的顺序与模块定义时一致;◆一般用initial、always过程块来定义激励信号波形;使用系统任务和系统函数来定义输出显示格式;◆在激励信号的定义中,可使用如下一些控制语句:if-else,for,forever,ca

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功