第6章 仿真与验证
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如:语句间延时:sum=(a^b)^cin #4 t1=a&cin 如:语句内延时:sum=#3(a^b)^cin 如果没有定义时延值,缺省时延为0。
激励波形仿真测试程序
【例6.2】 激励波形的描述
0 100 200 300 `timescale 1ns/1ns module test1; a reg a,b,c; initial b begin a=0;b=1;c=0; #100 c=1; c #100 a=1;b=0; #100 a=0; #100 c=0; #100 $stop; end initial $monitor($time,,,"a=%d b=%d c=%d",a,b,c); endmodule 400
延时语句用于仿真测试中,它不能综合生成硬件,主要
用于仿真真实数字电路运行时的电路延时情况和人为设计 的波形输出。
⑴、时间标尺预定义语句`timescale
`timescale语句用于定义模块中指令运行的时间单位和时间 精度,其使用格式如下: `timescale <time_unit>/<time_precision> `timescale <时间单位>/<时间精度> 其中用来表示时间度量的符号有:s、ms、us、ns、ps和fs, 时间单位必须取整数,指令运行时间以时间单位为基准,多 少以时间精度进行取舍。 例如:`timescale 1ns/100ps 上面的语句表示时延单位为1ns,时延精度为100ps(即精确 到0.1ns)。`timescale编译器指令在模块说明外部出现, 并且影响后面所有的时延值,直到遇到另一个`timescale指 令或`resetall指令 。当一个文件含有多个模块,且每个模块 都有各自`timescale指令时,以精度最小的为基准时间精度。
以返回0个或多个值,而系统函数除只能返回一个值外,与
任务类似。例如:$monitor,$readmemh等。 ◆ 使用不同的Verilog仿真工具(如:VCS、Verilog-XL、 ModelSim等)进行仿真时,这些系统任务和系统函数在 使用方法上可能存在差异,应根据使用手册来使用。 ◆ 一般在intial或always过程块中,调用系统任务和系统 函数。 ◆ 用户可以通过编程语言接口(PLI)将自己定义的系统 任务和系统函数加到语言中,以进行仿真和调试。
格式控制符
格式控制 符 说明 转义字符 \n \t \\ \“
转义字符
说明 换行 TAB键 符号\ 符号“
%h或%H 以16进制形式显示
%d或%D 以10进制形式显示 %o或%O 以8进制形式显示 %b或%B %c或%C 以2进制形式显示 以ASCII字符形式显示
\ ddd
%%
%v或%V
%m或 %M %s或%S
⑵、$monitor与$strobe
$monitor、$strobe与$display、$write一样 也是属于输出控制类的显示系统任务, $monitor与$strobe都提供在指定时刻监控和 输出参数列表中字符或变量的值的功能;而 $display、$write任务在执行到该语句时执行。 其使用格式为: $monitor(“格式控制符”,输出变量名列表); $strobe(“格式控制符”,输出变量名列表); 这里的格式控制符、输出变量名列表与 $display和$write中定义的完全相同。
`include “../../文件名” 其作用是将指定的文件一同与当前文件进行编译,指定文件可以 是相对路径和绝对路径。
3、仿真延时模型的表示
延时包括门延时、assign赋值延时和连线延时等。
主要用于仿真模拟实际电路中存在的延时过程,均不能综
合为具体电路,只在调试时使用。 门延时是从门输入端发生变化到输出端发生变化的延 迟时间; assign赋值延时指等号右端某个值发生变化到等号左 端发生相应变化的延迟时间; 连线延时则体现了信号在连线上的传输延时。 如果没有定义时延值,缺省时延为0。
第6章 Verilog仿真与验证
第6章
Verilog仿真与验证
6.1 系统任务与系统函数
内容
6.2 系统预定义指令
6.3用户自定义元件(UDP) 6.4测试平台 6.5 ModelSim仿真实例 6.6数字电路的仿真
6.1 系统任务与系统函数
◆ 系统任务和系统函数一般以符号“$”开头。系统任务可
还有其它系统任务和函数用于读取文件中数据:
$fread : 从文件中读取二进制数据到存储器中。 $fgetc :从文件中每次读取一个字符。 $fgets :从文件中每次读取一行。 $ungetc :把一个字符插入文件中。 $frewind :重新回到文件的开始处。 $fseek :移动到偏移量指定的位置。 $ftell :返回以文件开始处为基址的偏移量。 $fscanf :从文件中读取格式化数据。 $ferror :在执行完一个读取任务后,帮助判断 出错误的原因。
2、系统函数
⑴、$time与$realtime
$time、$realtime是属于显示仿真时间标度的系 统函数。这两个函数被调用时,都返回当前时刻 距离仿真开始时刻的时间量值,所不同的是, $time 函数以64位整数值的形式返回模拟时间, $realtime 函数则以实数型数据返回模拟时间。 如上加法器仿真调试程序。
⑵、$random
$random是产生随机数的系统函数,每次调用该函数将 返回一个32位的随机数,该随机数是一个带符号的整数。
⑶、$fopen和$fclose $fopen 和$fclose用于打开和关闭一个文件系统函数,
完成后返回一个与文件相关的整数指针。
6.2编译指令的使用
编译指令:
1、宏定义语句define和宏取消语句undef
⑵、延时的表示与延时说明块
延时的表示方法有下面几种: # delaytime # (d1,d2) # (d1,d2,d3) # delaytime表示延迟时间为delaytime,d1表示上升延 迟,d2表示下降延迟,d3则表示转换到高阻态z的延迟, 这些延迟的具体时间由时间定义语句'timescale确定。
module full_adder(cout,si,ai,bi,cin); output si,cout; input ai,bi,cin; assign {cout,si}=ai+bi+cin; endmodule
测试加法执行过程, 并检测执行情况。
ModelSim仿真结果
time ai bi cin cout sum # 0 0 + 0 + 0={0, 0} # 10 0 + 0 + 1={0, 1} # 20 0 + 1+ 0={0, 1} # 30 0 + 1+ 1={1, 0} # 40 1 + 0+ 0={0, 1} # 50 1 + 0+ 1={1, 0} # 60 1 + 1+ 0={1, 0} # 70 1 + 1+ 1={1, 1} # 80 0 + 0+ 0={0, 0} # 90 0 + 0+ 1={0, 1} #100 0 + 1+ 0={0, 1} #110 0 + 1+ 1={1, 0} #120 1 + 0+ 0={0, 1} #130 1 + 0+ 1={1, 0} #140 1 + 1+ 0={1, 0} #150 1 + 1+ 1={1, 1}
如在状态机中定义状态:
`define S0 2’b00; //定义状态编码 `define S1 2’b01; …; 一旦该指令被编译器通过,则尤其规定的宏定义在整个编译过程期间都保 持有效。并可在多个文件中有效,直到遇到取消宏定义指令。 `undef 宏名 取消之前定义的宏定义。
2、编译时包含其它文件指令
显示net来自百度文库数据的驱动强 度
显示层次名 以字符串形式输出
八进制数ddd对应的 ASCII字符
符号%
%t或%T
以当前的时间格式显示
未指定输出数据格式,可采用如下 默认任务显示形式:
$displayh $writeh $displayo $writeo
$displayb $writeb
仿真调试程序
module dis_1(); integer wait_timer; initial begin wait_timer=1; $display("after first assignment,", "wait_temer has value %d",wait_timer); wait_timer=2; $display("after first assignment,", "wait_temer has value %d",wait_timer); end endmodule Modelsim仿真下的输出:
采用层次电路设计的全加器仿真显示测试程序
`timescale 1ns/1ps module full_adder_tb; reg[2:0]in; wire sum, cout; integer i,j; full_adder FA(.cout(cout),.si(sum),.ai(in[2]),.bi(in[1]),.cin(in[0])); always #10 in=in+1; initial begin //这三条语句同时执行,但initial只执行一次, in=0; // 但由于其内的语句受时间控制,直到#160时刻才结束 $display(" time ai bi cin cout sum"); $monitor($time,,,"%b+%b+%b={%b,%b}",in[2],in[1],in[0],cout, sum); #160 $finish; end endmodule
监控输出任务$monitor是只要满足输出数值发生变 化就有输出显示。表中当在150ns~160ns期间没有 数值变化,所以没有显示160ns的输出结果。
⑷$readmemh与$readmemb
$readmemh与$readmemb是属于文件读写控制的系统 任务,其作用都是从外部文件中读取数据并放入存储器中。 两者的区别在于读取数据的格式不同,$readmemh为读 取十六进制数据,而$readmemb为读取二进制数据。 $readmemh与$readmemb的使用格式为: $readmemh("数据文件名",存储器名,起始地址,结 束地址); $readmemb("数据文件名",存储器名,起始地址,结 束地址); 其中,起始地址和结束地址均可以缺省,如果缺省起始地 址,表示从存储器的首地址开始存储;如果缺省结束地址, 表示一直存储到存储器的结束地址。
//显示
ModelSim仿真结果
⑶、延时说明块(specify块)
Verilog可对模块中某一指定的路径进行延迟定义, 这一路径连接模块的输入端口(或inout端口)与输出端 口(或inout端口),利用延迟定义块在一个独立的块结 构中定义模块的延时。在延迟定义块中要描述模块中的 不同路径并给这些路径赋值。 延迟定义块的内容应放在关键字specify与 endspecify之间,且必须放在一个模块中,还可以使用 specparam关键字定义参数。
系统任务和系统函数只能用于仿真,在系统综合过程中被忽略。
系统任务与函数分类
⑴显示任务 ⑵文件输入与输出任务 ⑶仿真控制任务 ⑷时间标度任务 ⑸ PLA建模任务 ⑹随机建模任务 ⑺变换函数 ⑻概率分布函数 ⑼字符格式化 ⑽命令行参变量
1.系统任务
⑴、$display与$write $display和$write是两个显示与写系统任务, 两者的功能相同,都用于显示模拟结果,其区别 是$display在输出结束后能自动换行,而 $write不能。 $display和$write的使用格式为: $display(“格式控制符”,输出变量名列表); $write(“格式控制符”,输出变量名列表);
⑶$finish与$stop
系统任务$finish与$stop用于对仿真过程进行控制,分 别表示结束仿真和中断仿真。 $finish与$stop 的使用格式如下: $stop; $stop(n); $finish; $finish(n); n是$finish和$stop的参数,n 可以是0、1、2等值,分 别表示如下含义。 0:不输出任何信息; 1:给出仿真时间和位置; 2:给出仿真时间和位置,还有其他一些运行统计数据。
激励波形仿真测试程序
【例6.2】 激励波形的描述
0 100 200 300 `timescale 1ns/1ns module test1; a reg a,b,c; initial b begin a=0;b=1;c=0; #100 c=1; c #100 a=1;b=0; #100 a=0; #100 c=0; #100 $stop; end initial $monitor($time,,,"a=%d b=%d c=%d",a,b,c); endmodule 400
延时语句用于仿真测试中,它不能综合生成硬件,主要
用于仿真真实数字电路运行时的电路延时情况和人为设计 的波形输出。
⑴、时间标尺预定义语句`timescale
`timescale语句用于定义模块中指令运行的时间单位和时间 精度,其使用格式如下: `timescale <time_unit>/<time_precision> `timescale <时间单位>/<时间精度> 其中用来表示时间度量的符号有:s、ms、us、ns、ps和fs, 时间单位必须取整数,指令运行时间以时间单位为基准,多 少以时间精度进行取舍。 例如:`timescale 1ns/100ps 上面的语句表示时延单位为1ns,时延精度为100ps(即精确 到0.1ns)。`timescale编译器指令在模块说明外部出现, 并且影响后面所有的时延值,直到遇到另一个`timescale指 令或`resetall指令 。当一个文件含有多个模块,且每个模块 都有各自`timescale指令时,以精度最小的为基准时间精度。
以返回0个或多个值,而系统函数除只能返回一个值外,与
任务类似。例如:$monitor,$readmemh等。 ◆ 使用不同的Verilog仿真工具(如:VCS、Verilog-XL、 ModelSim等)进行仿真时,这些系统任务和系统函数在 使用方法上可能存在差异,应根据使用手册来使用。 ◆ 一般在intial或always过程块中,调用系统任务和系统 函数。 ◆ 用户可以通过编程语言接口(PLI)将自己定义的系统 任务和系统函数加到语言中,以进行仿真和调试。
格式控制符
格式控制 符 说明 转义字符 \n \t \\ \“
转义字符
说明 换行 TAB键 符号\ 符号“
%h或%H 以16进制形式显示
%d或%D 以10进制形式显示 %o或%O 以8进制形式显示 %b或%B %c或%C 以2进制形式显示 以ASCII字符形式显示
\ ddd
%%
%v或%V
%m或 %M %s或%S
⑵、$monitor与$strobe
$monitor、$strobe与$display、$write一样 也是属于输出控制类的显示系统任务, $monitor与$strobe都提供在指定时刻监控和 输出参数列表中字符或变量的值的功能;而 $display、$write任务在执行到该语句时执行。 其使用格式为: $monitor(“格式控制符”,输出变量名列表); $strobe(“格式控制符”,输出变量名列表); 这里的格式控制符、输出变量名列表与 $display和$write中定义的完全相同。
`include “../../文件名” 其作用是将指定的文件一同与当前文件进行编译,指定文件可以 是相对路径和绝对路径。
3、仿真延时模型的表示
延时包括门延时、assign赋值延时和连线延时等。
主要用于仿真模拟实际电路中存在的延时过程,均不能综
合为具体电路,只在调试时使用。 门延时是从门输入端发生变化到输出端发生变化的延 迟时间; assign赋值延时指等号右端某个值发生变化到等号左 端发生相应变化的延迟时间; 连线延时则体现了信号在连线上的传输延时。 如果没有定义时延值,缺省时延为0。
第6章 Verilog仿真与验证
第6章
Verilog仿真与验证
6.1 系统任务与系统函数
内容
6.2 系统预定义指令
6.3用户自定义元件(UDP) 6.4测试平台 6.5 ModelSim仿真实例 6.6数字电路的仿真
6.1 系统任务与系统函数
◆ 系统任务和系统函数一般以符号“$”开头。系统任务可
还有其它系统任务和函数用于读取文件中数据:
$fread : 从文件中读取二进制数据到存储器中。 $fgetc :从文件中每次读取一个字符。 $fgets :从文件中每次读取一行。 $ungetc :把一个字符插入文件中。 $frewind :重新回到文件的开始处。 $fseek :移动到偏移量指定的位置。 $ftell :返回以文件开始处为基址的偏移量。 $fscanf :从文件中读取格式化数据。 $ferror :在执行完一个读取任务后,帮助判断 出错误的原因。
2、系统函数
⑴、$time与$realtime
$time、$realtime是属于显示仿真时间标度的系 统函数。这两个函数被调用时,都返回当前时刻 距离仿真开始时刻的时间量值,所不同的是, $time 函数以64位整数值的形式返回模拟时间, $realtime 函数则以实数型数据返回模拟时间。 如上加法器仿真调试程序。
⑵、$random
$random是产生随机数的系统函数,每次调用该函数将 返回一个32位的随机数,该随机数是一个带符号的整数。
⑶、$fopen和$fclose $fopen 和$fclose用于打开和关闭一个文件系统函数,
完成后返回一个与文件相关的整数指针。
6.2编译指令的使用
编译指令:
1、宏定义语句define和宏取消语句undef
⑵、延时的表示与延时说明块
延时的表示方法有下面几种: # delaytime # (d1,d2) # (d1,d2,d3) # delaytime表示延迟时间为delaytime,d1表示上升延 迟,d2表示下降延迟,d3则表示转换到高阻态z的延迟, 这些延迟的具体时间由时间定义语句'timescale确定。
module full_adder(cout,si,ai,bi,cin); output si,cout; input ai,bi,cin; assign {cout,si}=ai+bi+cin; endmodule
测试加法执行过程, 并检测执行情况。
ModelSim仿真结果
time ai bi cin cout sum # 0 0 + 0 + 0={0, 0} # 10 0 + 0 + 1={0, 1} # 20 0 + 1+ 0={0, 1} # 30 0 + 1+ 1={1, 0} # 40 1 + 0+ 0={0, 1} # 50 1 + 0+ 1={1, 0} # 60 1 + 1+ 0={1, 0} # 70 1 + 1+ 1={1, 1} # 80 0 + 0+ 0={0, 0} # 90 0 + 0+ 1={0, 1} #100 0 + 1+ 0={0, 1} #110 0 + 1+ 1={1, 0} #120 1 + 0+ 0={0, 1} #130 1 + 0+ 1={1, 0} #140 1 + 1+ 0={1, 0} #150 1 + 1+ 1={1, 1}
如在状态机中定义状态:
`define S0 2’b00; //定义状态编码 `define S1 2’b01; …; 一旦该指令被编译器通过,则尤其规定的宏定义在整个编译过程期间都保 持有效。并可在多个文件中有效,直到遇到取消宏定义指令。 `undef 宏名 取消之前定义的宏定义。
2、编译时包含其它文件指令
显示net来自百度文库数据的驱动强 度
显示层次名 以字符串形式输出
八进制数ddd对应的 ASCII字符
符号%
%t或%T
以当前的时间格式显示
未指定输出数据格式,可采用如下 默认任务显示形式:
$displayh $writeh $displayo $writeo
$displayb $writeb
仿真调试程序
module dis_1(); integer wait_timer; initial begin wait_timer=1; $display("after first assignment,", "wait_temer has value %d",wait_timer); wait_timer=2; $display("after first assignment,", "wait_temer has value %d",wait_timer); end endmodule Modelsim仿真下的输出:
采用层次电路设计的全加器仿真显示测试程序
`timescale 1ns/1ps module full_adder_tb; reg[2:0]in; wire sum, cout; integer i,j; full_adder FA(.cout(cout),.si(sum),.ai(in[2]),.bi(in[1]),.cin(in[0])); always #10 in=in+1; initial begin //这三条语句同时执行,但initial只执行一次, in=0; // 但由于其内的语句受时间控制,直到#160时刻才结束 $display(" time ai bi cin cout sum"); $monitor($time,,,"%b+%b+%b={%b,%b}",in[2],in[1],in[0],cout, sum); #160 $finish; end endmodule
监控输出任务$monitor是只要满足输出数值发生变 化就有输出显示。表中当在150ns~160ns期间没有 数值变化,所以没有显示160ns的输出结果。
⑷$readmemh与$readmemb
$readmemh与$readmemb是属于文件读写控制的系统 任务,其作用都是从外部文件中读取数据并放入存储器中。 两者的区别在于读取数据的格式不同,$readmemh为读 取十六进制数据,而$readmemb为读取二进制数据。 $readmemh与$readmemb的使用格式为: $readmemh("数据文件名",存储器名,起始地址,结 束地址); $readmemb("数据文件名",存储器名,起始地址,结 束地址); 其中,起始地址和结束地址均可以缺省,如果缺省起始地 址,表示从存储器的首地址开始存储;如果缺省结束地址, 表示一直存储到存储器的结束地址。
//显示
ModelSim仿真结果
⑶、延时说明块(specify块)
Verilog可对模块中某一指定的路径进行延迟定义, 这一路径连接模块的输入端口(或inout端口)与输出端 口(或inout端口),利用延迟定义块在一个独立的块结 构中定义模块的延时。在延迟定义块中要描述模块中的 不同路径并给这些路径赋值。 延迟定义块的内容应放在关键字specify与 endspecify之间,且必须放在一个模块中,还可以使用 specparam关键字定义参数。
系统任务和系统函数只能用于仿真,在系统综合过程中被忽略。
系统任务与函数分类
⑴显示任务 ⑵文件输入与输出任务 ⑶仿真控制任务 ⑷时间标度任务 ⑸ PLA建模任务 ⑹随机建模任务 ⑺变换函数 ⑻概率分布函数 ⑼字符格式化 ⑽命令行参变量
1.系统任务
⑴、$display与$write $display和$write是两个显示与写系统任务, 两者的功能相同,都用于显示模拟结果,其区别 是$display在输出结束后能自动换行,而 $write不能。 $display和$write的使用格式为: $display(“格式控制符”,输出变量名列表); $write(“格式控制符”,输出变量名列表);
⑶$finish与$stop
系统任务$finish与$stop用于对仿真过程进行控制,分 别表示结束仿真和中断仿真。 $finish与$stop 的使用格式如下: $stop; $stop(n); $finish; $finish(n); n是$finish和$stop的参数,n 可以是0、1、2等值,分 别表示如下含义。 0:不输出任何信息; 1:给出仿真时间和位置; 2:给出仿真时间和位置,还有其他一些运行统计数据。