时间:2024-07-30 来源:网络搜集 关于我们 0
一、TestBench
TestBench在FPGA项目开发中是非常重要的一部分,编写正确的TestBench,能够高效的验证我们的FPGA逻辑代码,便于修改代码,BUG ,测试设计电路的功能、部分性能是否与预期的目标相符。
TestBench的测试过程主要是产生逻辑单元的测试激励,将测试激励输入被测模块单元,通过观察波形输出及响应,从而判断设计的正确性,与设计预期是否相符。
二、一个完整的TestBench文件
举例说明
三、Test Bench的常用功能
1、函数
函数的定义语法如下:
fnction<返回值类型或返回值宽度> <函数名>;
<输入端口说明>
<局部变量说明>
begin
<行为语句1;>
<行为语句2;>
…….
<行为语句n;>
end
endfunction
“<函数名>”是被定义函数所取的一个名称,对被定义函数的调用是通过这个函数名来进行的。这个函数名在函数定义结构内部还代表着一个内部变量,函数调用后的返回值是通过这个函数名变量传递给调用语句。
<返回值类型或返回值宽度>是可选的,它用来对函数调用返回数据的类型或宽度进行说明,它可以有三种形式:
1)、[msb:lsb]: 这种形式说明函数名代表的返回数据变量是一个多位的寄存器变量它的位数由[msb:lsb]指定,比如如下函数定义语句:
fnction[7:0]adder;
就定义了一个函数adder,它的函数名adder还代表着一个8位宽的寄存器变量,其最高位为第7位,最低位为第0位。
2)、integer: 这种形式说明函数名代表的返回变量是一个整数型变量。
3)、real: 这种形式说明函数名代表的返回变量是一个实数型变量。
function函数结构
2、任务
一般用于编写测试模块或者行为描述的模块。其中可以包含时间控制(如:# delays, @, wait);也可以包含input, output 、inout 端口定义和参数;也可以调用其他的任务或函数。
1)、任务调用是通过在Verilog模块中写入任务名来实现的。
2)、任务中可以包含input, output和inout端口变量的声明。
传递给任务的变量与任务I/O端口变量的声明次序相同。虽然传递给任务的变量名可以和任务内声明的I/O端口变量名相同,但是为了使任务成为一个独立的可共用的任务块,建议不要使用与任务内声明的I/O端口变量名相同的变量名,最好给传递到任务的变量起新的不同的名字。
3)、在任务中可以使用时间控制。
4)、任务使Verilog有更广阔的适用范围。
5)、关键字disable可以用来禁止任务的执行。
task结构
3、系统函数
1)、标准输出任务
$write与C的printf函数功能类似,不带有输出字符串、表达式及变量。
$display(<format_specifiers>,signal,signal,……)。
其中,<format_specifiers>用来指定输出格式。下表是各种不同的输出格式:
输出格式符格式说明 %d or %D
十进制格式%b or %B
二进制格式%h or %H
十六进制格式%m or %M
模块的分级名%o or %O
八进制格式%t or %T
时间格式%e or %E
指数格式输出实数%f or %F
浮点格式输出实数%g or %G
以上述两种格式中较短的输出实数%c or %CASCII码格式%s or %S字符串格式%v or %V输出连线型数据的驱动强度\n换行\tTab键\\字符\\*字符*\ddd3位八进制数表示的ASCII值%%符号%。
2)、文件管理任务
文件管理主要由4个函数,$fwrite , $fread,$fopen, $fclose。
$fopen函数:
语法格式: <file_handle>=$fopen(“<file_name>”,‘r‘或‘w)。<file_name>指定被打开的文件名及其路径。
$fwrite函数:
语法格式: $fwrite(<file_handle>,"数据类型",fixed_fir_result[32:0]);fixed_fir_result[32:0]寄存器是要存到文件里的内容。
$fread函数:
语法格式:$fread( myreg,<file_handle>);将<file_handle>内容读到myreg寄存器。
$fclose函数:
语法格式:$fclose(<file_handle>);
3)、仿真控制任务
Verilog HDL中两个系统任务可以用来结束仿真:$finish和$stop。
$finishi用来终止仿真器的运行,结束仿真过程并返回到操作系统。
$stop暂时挂起仿真器。
4)、时间函数
时间显示函数包括:
1)、$time: 返回64位的整数,指定当前的仿真时间
2)、$stime: 返回32位的仿真时间
3)、$realtime: 以实数形式返回当前的仿真时间
4、常用编译预处理
1)、`define 宏定义
`define <宏名> <宏文本>
2)、`include 包含文件
`include “global.v”
`include “parts/counter.v”
`include “../../library/mux.v”
3)、`timescale
timescale是Verilog HDL 中的一种时间尺度预编译指令,它用来定义模块的仿真 时的时间单位和时间精度。
5、随机函数
随机函数语法:$random%<number>;
•其中,<numer>为一大于0的整数,用来指定所产生随机数的范围,即<number>+1到<number>-1。
以上是TestBench编写时常用功能,但不一定非有不可,要活学活用。