上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.4 Testbench的概念
除了利用层次化设计思想设计电路的功能模块外,通常一个完整的Verilog系统设计还应该包括测试模块。必须对设计进行全面的测试以验证其功能正确与否,以便在进行芯片生产前及时发现问题并进行修改。在设计数字电路系统时,通常将测试模块和功能模块分开设计,其中测试模块也称测试台(Testbench)。Testbench同样可以用Verilog来描述,这使得系统测试更为容易。
Testbench是通过对设计部分施加激励,然后检查其输出正确与否来完成其验证功能的。
下面以例1.1的设计为测试目标,来设计一个简单的Testbench。
【例1.3】为例1.1中的全加器设计Testbench,以验证其功能。
// example_1_3: 一个简单的Testbench module tb_fadder (); reg [3:0] A, B; reg Cin; wire [3:0] S; wire Cout; // 通过实例化在Testbench中调用被测对象fadder_4模块 fadder_4 u_fadder_4 ( .i_A(A), .i_B(B), .i_Cin(Cin), .o_S(S), .o_Cout(Cout) ); // 添加激励 initial begin #0 A = 4'b0000; // 激励信号i_A初始值0 B = 4'b0000; // 激励信号i_B初始值0 Cin = 1'b0; // 激励信号i_Cin初始值0 #20 A = 4'b1111; // 20 ns后, i_A值变为15 #20 B = 4'b0001; // 20 ns后, i_B值变为1 #20 A = 4'b1110; // 20 ns后, i_A值变为14 #20 Cin = 1'b1; // 20 ns后, i_Cin值变为1 #10 $finish; // 结束仿真 end // 调用系统函数$monitor, 监视列表中的参数变化并显示 initial $monitor($time, " A:%d B:%d Cin:%d , sum:%d , carry:%d ", A, B, Cin, S, Cout); endmodule
Testbench结构如图1.5所示。测试模块tb_fadder调用设计模块fadder_4并实例化为u_fadder_4。tb_fadder模块中还包含添加激励和观察全加器运算结果的模块,其结构如图1.6所示。
图1.5 Testbench结构
图1.6 tb_fadder结构
图1.7显示了A, B, Cin的激励波形,与例1.3中第一个initial语句描述的行为一致。而从系统函数$monitor中得到的仿真结果如下:
0 A: 0 B: 0 Cin:0 , sum: 0 , carry:0 20 A:15 B: 0 Cin:0 , sum:15 , carry:0 40 A:15 B: 1 Cin:0 , sum: 0 , carry:1 60 A:14 B: 1 Cin:0 , sum:15 , carry:0 80 A:14 B: 1 Cin:1 , sum: 0 , carry:1
因为被测模块是一个4位二进制全加器,所以输出结果的最大值为十进制的15。若求和结果大于15,将产生一个进位信号。输出端口S,Cout的波形在图1.7中已显示,与系统函数$monitor打印出的结果也是一致的。
图1.7 Testbench产生的激励波形及其得到的输出