
《eda设计与应用ppt第11章》由会员分享,可在线阅读,更多相关《eda设计与应用ppt第11章(41页珍藏版)》请在文档大全上搜索。
1、第第11章章 Verilog仿真与验证仿真与验证11.1 系统任务与系统函数系统任务与系统函数11.2 用户自定义元件(用户自定义元件(UDP)11.3 延时模型的表示延时模型的表示11.4 测试平台测试平台 11.5 ModelSim仿真实例仿真实例 11.6 数字电路的仿真数字电路的仿真第第1111章章 VerilogVerilog仿真与验证仿真与验证11.1 系统任务与系统函数系统任务与系统函数 系统任务和系统函数一般以符号系统任务和系统函数一般以符号“$”开头。例如:开头。例如:$monitor,$readmemh等。等。 使用不同的使用不同的Verilog仿真工具(如:仿真工具(如:
2、VCS、Verilog-XL、ModelSim等)进行仿真时,这些系统任务和系统函数在使等)进行仿真时,这些系统任务和系统函数在使用方法上可能存在差异,应根据使用手册来使用。用方法上可能存在差异,应根据使用手册来使用。 一般在一般在intial或或always过程块中,调用系统任务和系统过程块中,调用系统任务和系统函数。函数。 用户可以通过编程语言接口(用户可以通过编程语言接口(PLI)将自己定义的系统)将自己定义的系统任务和系统函数加到语言中,以进行仿真和调试。任务和系统函数加到语言中,以进行仿真和调试。$display和和$write是两个系统任务,两者的功能相同,是两个系统任务,两者的功
3、能相同,都用于显示模拟结果,其区别是都用于显示模拟结果,其区别是$display在输出结束后在输出结束后能自动换行,而能自动换行,而$write不能。不能。$display和和$write的使用格式为:的使用格式为:$display(“格式控制符格式控制符”,输出变量名列表);,输出变量名列表);$write(“格式控制符格式控制符”,输出变量名列表);,输出变量名列表);1$display与与$write格式控制符格式控制符说明说明%h或或%H以以16进制形式显示进制形式显示%d或或%D以以10进制形式显示进制形式显示%o或或%O以以8进制形式显示进制形式显示%b或或%B以以2进制形式显示进
4、制形式显示%c或或%C以以ASCII字符形式显示字符形式显示%v或或%V显示显示net型数据的驱动强度型数据的驱动强度%m或或%M显示层次名显示层次名%s或或%S以字符串形式输出以字符串形式输出%t或或%T以当前的时间格式显示以当前的时间格式显示转义字符转义字符说明说明 n换行换行 tTAB键键符号符号“符号符号“ ddd 八进制数八进制数ddd对应的对应的ASCII字符字符%符号符号%格式控制符格式控制符转义字符转义字符$monitor、$strobe与与$display、$write一样也是属一样也是属于输出控制类的系统任务,于输出控制类的系统任务,$monitor与与$strobe都提供
5、都提供了监控和输出参数列表中字符或变量的值的功能,其使了监控和输出参数列表中字符或变量的值的功能,其使用格式为:用格式为:$monitor(“格式控制符格式控制符”,输出变量名列表,输出变量名列表);$strobe(“格式控制符格式控制符”,输出变量名列表,输出变量名列表);这里的格式控制符、输出变量名列表与这里的格式控制符、输出变量名列表与$display和和$write中定义的完全相同。中定义的完全相同。2$monitor与与$strobe$time、$realtime是属于显示仿真时间标度的系统函是属于显示仿真时间标度的系统函数。这两个函数被调用时,都返回当前时刻距离仿真开数。这两个函数
6、被调用时,都返回当前时刻距离仿真开始时刻的时间量值,所不同的是,始时刻的时间量值,所不同的是,$time 函数以函数以64位整位整数值的形式返回模拟时间,数值的形式返回模拟时间,$realtime 函数则以实数型函数则以实数型数据返回模拟时间。数据返回模拟时间。 3$time与与$realtime系统任务系统任务$finish与与$stop用于对仿真过程进行控制,分用于对仿真过程进行控制,分别表示结束仿真和中断仿真。别表示结束仿真和中断仿真。$finish与与$stop 的使用格式如下:的使用格式如下:$stop;$stop(n);$finish;$finish(n);n是是$finish和和
7、$stop的参数,的参数,n 可以是可以是0、1、2等值,分等值,分别表示如下含义。别表示如下含义。0:不输出任何信息;:不输出任何信息;1:给出仿真时间和位置;:给出仿真时间和位置;2:给出仿真时间和位置,还有其他一些运行统计数据。:给出仿真时间和位置,还有其他一些运行统计数据。4$finish与与$stop$readmemh与与$readmemb是属于文件读写控制的系统是属于文件读写控制的系统任务,其作用都是从外部文件中读取数据并放入存储器中。任务,其作用都是从外部文件中读取数据并放入存储器中。两者的区别在于读取数据的格式不同,两者的区别在于读取数据的格式不同,$readmemh为读为读取
8、十六进制数据,而取十六进制数据,而$readmemb为读取二进制数据。为读取二进制数据。$readmemh与与$readmemb的使用格式为:的使用格式为:$readmemh(数据文件名数据文件名,存储器名,起始地址,结,存储器名,起始地址,结束地址);束地址);$readmemb(数据文件名数据文件名,存储器名,起始地址,结,存储器名,起始地址,结束地址);束地址);其中,起始地址和结束地址均可以缺省,如果缺省起始地其中,起始地址和结束地址均可以缺省,如果缺省起始地址,表示从存储器的首地址开始存储;如果缺省结束地址,址,表示从存储器的首地址开始存储;如果缺省结束地址,表示一直存储到存储器的结
9、束地址。表示一直存储到存储器的结束地址。5$readmemh与与$readmemb$random是产生随机数的系统函数,每次调用该函数将是产生随机数的系统函数,每次调用该函数将返回一个返回一个32位的随机数,该随机数是一个带符号的整数。位的随机数,该随机数是一个带符号的整数。6$random与与c 语言类似,语言类似,Verilog也提供了很多文件输出类的系统也提供了很多文件输出类的系统任务,可将结果输出到文件中。这类任务有:任务,可将结果输出到文件中。这类任务有:$fdisplay、$fwrite、$fmonitor、$fstrobe、$fopen和和$fclose等。等。$fopen用于打
10、开某个文件并准备写操作,用于打开某个文件并准备写操作,$fclose用于用于关闭文件,而关闭文件,而$fdisplay、$fwrite、$fmonitor等系统等系统任务则用于把文本写入文件。任务则用于把文本写入文件。7文件输出文件输出11.2 用户自定义元件用户自定义元件(UDP) 利用利用UDP(User Defined Primitives)用户可以自己)用户可以自己定义基本逻辑元件的功能,用户可以象调用基本门元件一样定义基本逻辑元件的功能,用户可以象调用基本门元件一样来调用这些自己定义的元件。来调用这些自己定义的元件。 UDP关键词为关键词为primitive和和endprimitiv
11、e。与一般的模。与一般的模块相比,块相比,UDP模块具有下面一些特点:模块具有下面一些特点: UDP的输出端口只能有一个,且必须位于端口列表的的输出端口只能有一个,且必须位于端口列表的第一项。只有输出端口能被定义为第一项。只有输出端口能被定义为reg类型。类型。 UDP的输入端口可有多个,一般时序电路的输入端口可有多个,一般时序电路UDP的输入的输入端口可多至端口可多至9个,组合电路个,组合电路UDP的输入端口可多至的输入端口可多至10个。个。 所有的端口变量必须是所有的端口变量必须是1位标量。位标量。 在在table表项中,只能出现表项中,只能出现0、1、x三种状态,不能出三种状态,不能出现
12、现z状态。状态。primitive 元件名(输出端口,输入端口元件名(输出端口,输入端口1,输入端口,输入端口2,)output 输出端口名;输出端口名;input 输入端口输入端口1,输入端口,输入端口2,;reg输出端口名;输出端口名;initial begin 输出端口或内部寄存器赋初值(输出端口或内部寄存器赋初值(0,1或或x);); endtable /输入输入1 输入输入2 :输出:输出 真值列表真值列表endtableendprimitive定义定义UDP的语法的语法1、组合电路、组合电路UDP元件元件 primitive carry_udp(cout,cin,a,b);inpu
13、t cin,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;endtableendprimitivep 【例【例11.3】 1位全加器进位输出位全加器进位输出UDP元件元件1、组合电路、组合电路UDP元件元件 primitive carry_udpx(cout,cin,a,b);input cin,a,b;output cout;table/cin a b : cout /真值表真值表0 0 0
14、 : 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;endtableendprimitivep 【例【例11.4】包含】包含x态输入的态输入的1位全加器进位输位全加器进位输出出UDP元件元件primitive carry_udpx(cout,cin,a,b);input cin,a,b;output cout;table/cin a b : cout /真值表真值表? 0 0
15、 : 0;/只要有两个输入为只要有两个输入为0,则进位输出肯定为,则进位输出肯定为00 ? 0 : 0;0 0 ? : 0;? 1 1 : 1;/只要有两个输入为只要有两个输入为1,则进位输出肯定为,则进位输出肯定为11 ? 1 : 1;1 1 ? : 1;endtableendprimitive【例【例11.5】用简缩符】用简缩符“?”表述的表述的1位全加器进位输出位全加器进位输出UDP元件元件1、组合电路、组合电路UDP元件元件 2、时序逻辑、时序逻辑UDP元件元件 primitive latch(Q,clk,reset,D);input clk,reset,D;output Q;reg
16、Q;initial Q=1b1; /初始化初始化table/clk reset D:state:Q? 1 ? : ? : 0; 0 0 0 : ? : 0; 0 0 1 : ? : 1;1 0 ? : ? : -; endtableendprimitivep【例【例11.7】 电平敏感的电平敏感的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;(0 x)
17、1 : 1 : 1;(0 x) 0 : 0 : 0;(?0) ? : ? : -; /没有上升沿到来,输出没有上升沿到来,输出Q保持原值保持原值? (?) : ? : -; /时钟不变,输出也不变时钟不变,输出也不变endtableendprimitive【例【例11.8】 上升沿触发的上升沿触发的D触发器触发器UDP元件元件2、时序逻辑、时序逻辑UDP元件元件 缩记符缩记符含义含义说明说明x不定态不定态?0、1或或x只能表示输入只能表示输入b0或或1只能表示输入只能表示输入-保持不变保持不变只用于时序元件的输出只用于时序元件的输出(vy)代表代表(01), (10), (0 x), (1x)
18、, (x1), (x0), (?1)等等从逻辑从逻辑v到逻辑到逻辑y的转变的转变*同同(?)表示输入端有任何变化表示输入端有任何变化R或或r同同(01)表示上升沿表示上升沿F或或f同同(10)表示下降沿表示下降沿P或或p(01), (0 x)或或(x1)包含包含x态的上升沿跳变态的上升沿跳变N或或n(10),(1x)或或(x0)包含包含x态的下降沿跳变态的下降沿跳变UDP中的缩记符中的缩记符11.3 延时模型的表示延时模型的表示 延时包括门延时、延时包括门延时、assign赋值延时和连线延时等。赋值延时和连线延时等。u 门延时是从门输入端发生变化到输出端发生变化的延门延时是从门输入端发生变化到
19、输出端发生变化的延迟时间;迟时间;u assign赋值延时指等号右端某个值发生变化到等号左赋值延时指等号右端某个值发生变化到等号左端发生相应变化的延迟时间;端发生相应变化的延迟时间;u 连线延时则体现了信号在连线上的传输延时。连线延时则体现了信号在连线上的传输延时。u 如果没有定义时延值,缺省时延为如果没有定义时延值,缺省时延为0。1、时间标尺定义、时间标尺定义timescale timescale语句用于定义模块的时间单位和时间精度,语句用于定义模块的时间单位和时间精度,其使用格式如下:其使用格式如下:timescale /timescale /其中用来表示时间度量的符号有:其中用来表示时间
20、度量的符号有:s、ms、us、ns、ps和和fs。例如:例如:timescale 1ns/100ps上面的语句表示时延单位为上面的语句表示时延单位为1ns,时延精度为,时延精度为100ps(即精确到(即精确到0.1ns)。)。timescale编译器指令在模块说编译器指令在模块说明外部出现,并且影响后面所有的时延值。明外部出现,并且影响后面所有的时延值。2、延时的表示与延时说明块、延时的表示与延时说明块 1延时的表示方法延时的表示方法延时的表示方法有下面几种:延时的表示方法有下面几种:# delaytime# (d1,d2)# (d1,d2,d3)# delaytime表示延迟时间为表示延迟时
21、间为delaytime,d1表示上升表示上升延迟,延迟,d2表示下降延迟,表示下降延迟,d3则表示转换到高阻态则表示转换到高阻态z的延迟,的延迟,这些延迟的具体时间由时间定义语句这些延迟的具体时间由时间定义语句timescale确定。确定。时延定义了右边表达式操作数变化与赋值给左边表达式之时延定义了右边表达式操作数变化与赋值给左边表达式之间的持续时间。如果没有定义时延值,缺省时延为间的持续时间。如果没有定义时延值,缺省时延为0。 Verilog可对模块中某一指定的路径进行延迟定义,这一可对模块中某一指定的路径进行延迟定义,这一路径连接模块的输入端口(或路径连接模块的输入端口(或inout端口)
22、与输出端口端口)与输出端口(或(或inout端口),利用延迟定义块在一个独立的块结构端口),利用延迟定义块在一个独立的块结构中定义模块的延时。在延迟定义块中要描述模块中的不中定义模块的延时。在延迟定义块中要描述模块中的不同路径并给这些路径赋值。同路径并给这些路径赋值。延迟定义块的内容应放在关键字延迟定义块的内容应放在关键字specify与与endspecify之间,且必须放在一个模块中,还可以使用之间,且必须放在一个模块中,还可以使用specparam关键字定义参数关键字定义参数 3延时说明块(延时说明块(specify块)块)11.4 测试平台测试平台 测试平台(测试平台(Test Banc
23、h) 测试模块只有模块名字,没有端口列表;测试模块只有模块名字,没有端口列表;输入信号(激励信号)必须定义为输入信号(激励信号)必须定义为reg型,以保持信号值;型,以保持信号值;输出信号(显示信号)必须定义为输出信号(显示信号)必须定义为wire型;型;在测试模块中调用被测试模块,在调用时,应注意端口在测试模块中调用被测试模块,在调用时,应注意端口排列的顺序与模块定义时一致;排列的顺序与模块定义时一致;一般用一般用initial、always过程块来定义激励信号波形;使过程块来定义激励信号波形;使用系统任务和系统函数来定义输出显示格式;用系统任务和系统函数来定义输出显示格式;在激励信号的定义
24、中,可使用如下一些控制语句:在激励信号的定义中,可使用如下一些控制语句:if-else,for,forever,case,while,begin-end,fork-join等,这些控制语句一般只用在等,这些控制语句一般只用在always、initial、function、task等过程块中。等过程块中。 【例11.13】 激励波形的描述timescale 1ns/1nsmodule test1;reg a,b,c;initialbegin a=0;b=1;c=0; #100 c=1; #100 a=1;b=0; #100 a=0; #100 c=0;#100 $stop;endinitial
25、$monitor($time,a=%d b=%d c=%d,a,b,c); /显示endmodule11.4 测试平台测试平台 【例11.14】 always语句用于时钟波形的描述timescale 1ns/1nsreg clk;parameter CYCLE=100;/一个时钟周期100nsalways #(CYCLE/2) clk=clk; /always语句产生时钟波形intial clk=1;11.4 测试平台测试平台 11.5 ModelSim仿真实例仿真实例 加法器仿真的示意图加法器仿真的示意图 o ModelSim工作界面 新建工程项目新建工程项目 填加仿真文件填加仿真文件 o
26、新建仿真文件 o 输入仿真文件代码并编译 o 编译文件到编译文件到work工作库并加载工作库并加载 o 编译文件到编译文件到work工作库并加载工作库并加载 输出波形显示和命令行窗口结果显示 timescale 10ns/1nsmodule mult8_tp; /测试模块的名字测试模块的名字reg7:0 a,b; /测试输入信号定义为测试输入信号定义为reg型型wire15:0 out; /测试输出信号定义为测试输出信号定义为wire型型integer i,j;mult8 m1(out,a,b);/调用测试对象调用测试对象initial /激励波形设定激励波形设定begin a=0;b=0;f
27、or(i=1;i255;i=i+1) #10 a=i; endinitial beginfor(j=1;j255;j=j+1) #10 b=j;end11.6 数字电路的仿真数字电路的仿真 8位乘法器的仿真位乘法器的仿真initial begin/定义结果显示格式定义结果显示格式$monitor($time,%d*%d=%d,a,b,out);#2560 $finish;endendmodulemodule mult8(out,a,b);/8位乘法器源代码位乘法器源代码parameter size=8;inputsize:1 a,b; /两个操作数两个操作数output2*size:1 out
28、;/结果结果assign out=a*b; /乘法运算符乘法运算符endmodule8位乘法器的仿真位乘法器的仿真8位乘法器的功能仿真波形图(位乘法器的功能仿真波形图(ModelSim) 仿真结果仿真结果11.4.3 时序电路的仿真时序电路的仿真 timescale 10ns/1nsmodule count8_tp;reg clk,reset;/输入激励信号定义为输入激励信号定义为reg型型wire7:0 qout; /输出信号定义为输出信号定义为wire型型parameter DELY=100;counter C1(qout,reset,clk); /调用测试对象调用测试对象always #
29、(DELY/2) clk=clk;/产生时钟波形产生时钟波形initial begin /激励波形定义激励波形定义 clk=0; reset=0;#DELY reset=1;#DELY reset=0;#(DELY*300) $finish;end【例【例11.21】 8位计数器的仿真代码位计数器的仿真代码 initial $monitor($time,clk=%d reset=%d qout=%d,clk,reset,qout);endmodulemodule counter(qout,reset,clk); /待测试的待测试的8位计数器模块位计数器模块output7:0 qout;inpu
30、t clk,reset;reg7:0 qout;always (posedge clk)begin if(reset)qout=0;elseqout=qout+1;endendmodule结果显示结果显示计数器的仿真波形(计数器的仿真波形(ModelSim) 仿真结果仿真结果习习 题题 11 11.1 什么是仿真?常用的什么是仿真?常用的Verilog HDL仿真器有哪些?仿真器有哪些?11.2 写出写出1位全加器本位和(位全加器本位和(SUM)的)的UDP描述。描述。11.3 写出写出4选选1多路选择器的多路选择器的UDP描述。描述。11.4 timescale 指令的作用是什么?举例说明指令的作用是什么?举例说明11.5 编写一个编写一个4位的比较器,并对其进行测试。位的比较器,并对其进行测试。11.6 编写一个时钟波形产生器,产生正脉冲宽度为编写一个时钟波形产生器,产生正脉冲宽度为15ns负负脉冲宽度为脉冲宽度为10ns的时钟波形。的时钟波形。11.7 编写一个测试程序,对编写一个测试程序,对D触发器的逻辑功能进行测试。触发器的逻辑功能进行测试。