testbench是一種驗證的手段。首先,任何設計都是會有輸入輸出的。但是在軟環(huán)境中沒有激勵輸入,也不會對你設計的輸出正確性進行評估。那么此時便有一種,模擬實際環(huán)境的輸入激勵和輸出校驗的一種“虛擬平臺”的產(chǎn)生。在這個平臺上你可以對你的設計從軟件層面上進行分析和校驗,這個就是testbench的含義。
testbench怎么寫
一個最基本的Testbench包含三個部分,信號定義、模塊接口和功能代碼。借用一下特權(quán)同學總結(jié)的編寫Testbench的三個基本步驟:
1、對被測試設計的頂層接口進行例化;
2、給被測試設計的輸入接口添加激勵;
3、判斷被測試設計的輸出相應是否滿足設計要求。
逐步解決編寫Testbench的這三點:
首先“對被測試設計的頂層接口進行例化”,這一步相對比較簡單,例化就是,但端口多時也夠喝一壺的,而且要分wire、reg,有時會弄錯,別難過,其實可以偷個懶,通過Quartus II自動生成一個Testbench的模板,選擇Processing -》 Start -》 Start Test Bench Template Writer,等待完成后打開剛才生成的Testbench,默認是保存在simulation\Modelsim文件夾下的.vt格式文件。這一步就不多講了,偷懶就挺好。
其次“給被測試設計的輸入接口添加激勵”,一般時序設計必然涉及到最基本的兩個信號——clk、rst_n(時鐘、復位),肯定有童鞋會講可以沒有rst_n,是可以沒有,但何必呢,讓代碼更健壯一點不很好嘛,別鉆牛角尖。下面攻克clk、rst_n的寫法:
首先先講一下timescale,因為想要進行仿真首先要規(guī)定時間單位,而且最好在Testbench里面統(tǒng)一規(guī)定時間單位,而不要在工程代碼里定義,因為不同的模塊如果時間單位不同可能會為仿真帶來一些問題,而timescale本身對綜合也就是實際電路沒有影響。 `timescale 1ns/ 1ps表示仿真的單位時間為1ns,精度為1ps。
上述三種代碼的目的就是產(chǎn)生系統(tǒng)時鐘,給clk一個初值后,不斷重復執(zhí)行:每10ns翻轉(zhuǎn)一次clk,從而生成一個周期為20ns,頻率50MHz的方波信號。第一、二種基本類似,第三種比較簡單,少了一個initial,放在了always里初始化。
三種方法都無一例外地給clk賦了初值,因為信號的缺省值為Z,如果不賦初值,則反相后還是Z,時鐘就一直處于高阻Z狀態(tài)。小編同學一般選中第一種,看個人喜歡。
根據(jù)復位方式的不同,rst_n一般有兩種寫法:
上述兩種代碼的目的基本都是延時復位,但一個異步復位,一個同步復位,用途不同,小編同學一般使用異步復位。
最后“判斷被測試設計的輸出相應是否滿足設計要求”。首先介紹最常用的兩個系統(tǒng)任務函數(shù)$stop和$finish。$stop代表暫停仿真后返回軟件操作主窗口,將控制權(quán)交給user;$finish代表終止仿真后關(guān)閉軟件操作主窗口。其他任務函數(shù)如$monitor、$display 、$time、$fwrite等也比較重要,用到的時候再一一介紹。為直觀介紹,使用一個例程來描述,下面是加法器的RTL代碼及Testbench:
?
注意了clk、rst_n后,其他端口根據(jù)需要相應加測試信號即可,然后把RTL代碼及Testbench添加到Modelsim仿真觀察輸出波形等,以驗證RTL代碼的正確與否,若與預期相符則驗證結(jié)束,反之則修改代碼至與預期相符。
好了,Testbench就寫到這里,但沒有結(jié)束,實踐是檢驗真理的唯一標準,下一篇將結(jié)合Modelsim,以可視化的方式繼續(xù)探討Testbench,深入了解仿真的意義。
評論
查看更多