微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > FPGA系统设计的仿真验证之: 仿真测试文件(Testbench)的设计方法

FPGA系统设计的仿真验证之: 仿真测试文件(Testbench)的设计方法

时间:06-05 来源:互联网 点击:

印信号的ASCII值

initialbegin

$timeformat(-9,1,ns,12);//设置输出时钟格式

$display(TimeClkRstLdSftRgDataSel);//显示输入的字符串

$monitor(%t%b%b%b%b%b%b,//设置输出信号的格式

$realtime,clock,reset,load,shiftreg,data,sel);//指定输出的信号

end

$display是将函数内部双引号中的字符串输出在终端中。而$monitor则不同,因此它的输出是事件驱动的。在例子中,$monitor信号列表中的$realtime信号变化会触发终端显示事件的发生,该信号被设计者对应到仿真时间中,每次$monitor的触发将会把信号列表中的信号值显示在终端中。

$monitor语句中的“%”用于定义信号列表中信号的输出格式。例如,%t将信号按照时间格式输出,%b将信号按照二进制格式输出。另外,VerilogHDL语言还提供了其他的输出格式,比如%h为十六进制输出,%d为十进制输出,%o为八进制输出等。更为详细的格式输出定义可以参看Verilog参考手册。

7.5.3测试常用语句

常用的Verilog测试用结构语句,比如$monitor、$display和$time在上面已经介绍过了。下面再来介绍一些其他的常用语句。

1.force/release

force和release语句可以用来强制对执行过程中的寄存器或网络型信号量赋值。这两条语句共同完成一个强制赋值的过程。当一个被force的信号被release以后,这个信号将会保持当时的状态直到下一个赋值语句产生为止。

下面举个例子来说明这两条语句的使用。

moduletestbench;

...

initialbegin

reset=1;//在仿真时间零点将reset激励为1

forceDataOut=101;//在仿真时间零点强制使DataOut为101,并保持

#25reset=0;//在仿真绝对时间25将reset激励为0

#25releaseDataOut;//在仿真绝对时间50释放

//DataOut值将保持直至下一个对它的赋值语句

...

end

endmodule

2.assign/deassign

assign/deassign语句与force/release语句相类似,不过assign/deassign语句只能对设计中的寄存器型信号赋值。它们常常被用来设置输入值。

下面是这两个语句的例子。

moduletestbench;

...

initialbegin

reset=1;//绝对时间零点对reset赋值1

DataOut=101;

#25reset=0;//绝对时间25对reset赋值0

releaseDataOut;

...

end

initialbegin

#20assignreset=1;//此条语句覆盖之前的赋值语句(即绝对时间零点的赋值)

#25reset=0;//绝对时间45对reset赋值0

#50releasereset;//绝对时间95释放reset信号

endmodule

3.timescales

timescale语句用于定义测试文件的单位时间,同时也对仿真的精度有影响。它的语法定义如下:

‘timescalereference_time/precision

其中,reference_time是单位时间的度量,precision决定了仿真的推进延迟精度,同时也设置了仿真的推进步进单位。下面是timescale语句的使用范例:

‘timescale1ns/1ps//度量参考为1ns,精度为1ps

moduletestbench;

...

initialbegin

#5reset=1;//5个仿真时间延迟,相当于5×1ns=5ns的仿真时间

#10reset=0;

...

end

initialbegin

//display语句将在每一个仿真推进步进中执行,也就是1ps执行一次

$display(“%d,Reset=%b”,$time,reset);

end

endmodule

应该注意的是,如果仿真中使用了时间延迟值,那么仿真的精度应大于最小的延迟值。例如仿真中使用了9ps的仿真时间延迟,那么仿真的推进步进精度必须为1ps来保证9ps的延迟。

4.ReadingMemoryInitializationFiles

VerilogHDL提供了$readmemb和$readmemh命令来读取ASCII文件,用于初始化memory的内容。这两个语句可以用于初始化FPGA中由IPCore生成的存储器宏模块,例如RAM、ROM等。

下面是利用这个语句对Xilinx的实例(design_instance)进行初始化的例子。

$readmemb(“design.mif>”,design_instance);

其中,mif文件是Xilinx的CoreGenerator建立的对存储器进行初始化的文件。用户也可以自己编写这个文件的内容。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top