??自動(dòng)化驗(yàn)證testbench結(jié)果可以減少人工檢查的時(shí)間和可能犯的失誤,尤其對(duì)于比較大的設(shè)計(jì)。目前普遍使用三種自動(dòng)化testbench驗(yàn)證方法:
數(shù)據(jù)庫(kù)比較:首先創(chuàng)建一個(gè)包含預(yù)期輸出的數(shù)據(jù)庫(kù)文件(稱(chēng)作goldenvector文件),然后捕獲仿真輸出與該文件中的參考向量作比較。但是由于沒(méi)有提供從輸出到輸入文件的指針,該方法的缺點(diǎn)是難以追蹤導(dǎo)致不正確輸出的錯(cuò)誤源。
波形比較:將testbench輸出波形與預(yù)期波形作比較。Xilinx曾推出過(guò)一款HDL Bencher的工具,可以執(zhí)行自動(dòng)化的波形比較,不過(guò)目前由于該方法很少使用,Xilinx也下架了該工具。
自我檢查testbench設(shè)計(jì):與前兩種方法不同,該方法實(shí)時(shí)檢查預(yù)期結(jié)果和實(shí)際結(jié)果,而不是仿真結(jié)束后才檢查。在testbench中插入錯(cuò)誤追蹤信息可以顯示設(shè)計(jì)在哪里失敗,從而縮短調(diào)試時(shí)間。
??本文將介紹最后一種自動(dòng)化驗(yàn)證方法。將一系列預(yù)期向量(比如由MATLAB等軟件產(chǎn)生)放在testbench文件中,在運(yùn)行時(shí)間間隔與實(shí)際仿真結(jié)果比較,如果匹配則表明仿真成功;不匹配則報(bào)告結(jié)果不符。
??比較時(shí)間可以選擇在每個(gè)時(shí)鐘邊沿,或者沒(méi)n個(gè)時(shí)鐘周期比較一次,總而言之要與設(shè)計(jì)相符合。比如內(nèi)存I/O的testbench應(yīng)該在讀出或?qū)懭胍粋€(gè)新數(shù)據(jù)后就進(jìn)行比較;如何設(shè)計(jì)使用了大量組合邏輯模塊,選取比較時(shí)間必須考慮組合邏輯延遲。
??對(duì)于中小型設(shè)計(jì)而言,自我檢查的testbench設(shè)計(jì)方法是一種不錯(cuò)的選擇,但是對(duì)于復(fù)雜的大型設(shè)計(jì),可能的輸出組合呈指數(shù)形式增加,編寫(xiě)一個(gè)自我檢查testbench將會(huì)困難很多。下面給出一個(gè)自我檢查testbench的設(shè)計(jì)示例(來(lái)源于xapp199):
`timescale 1 ns / 1 ps module test_sc; // 信號(hào)申明 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]; // 實(shí)例化設(shè)計(jì) 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); //------------------------------------------------------------- // 預(yù)期結(jié)果 //------------------------------------------------------------- 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; // 等到全局復(fù)位結(jié)束 #100 GSR = 0; end //建立一個(gè)時(shí)鐘 initial begin tbclk = 0; //全局復(fù)位結(jié)束后開(kāi)始產(chǎn)生時(shí)鐘信號(hào) #100 forever #60 tbclk = ~tbclk; end //給出設(shè)計(jì)激勵(lì) 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 //------------------------------------------------------------- // 在每個(gè)時(shí)鐘的下降沿比較預(yù)期結(jié)果和實(shí)際結(jié)果 //------------------------------------------------------------- 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) ? ? ? ?// 每個(gè)下降沿檢查結(jié)果 ? ? ? ?$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
??上述代碼中,將預(yù)期結(jié)果和實(shí)際結(jié)果的比較情況顯示在終端。該代碼模板可應(yīng)用于任何設(shè)計(jì)的自我檢查testbench中,需要修改實(shí)例化接口和預(yù)期的輸出值。如果不需要在每個(gè)時(shí)鐘沿檢查一次數(shù)據(jù),則修改for循環(huán)的執(zhí)行條件。
審核編輯:劉清
-
比較器
+關(guān)注
關(guān)注
14文章
1637瀏覽量
107120 -
MATLAB仿真
+關(guān)注
關(guān)注
4文章
176瀏覽量
19904 -
HDL語(yǔ)言
+關(guān)注
關(guān)注
0文章
47瀏覽量
8912
原文標(biāo)題:Testbench編寫(xiě)指南(4)自動(dòng)化驗(yàn)證方法
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論