Testbench編寫指南(4)自動化驗證方法
自動化驗證testbench結果可以減少人工檢查的時間和可能犯的失誤,尤其對於比較大的設計。目前普遍使用三種自動化testbench驗證方法:
- 資料庫比較:首先建立一個包含預期輸出的資料庫檔案(稱作golden vector檔案),然後捕獲模擬輸出與該檔案中的參考向量作比較。但是由於沒有提供從輸出到輸入檔案的指標,該方法的缺點是難以追蹤導致不正確輸出的錯誤源。
- 波形比較:將testbench輸出波形與預期波形作比較。Xilinx曾推出過一款HDL Bencher的工具,可以執行自動化的波形比較,不過目前由於該方法很少使用,Xilinx也下架了該工具。
- 自我檢查testbench設計:與前兩種方法不同,該方法實時檢查預期結果和實際結果,而不是模擬結束後才檢查。在testbench中插入錯誤追蹤資訊可以顯示設計在哪裡失敗,從而縮短除錯時間。
本文將介紹最後一種自動化驗證方法。將一系列預期向量(比如由MATLAB等軟體產生)放在testbench檔案中,在執行時間間隔與實際模擬結果比較,如果匹配則表明模擬成功;不匹配則報告結果不符。
比較時間可以選擇在每個時鐘邊沿,或者沒n個時鐘週期比較一次,總而言之要與設計相符合。比如記憶體I/O的testbench應該在讀出或寫入一個新資料後就進行比較;如何設計使用了大量組合邏輯模組,選取比較時間必須考慮組合邏輯延遲。
對於中小型設計而言,自我檢查的testbench設計方法是一種不錯的選擇,但是對於複雜的大型設計,可能的輸出組合呈指數形式增加,編寫一個自我檢查testbench將會困難很多。下面給出一個自我檢查testbench的設計示例(來源於xapp199):
`timescale 1 ns / 1 ps
module test_sc;
// 訊號申明
reg tbreset, tbstrtstop;
reg tbclk;
wire [6:0] onesout, tensout;
wire [9:0] tbtenthsout;
parameter cycles = 25;
reg [9:0] Data_in_t [0:cycles];
// 例項化設計
stopwatch UUT (.CLK (tbclk), .RESET (tbreset), .STRTSTOP (tbstrtstop),
.ONESOUT (onesout), .TENSOUT (tensout), .TENTHSOUT (tbtenthsout));
wire [4:0] tbonesout, tbtensout;
assign tbtensout = led2hex(tensout);
assign tbonesout = led2hex(onesout);
//-------------------------------------------------------------
// 預期結果
//-------------------------------------------------------------
initial begin
Data_in_t[1] =10'b1111111110;
Data_in_t[2] =10'b1111111101;
Data_in_t[3] =10'b1111111011;
Data_in_t[4] =10'b1111110111;
Data_in_t[5] =10'b1111101111;
Data_in_t[6] =10'b1111011111;
Data_in_t[7] =10'b1110111111;
Data_in_t[8] =10'b1101111111;
Data_in_t[9] =10'b1011111111;
Data_in_t[10]=10'b0111111111;
Data_in_t[11]=10'b1111111110;
Data_in_t[12]=10'b1111111110;
Data_in_t[13]=10'b1111111101;
Data_in_t[14]=10'b1111111011;
Data_in_t[15]=10'b1111110111;
Data_in_t[16]=10'b1111101111;
Data_in_t[17]=10'b1111011111;
Data_in_t[18]=10'b1110111111;
Data_in_t[19]=10'b1101111111;
Data_in_t[20]=10'b1011111111;
Data_in_t[21]=10'b0111111111;
Data_in_t[22]=10'b1111111110;
Data_in_t[23]=10'b1111111110;
Data_in_t[24]=10'b1111111101;
Data_in_t[25]=10'b1111111011;
end
reg GSR;
assign glbl.GSR = GSR;
initial begin
GSR = 1;
// 等到全域性復位結束
#100 GSR = 0;
end
//建立一個時鐘
initial begin
tbclk = 0;
//全域性復位結束後開始產生時鐘訊號
#100 forever #60 tbclk = ~tbclk;
end
//給出設計激勵
initial begin
tbreset = 1;
tbstrtstop = 1;
#240 tbreset = 0;
tbstrtstop = 0;
#5000 tbstrtstop = 1;
#8125 tbstrtstop = 0;
#500 tbstrtstop = 1;
#875 tbreset = 1;
#375 tbreset = 0;
#700 tbstrtstop = 0;
#550 tbstrtstop = 1;
#100000 $stop;
end
//-------------------------------------------------------------
// 在每個時鐘的下降沿比較預期結果和實際結果
//-------------------------------------------------------------
integer i,errors;
always @ (posedge tbclk) begin
if (tbstrtstop) begin
i = 0;
errors = 0;
end
else begin
for (i = 1; i <= cycles; i = i + 1) begin
@(negedge tbclk)
// 每個下降沿檢查結果
$display("Time%d ns; TBSTRTSTOP=%b; Reset=%h; Expected
TenthsOut=%b; Actual TenthsOut=%b", $stime, tbstrtstop, tbreset,
Data_in_t[i], tbtenthsout);
if ( tbtenthsout !== Data_in_t[i] ) begin
$display(" ------ERROR. A mismatch has occurred-----");
errors = errors + 1;
end
end
if (errors == 0)
$display("Simulation finished Successfully.");
else if (errors > 1)
$display("%0d ERROR! See log above for details.",errors);
else
$display("ERROR! See log above for details.");
#100 $stop;
end
end
endmodule
上述程式碼中,將預期結果和實際結果的比較情況顯示在終端。該程式碼模板可應用於任何設計的自我檢查testbench中,需要修改例項化介面和預期的輸出值。如果不需要在每個時鐘沿檢查一次資料,則修改for迴圈的執行條件。
相關文章
- Testbench編寫指南(1)基本組成與示例
- Web自動化-Selenium自動化測試-4-編寫測試用例Web
- java安全編碼指南之:方法編寫指南Java
- web自動化測試框架-06 如何快速編寫自動化指令碼Web框架指令碼
- 自動化驗證碼登入如何實現?
- playwright--自動化(二):過滑塊驗證碼 驗證碼缺口識別
- 自動化測試中的驗證碼處理
- 使用gulp編寫常用自動化構建任務
- python+pytest介面自動化(12)-自動化用例編寫思路 (使用pytest編寫一個測試指令碼)Python指令碼
- 自動化測試時對驗證碼的處理
- 使用Pandaria編寫API自動化測試進階用法API
- 偷懶之 validator 驗證器免寫 messages 自動中文輸出
- 自動化測試框架指南框架
- 使用Fortran實現當前驗證碼自動化處理
- Python web自動化爬蟲-selenium/處理驗證碼/XpathPythonWeb爬蟲
- ui 自動化有必要更換並驗證圖片嗎UI
- 簡單驗證碼識別及工具編寫思路
- 如何編寫linux下nandflash驅動-4LinuxNaN
- iOS自動化編譯打包iOS編譯
- 使用 Forth 實現驗證碼識別與自動化登入
- 使用 Crystal 實現驗證碼識別與自動化登入
- 使用 Zig 實現自動化登入並處理驗證碼
- 使用 Nim 和 Python 自動化處理登入和驗證碼Python
- 驗證碼處理在自動化測試中的應用
- ThinkPHP3.2.3 欄位對映/自動驗證/自動完成PHP
- 14 點自動化經驗
- eBPF編寫避坑指南eBPF
- 如何使用Selenium自動化測試工具獲取動態圖片驗證碼?
- Webpack自動化構建實踐指南Web
- 12306自動搶票及自動識別驗證碼功能(二)
- WWDC 2018:自動強密碼與驗證碼自動輸入密碼
- 使用 C++ 實現驗證碼識別與自動化登入C++
- Java + Selenium + OpenCV解決自動化測試中的滑塊驗證JavaOpenCV
- 使用 JavaScript 驗證電子郵件的 4 種方法JavaScript
- 使用 Vyper 和 Python 進行自動化登入並處理驗證碼Python
- 得物技術埋點自動化驗證的探索和最佳實踐
- HamronyOS 自動化測試框架使用指南框架
- 編寫 PyKD 除錯指令碼,自動化地 Sniffer VMware 的 RPC 請求除錯指令碼RPC