收藏 分享(赏)

EDA技术与Verilog设计第11章.ppt

上传人:dreamzhangning 文档编号:5583407 上传时间:2019-03-08 格式:PPT 页数:30 大小:189.50KB
下载 相关 举报
EDA技术与Verilog设计第11章.ppt_第1页
第1页 / 共30页
EDA技术与Verilog设计第11章.ppt_第2页
第2页 / 共30页
EDA技术与Verilog设计第11章.ppt_第3页
第3页 / 共30页
EDA技术与Verilog设计第11章.ppt_第4页
第4页 / 共30页
EDA技术与Verilog设计第11章.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、第11章 仿真, 系统任务与系统函数 用户自定义元件 延时模型的表示 PLD的编程元件 数字电路的仿真,内容,第11章 仿真,11.1 系统任务与系统函数, 系统任务和系统函数一般以符号“$”开头。例如:$monitor,$readmemh等。 使用不同的Verilog仿真工具(如:VCS、Verilog-XL、ModelSim等)进行仿真时,这些系统任务和系统函数在使用方法上可能存在差异,应根据使用手册来使用。 一般在intial或always过程块中,调用系统任务和系统函数。 用户可以通过编程语言接口(PLI)将自己定义的系统任务和系统函数加到语言中,以进行仿真和调试。,$display和

2、$write是两个系统任务,两者的功能相同,都用于显示模拟结果,其区别是$display在输出结束后能自动换行,而$write不能。 $display和$write的使用格式为: $display(“格式控制符”,输出变量名列表); $write(“格式控制符”,输出变量名列表);,1$display与$write,格式控制符,转义字符,$monitor、$strobe与$display、$write一样也是属于输出控制类的系统任务,$monitor与$strobe都提供了监控和输出参数列表中字符或变量的值的功能,其使用格式为: $monitor(“格式控制符”,输出变量名列表); $stro

3、be(“格式控制符”,输出变量名列表); 这里的格式控制符、输出变量名列表与$display和$write中定义的完全相同。,2$monitor与$strobe,$time、$realtime是属于显示仿真时间标度的系统函数。这两个函数被调用时,都返回当前时刻距离仿真开始时刻的时间量值,所不同的是,$time 函数以64位整数值的形式返回模拟时间,$realtime 函数则以实数型数据返回模拟时间。,3$time与$realtime,系统任务$finish与$stop用于对仿真过程进行控制,分别表示结束仿真和中断仿真。 $finish与$stop 的使用格式如下: $stop; $stop(n

4、); $finish; $finish(n); n是$finish和$stop的参数,n 可以是0、1、2等值,分别表示如下含义。 0:不输出任何信息; 1:给出仿真时间和位置; 2:给出仿真时间和位置,还有其他一些运行统计数据。,4$finish与$stop,$readmemh与$readmemb是属于文件读写控制的系统任务,其作用都是从外部文件中读取数据并放入存储器中。两者的区别在于读取数据的格式不同,$readmemh为读取十六进制数据,而$readmemb为读取二进制数据。$readmemh与$readmemb的使用格式为: $readmemh(“数据文件名“,存储器名,起始地址,结束

5、地址); $readmemb(“数据文件名“,存储器名,起始地址,结束地址); 其中,起始地址和结束地址均可以缺省,如果缺省起始地址,表示从存储器的首地址开始存储;如果缺省结束地址,表示一直存储到存储器的结束地址。,5$readmemh与$readmemb,$random是产生随机数的系统函数,每次调用该函数将返回一个32位的随机数,该随机数是一个带符号的整数。,6$random,与c 语言类似,Verilog也提供了很多文件输出类的系统任务,可将结果输出到文件中。这类任务有:$fdisplay、$fwrite、$fmonitor、$fstrobe、$fopen和$fclose等。 $fope

6、n用于打开某个文件并准备写操作,$fclose用于关闭文件,而$fdisplay、$fwrite、$fmonitor等系统任务则用于把文本写入文件。,7文件输出,11.2 用户自定义元件,利用UDP(User Defined Primitives)用户可以自己定义基本逻辑元件的功能,用户可以象调用基本门元件一样来调用这些自己定义的元件。UDP关键词为primitive和endprimitive。与一般的模块相比,UDP模块具有下面一些特点: UDP的输出端口只能有一个,且必须位于端口列表的第一项。只有输出端口能被定义为reg类型。 UDP的输入端口可有多个,一般时序电路UDP的输入端口可多至9

7、个,组合电路UDP的输入端口可多至10个。 所有的端口变量必须是1位标量。 在table表项中,只能出现0、1、x三种状态,不能出现z状态。,primitive 元件名(输出端口,输入端口1,输入端口2,) output 输出端口名; input 输入端口1,输入端口2,; reg输出端口名; initial begin输出端口或内部寄存器赋初值(0,1或x);end table/输入1 输入2 :输出真值列表 endtable endprimitive,定义UDP的语法,11.2.1 组合电路UDP元件,primitive carry_udpx(cout,cin,a,b); input ci

8、n,a,b; output cout; table /cin a b : cout /真值表 0 0 0 : 0; 0 1 0 : 0; 0 0 1 : 0; 0 1 1 : 1; 1 0 0 : 0; 1 0 1 : 1; 1 1 0 : 1; 1 1 1 : 1;,0 0 x : 0; 0 x 0 : 0; x 0 0 : 0; 1 1 x : 1; 1 x 1 : 1; x 1 1 : 1; endtable endprimitive,包含x态输入的1位全加器进位输出UDP元件,primitive carry_udpx(cout,cin,a,b); input cin,a,b; outp

9、ut cout; table /cin a b : cout /真值表 ? 0 0 : 0; /只要有两个输入为0,则进位输出肯定为0 0 ? 0 : 0; 0 0 ? : 0; ? 1 1 : 1; /只要有两个输入为1,则进位输出肯定为1 1 ? 1 : 1; 1 1 ? : 1; endtable endprimitive,用简缩符“?”表述的1位全加器进位输出UDP元件,11.2.2 时序逻辑UDP元件,primitive latch(Q,clk,reset,D); input clk,reset,D; output Q; reg Q; initial Q=1b1; /初始化 tabl

10、e /clk reset D:state:Q ? 1 ? : ? : 0; 0 0 0 : ? : 0; 0 0 1 : ? : 1; 1 0 ? : ? : -; endtable endprimitive,电平敏感的1位数据锁存器UDP元件,primitive DFF(Q,D,clk); input D,clk; output Q; reg Q; table /clk D : state : Q (01) 0 : ? : 0; /上升沿到来,输出Q=D (01) 1 : ? : 1; (0x) 1 : 1 : 1; (0x) 0 : 0 : 0; (?0) ? : ? : -; /没有上升

11、沿到来,输出Q保持原值 ? (?) : ? : -; /时钟不变,输出也不变 endtable endprimitive,上升沿触发的D触发器UDP元件,UDP中的缩记符,11.3 延时模型的表示,在仿真中,还涉及到延时表示的问题。延时包括门延时、assign赋值延时和连线延时等。门延时是从门输入端发生变化到输出端发生变化的延迟时间;assign赋值延时指等号右端某个值发生变化到等号左端发生相应变化的延迟时间;连线延时则体现了信号在连线上的传输延时。如果没有定义时延值,缺省时延为0。,11.3.1 时间标尺定义timescale,timescale语句用于定义模块的时间单位和时间精度,其使用格

12、式如下: timescale / timescale / 其中用来表示时间度量的符号有:s、ms、us、ns、ps和fs。 例如:timescale 1ns/100ps 上面的语句表示时延单位为1ns,时延精度为100ps(即精确到0.1ns)。timescale编译器指令在模块说明外部出现,并且影响后面所有的时延值。,11.3.2 延时的表示与延时说明块,1延时的表示方法 延时的表示方法有下面几种: # delaytime # (d1,d2) # (d1,d2,d3) # delaytime表示延迟时间为delaytime,d1表示上升延迟,d2表示下降延迟,d3则表示转换到高阻态z的延迟,

13、这些延迟的具体时间由时间定义语句timescale确定。 时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。如果没有定义时延值,缺省时延为0。,Verilog可对模块中某一指定的路径进行延迟定义,这一路径连接模块的输入端口(或inout端口)与输出端口(或inout端口),利用延迟定义块在一个独立的块结构中定义模块的延时。在延迟定义块中要描述模块中的不同路径并给这些路径赋值。 延迟定义块的内容应放在关键字specify与endspecify之间,且必须放在一个模块中,还可以使用specparam关键字定义参数,2延时说明块(specify块),11.4 数字电路的仿真,11.4.

14、1 测试平台(Test Banch),测试模块只有模块名字,没有端口列表; 输入信号(激励信号)必须定义为reg型,以保持信号值;输出信号(显示信号)必须定义为wire型; 在测试模块中调用被测试模块,在调用时,应注意端口排列的顺序与模块定义时一致; 一般用initial、always过程块来定义激励信号波形;使用系统任务和系统函数来定义输出显示格式; 在激励信号的定义中,可使用如下一些控制语句:if-else,for,forever,case,while,repeat,wait,disable,force,release,begin-end,fork-join等,这些控制语句一般只用在alw

15、ays、initial、function、task等过程块中。,11.4.2 组合电路的仿真,timescale 10ns/1ns module mult_tp; /测试模块的名字 reg7:0 a,b; /测试输入信号定义为reg型 wire15:0 out; /测试输出信号定义为wire型 integer i,j; mult8 m1(out,a,b); /调用测试对象 initial /激励波形设定 begin a=0;b=0; for(i=1;i255;i=i+1) #10 a=i; end initial begin for(j=1;j255;j=j+1) #10 b=j; end,8

16、位乘法器的仿真,initial begin /定义结果显示格式 $monitor($time,“%d*%d=%d“,a,b,out); #2560 $finish; end endmodule module mult8(out,a,b);/8位乘法器源代码 parameter size=8; inputsize:1 a,b; /两个操作数 output2*size:1 out;/结果 assign out=a*b; /乘法运算符 endmodule,8位乘法器的仿真,功能仿真波形,文本输出,仿真结果,11.4.3 时序电路的仿真,timescale 10ns/1ns module count8

17、_tp; reg clk,reset; /输入激励信号定义为reg型 wire7:0 qout; /输出信号定义为wire型 parameter DELY=100; counter C1(qout,reset,clk); /调用测试对象 always #(DELY/2) clk=clk; /产生时钟波形 initial begin /激励波形定义clk=0;reset=0; #DELY reset=1; #DELY reset=0; #(DELY*300) $finish; end,/结果显示 initial $monitor($time,“clk=%d reset=%d qout=%d“,c

18、lk,reset,qout); endmodule module counter(qout,reset,clk); /待测试的8位计数器模块 output7:0 qout; input clk,reset; reg7:0 qout; always (posedge clk) begin if(reset) qout=0;else qout=qout+1; end endmodule,仿真波形,输出文本,仿真结果,习 题,11-1 什么是仿真?常用的Verilog仿真器有哪些? 11-2 写出1位全加器本位和(SUM)的UDP描述。 11-3 写出4选1多路选择器的UDP描述。 11-4 timescale 指令的作用是什么?举例说明 11-5 编写一个4位的比较器,并对其测试。 11-6 编写一个测试程序,对D触发器的逻辑功能进行测试。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报