Verilog HDL数字系统设计及实践
上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产生的激励波形及其得到的输出