書名: Verilog HDL數字系統設計及實踐作者名: 劉睿強 童貞理 尹洪劍編著本章字數: 716字更新時間: 2018-12-29 04:07:12
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產生的激勵波形及其得到的輸出