testbench

What is testbench

编写testbench的主要目的是为了对使用硬件描述语言(HDL)设计的电路进行仿真验证,测试设计电路的功能、部分性能是否与预期的目标相符。

testbench构造

一些基本约定

简单的testbench的结构通常需要建立一个顶层文件,顶层文件没有输入和输出端口。在顶层文件里,把被测模块和激励产生模块实例化进来,并且把被测模块的端口与激励模块的端口进行对应连接,使得激励可以输入到被测模块。
一般用initial块给信号赋初值,initial块执行一次,always或者forever表示由事件激发反复执行。input对应的端口应当申明为reg,output对应的端口申明为wire。

时间精度与延迟

字符#,该符号的意思是指延迟timescale中设定的单位时间的个数。一般在testbench的开头定义时间单位和仿真精度,比如

1
`timescale 1ns/1ps

前面一个是代表时间单位,后面一个代表仿真时间精度。以上面的例子而言,一个时钟周期是 20 个单位,也就是 20ns。

时钟的发生

always加#延时固定时间间隔生成时钟信号,注意给时钟初始化。

1
2
3
4
5
6
7
8
9
10
always #10 begin
clk<=~clk;
end

initial begin
#0 begin
clk<=1'b0;
end
...
end

载入存储镜像

仿真时,有时需要向存储器预先载入准备好的数据。可以使用$readmemh系统任务从文件中读入数据并设置存储器。格式:$readsmemh(“文件名”,读入对象”)。存储镜像文件使用十六进制文本文件记录,每一行记录一个地址的数据。

A simple example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

timescale 1ns/1ps

module exam();
reg rst_n;
reg clk;
reg data;

initial
begin
clk = 1'b0;
rst = 1'b1;
#10
rst = 1'b0;
#500
rst = 1'b1;
end

always
begin
#10 clk = ~clk;
end

endmodule

PS.7isthecoolestgirlintheworld