HDL第十一章仿真与验证

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
initial begin $readmemh(“mem.hex”,my_mem) ; end ; /* 将文件mem_hex中的数据装载到存储器my_men 中,起始地址为0 */ initial begin $readmemh(“mem.hex”,my_mem,80) ; end ; /* 将文件mem_hex中的数据装载到存储器my_men 中,起始地址为80。 */
$write(“格式控制符”,输出变量名列表) ;
格式控制符
%h或%H %d或%D %o或%O %b或%B %c或%C

以十六进制形式显示 以十进制形式显示 以八进制形式显示 以二进制形式显示 以ASCII码形式显示

%v或%V %m或%M
%s或%S %t或%T
显示net型数据的驱动强度 显示层次名
返回当前时刻距离仿真开始时刻的时间值。两者的区别是间的区别是:
$time函数以64位整数值的形式返回模拟时间值,而在显示结束结果 后自动换行,而 $realtime函数以实数型数据返回模拟时间。。
例如: „timescale 10ns/1ns
module time_dif ; reg ts ; parameter DELAY=2.6 ; initial begin # DELAY ts=1 ; # DELAY ts=0 ; # DELAY ts=1 ;
end
endmodule
用仿真器仿真,其输出为:
# # # # # # 0 10 20 30 40 50 data=xxxxxxxxxxdxxxxx data=00010010000101010011010100100100 data=11000000100010010101111010000001 data=10000100100001001101011000001001 data=10110001111100000101011001100011 data=00000110101110010111101100001101
过编程语言接口(PLI)将自己定义的系统任务和函数加到语言中,以
进行仿真。 1、$display与$write $display和$write是两个系统任务,功能都是用于显示模拟结果,
之间的区别是:$display在显示结束结果后自动换行,而 $write不能。
调用格式相同,都为: $display(“格式控制符”,输出变量名列表) ;
# DELAY ts=0 ;
end initial $monitor($time,,, “ts=%b”,ts) ; endmodule 仿真器仿真时, 0 ts=x
其输出为:
3 ts=1
5 ts=0 8 ts=1 10 ts=0
若改为: „timescale 10ns/1ns
module time_dif ; reg ta ; parameter DELAY=2.6 ; initial begin # DELAY ts=1 ; # DELAY ts=0 ; # DELAY ts=1 ;
data=00000110110101111100110100001101
7、文件操作 文件打开:$ropen 用于打开某文件并准备对该文件进行写操作。 文件关闭:$fclose 用于文件关闭。
ቤተ መጻሕፍቲ ባይዱ
11.2 用户自定义元件
利用用户自定义原语(UDP),用户可以自定义各种逻 辑元件。用户可以像调用Verilog系统提供的基本门元件一 样调用自己定义的元件。但是UDPD元件不能用于综合的 设计描述中,只能用于仿真程序中。UDP与一般模块相似, 但块首与块尾用关键字:primitive和endprimitive。
$readmemh(“数据文件名”,存储器名,起始地址,结束地址);
$readmemb(“数据文件名”,存储器名,起始地址,结束地址); 其中,起始地址和结束地址都可以默认,默认起始地址为存储器的 首地址,默认的结束地址为存储器的末地址。
例如: reg [7:0 ] my_mem [ 0:255 ] ; //定义存储器;my_mem
table
// clk ? 0 0 1 reset 1 0 0 0 d ? 0 1 : : : : state ? ? ? ? : : : q 0 ; // 清0,高电平有效 0 ; // 触发输出 ; // clk=1,触发器输出保持 // 不变,用符号-表示
: 1 ; // 触发输出 : -
? :
例如:
$monitor ($time,“a=%b,b=%h”,a,b); 每当a、b信号的值发生变化,则系统都会激活上面的语句,显示 当前仿真时间、二进制格式的a信号和十六进制格式的b信号。 3、$time与$realtime $time与$realtime是两个显示仿真时间标度的系统函数。调用它们时,
0
0 1 1 1 1 endtable
1
1 0 0 1 1
0 : 0 ;
1 : 1 ; 0 : 0 ; 1 : 1 1 : 1 ; ; 0 : 1 ;
endprimitive
若考虑输入有可能为随意项x,则UDP为::
primitive carry_udp(cout,cin,a,b);
input cin,a,b ;output cout ; table // cin 0 0 ? a 0 ? 0 b : cout 0 : 0 //真值表 ? : 0 ; //用通配符?代替x ; //只要有两个输入为0, 0 : 0 ; // 进位输出必为0
器进行交互控制。而当仿真程序执行$finish语句时,则结束仿真,返
回到主操作系统。
5、$readmemh与$readmemb $readmemh与$readmemb是文件读/写控制的系统任务,其作用是从 外部文件中读取数据放入存储器中。两者的区别是$readmemh是读取 十六进制数据,而$readmemb是读取二进制数据。 调用格式相同:
6、$random $random是产生随机数的系统任务,每次调用该函数将返回一个32位 的随机整数。
例如:
„timescale 10ns/1ns module random_tp ; integer data,i ; parameter DELAY=10 ; initial $monitor ( $time,,,”data=%b”,data ) ; initial begin for( i=0 ; i<+100 ; i=i+1 ) # DELAY data=$random ;
第11章 Verilog 仿真与验证
本章介绍了如何编写测试验证程序(test bench)。测
试验证程序用于测试和验证设计的正确性。Verilog HDL
提供强有力的结构来说明测试验证程序。
11.1 系统任务与系统函数
系统任务和系统函数以$开头,例如:$display、$monitor等。其 作用要用于仿真,一般在initial或always过程块中调用。用户可以通
11.2.2 时序电路UDP元件
时序电路元件的输出不但取决于当前的输入,还与电路的当前的内部状态有关。 对应的upd元件描述中需要考虑其内部状态。
primitive latch_udp(q,clk,reset,d ;//电平触发的一位数据UDP锁存器
input clk,reset,d ;output q ; reg q ; //clk低电平触发, initial q=1‟b1 ; //初始化
列中字符或变量的值的功能显示模拟结果。
调用格式相同,都为:
$monitor(“格式控制符”,输出变量名列表) ; $strobe(“格式控制符”,输出变量名列表) ;
$monitor与$strobe是之间的区别是: $monitor相当于一个持续的实
时监控器,如果输出变量列表中的任何变量发生变化,则系统将按语 句中规定的格式将结果都输出一次;而$strobe相当于选通监控器, 只有在模拟时间发生改变时,并且所有的时间都处理完毕后,才将结 果输出。
定义UDP的语法如下: primitive 元件名(输出端口,输入端口1,输入端口2,…); output 输出端口名 ; input reg 输入端口1,输入端口2,…; 输出端口名 ; 输出端口或内部寄存器赋初值(0、1、或 x) ; end table // 输入1 真值列表 endtable 输入2 。。。:输出
UDP具有以下特点: 1)UDP的输出口只能有一个,且必须位于端口列表的第 一项,只有输出端口能被定义为reg类型。 2)UDP的输入端口可以有多个。一般时序电路UDP的输 入端口可以多至9个,组合电路UDP的输入端口可多至 10个。 3)所有端口的变量必须是一位标量。 4)在table 表项中,只能出现0、1、x三种状态,不允许出 现z状态。
endtable
endprimitive
primitive dff_udp(q,d,clk); //上升沿触发的D触发器 UDP
input d,clk ;output q ; reg q ;
table // clk (01) (01) (0x) (0x) d 0 1 1 0 : : : : : state ? ? 1 0 : : : : : q 0 ; // clk上升沿触发,q=d 1 ; 0 ; // clk=0时,q不变,clk上升沿,q=d 0 ;
仿真它们。 调用格式: n是调用时给出的参数,可以取0、1、2。 分别表示: 0:不输出任何参数; 1:给出仿真的时间和位置。 2:给出仿真的时间和位置以及其它一些运
$stop;
$stop(n) ; $finish ;
$finish(n) ;
行统计数据。
若不带参数,默认为1.
当仿真程序执行到$stop语句时,将暂停仿真,以便设计者与仿真
# DELAY ts=0 ;
end initial $reltime($time,,, “ts=%b”,ts) ; endmodule 0 仿真器仿真时, 其输出为: ts=x
2.6
5.2 7.8
ts=1
ts=0 ts=1
11.4 ts=0
4、$finish与$stop
$finish与$stop用于对仿真过程进行控制,分别表示结束仿真和中断
#
# #
60
70 80
data=01000110110111111001100110001101
data=10110010110000101000010001100101 data=10001001001101110101001000010010
#
#
90
100
data=00000000111100111110001100000001
initial begin
endprimitive
11.2.1 组合电路UDP元件
primitive carry_udp(cout,cin,a,b);//一位全加器进位输出UDP input cin,a,b ;output cout ; table // cin 0 0 a 0 0 b : cout 0 : 0 ; 1 : 0 ;

1 1
1
? 1
1 : 1 ;
1 : ? : 1 1 ;
//只要有两位输入为1,
; //进位输出必为1
endtable endprimitive
primitive mux3_1(y,in0,in1,in2,s2,s1); //3选1多路选择器 input in0,in1,in2 ;output y ; table // in0 in1 in2 s2 s1 : y 0 ? ? 0 0 : 0 ; //s2s1=00,y=in0 1 ? ? 0 0 : 1 ; ? 0 ? 0 1 : 0 ; // s2s1=01,y=in1 ? 1 ? 0 1 : 1 ; ? ? 0 1 ? : 0 ; ? ? 1 1 ? : 1 ; //s2s1=1x,y=in2 0 0 ? 0 ? : 0 ; 1 1 ? 0 ? : 1 ; 0 ? 0 ? 0 : 0 ; 1 ? 1 ? 0 : 1 ; ? 0 0 ? 1 : 1 ; ? 1 1 ? 1 : 1 ; endtable endprimitive
以字符串形式显示 以当前的时间格式显示
例如:设 a=32,b=18,c=9。则执行语句 $display(“a=%h,b=%d,c=%b”,a,b,c);后显示
a=20,b=18,c=1001
2、$monitor与$strbo
$monitor与$strbo是两个输出控制类系统任务,提供监控和输出参数
相关文档
最新文档