一个完整的设计,除了良好的功能描述代码,对程序的仿真验证时不可少的。学会如何去验证自己所写的程序,即如何调试自己的程序是一件非常重要的事情。而RTL逻辑设计中,学会根据硬件逻辑来写测试程序。即Testbench是尤其重要的。Verillog测试平台是一个例化的待测(MUT)模块,重要的是给他施加激励并观测器输出。逻辑模块与对应的测试平台共同组成仿真模型,应用这个模型可以测试该模块是否符合自己设计的要求。
编写Testbench的目的是为了对使用硬件描述语言设计的电路进行仿真验证、测试设计电路功能、性能与设计的是否相符。通常,编写测试文件的过程如下:
- 产生模拟激励
- 将产生的激励加入到被测模块中并观察其响应
- 将输出响应与期望值比较
1.1Testbench 文件结构
通常一个完整的测试文件结构为
module Test_bench(); //通常无输入无输出
信号或变量定义声明
逻辑设计中输入对用reg型
逻辑设计中输出对应wire型
使用initial 或 always 语句产生激励
例化待测试模块
监控和比较输出响应
endmodule
1.2 时钟激励设计
下面里举出一些常用的封装子程序,这些是常用的写法,在很多应用中都能应用到。
/*-----------------------------------------------
时钟激励产生方法一:50%占空比时钟
-----------------------------------------------*/
parameter clockperiod = 10;
initial
begin
clk_i = 0;
forever
#(clock_period/2) clk_i = ~clk_i;
end
/*-----------------------------------------------
时钟激励产生方法二:50%占空比时钟
-----------------------------------------------*/
initial
begin
clk_i = 0;
always #(clock_period/2) clk_i = ~clk_i;
end
/*-----------------------------------------------
时钟激励产生方法三:产生固定数量的时钟脉冲
-----------------------------------------------*/
initial
begin
clk_i = 0;
repeat(6)
#(clock_period) clk_i= ~clk_i;
ebd
/*-----------------------------------------------
时钟激励产生方法四:产生非占空比为50%的时钟
-----------------------------------------------*/
initial
begin
clk_i = 0;
forever
begin
#((clock_period/2)-2) clk_i