作者:zhuwei0710 Testbench,就是測試平臺的意思,具體概念就多不介紹了,相信略懂FPGA的人都知道,編寫(xiě)Testbench的主要目的是為了對使用硬件描述語(yǔ)言(HDL)設計的電路進(jìn)行仿真驗證,測試設計電路的功能、部分性能是否與預期的目標相符。初學(xué)者往往把寫(xiě)RTL代碼當成重點(diǎn),不愿寫(xiě)Testbench,包括小朱同學(xué)也是,僅僅使用Quartus II自帶的仿真產(chǎn)生幾個(gè)激勵,然后觀(guān)察一下最后輸出的波形就完事了,甚至某些時(shí)候直接忽視仿真,拿單片機在線(xiàn)調試那一套來(lái)對付FPGA,直接把代碼下載到板子里看效果,若與預期不符,再修改代碼,再次下載到板子,如此反復,直到某一天實(shí)在玩不下去了。 同志們,FPGA真不帶這么玩的!趕緊禁止自己使用Quartus II自帶的仿真,甭畫(huà)波形圖了,你畫(huà)成大師也沒(méi)用(也成不了大師,Quartus II只能做極初級的仿真)!如果你立志從事FPGA行業(yè),那么會(huì )寫(xiě)Testbench才你的敲門(mén)磚,而且別想著(zhù)去公司寫(xiě)RTL代碼了,向毛主席保證,公司一定是讓你來(lái)寫(xiě)Testbench的。再趕緊把你的FPGA開(kāi)發(fā)板有多遠扔多遠(別丟,還是要用的),FPGA不是單片機,學(xué)習FPGA并不那么需要開(kāi)發(fā)板。打個(gè)比方,學(xué)習FPGA是兩萬(wàn)五千里長(cháng)征,那么使用開(kāi)發(fā)板連三千里都占不到,遠遠不到。對于FPGA,仿真驗證才是核心,這么講吧,驗證占到整個(gè)設計工作的70%,前仿真、后仿真、功能仿真、時(shí)序仿真、行為級仿真、RTL級仿真、綜合后仿真、門(mén)級仿真、布局布線(xiàn)后仿真……好吧,別暈,本篇只講Testbench,Modelsim仿真咱們下篇再討論。 一個(gè)最基本的Testbench包含三個(gè)部分,信號定義、模塊接口和功能代碼。借用一下特權同學(xué)總結的編寫(xiě)Testbench的三個(gè)基本步驟: 1、對被測試設計的頂層接口進(jìn)行例化; 2、給被測試設計的輸入接口添加激勵; 3、判斷被測試設計的輸出相應是否滿(mǎn)足設計要求。 逐步解決編寫(xiě)Testbench的這三點(diǎn): 首先“對被測試設計的頂層接口進(jìn)行例化”,這一步相對比較簡(jiǎn)單,例化就是,但端口多時(shí)也夠喝一壺的,而且要分wire、reg,有時(shí)會(huì )弄錯,別難過(guò),其實(shí)可以偷個(gè)懶,通過(guò)Quartus II自動(dòng)生成一個(gè)Testbench的模板,選擇Processing -> Start -> Start Test Bench Template Writer,等待完成后打開(kāi)剛才生成的Testbench,默認是保存在simulation\Modelsim文件夾下的.vt格式文件。這一步就不多講了,偷懶就挺好。 其次“給被測試設計的輸入接口添加激勵”,一般時(shí)序設計必然涉及到最基本的兩個(gè)信號——clk、rst_n(時(shí)鐘、復位),肯定有童鞋會(huì )講可以沒(méi)有rst_n,是可以沒(méi)有,但何必呢,讓代碼更健壯一點(diǎn)不很好嘛,別鉆牛角尖。下面攻克clk、rst_n的寫(xiě)法: 首先先講一下timescale,因為想要進(jìn)行仿真首先要規定時(shí)間單位,而且最好在Testbench里面統一規定時(shí)間單位,而不要在工程代碼里定義,因為不同的模塊如果時(shí)間單位不同可能會(huì )為仿真帶來(lái)一些問(wèn)題,而timescale本身對綜合也就是實(shí)際電路沒(méi)有影響。 `timescale 1ns/ 1ps表示仿真的單位時(shí)間為1ns,精度為1ps。 clk大體上有三種寫(xiě)法 : ![]() 上述三種代碼的目的就是產(chǎn)生系統時(shí)鐘,給clk一個(gè)初值后,不斷重復執行:每10ns翻轉一次clk,從而生成一個(gè)周期為20ns,頻率50MHz的方波信號。第一、二種基本類(lèi)似,第三種比較簡(jiǎn)單,少了一個(gè)initial,放在了always里初始化。 三種方法都無(wú)一例外地給clk賦了初值,因為信號的缺省值為Z,如果不賦初值,則反相后還是Z,時(shí)鐘就一直處于高阻Z狀態(tài)。小朱同學(xué)一般選中第一種,看個(gè)人喜歡。 根據復位方式的不同,rst_n一般有兩種寫(xiě)法: ![]() 上述兩種代碼的目的基本都是延時(shí)復位,但一個(gè)異步復位,一個(gè)同步復位,用途不同,小朱同學(xué)一般使用異步復位。 最后“判斷被測試設計的輸出相應是否滿(mǎn)足設計要求”。首先介紹最常用的兩個(gè)系統任務(wù)函數$stop和$finish。$stop代表暫停仿真后返回軟件操作主窗口,將控制權交給user;$finish代表終止仿真后關(guān)閉軟件操作主窗口。其他任務(wù)函數如$monitor、$display 、$time、$fwrite等也比較重要,用到的時(shí)候再一一介紹。為直觀(guān)介紹,使用一個(gè)例程來(lái)描述,下面是加法器的RTL代碼及Testbench: ![]() ![]() 注意了clk、rst_n后,其他端口根據需要相應加測試信號即可,然后把RTL代碼及Testbench添加到Modelsim仿真觀(guān)察輸出波形等,以驗證RTL代碼的正確與否,若與預期相符則驗證結束,反之則修改代碼至與預期相符。 好了,Testbench就寫(xiě)到這里,但沒(méi)有結束,實(shí)踐是檢驗真理的唯一標準,下一篇將結合Modelsim,以可視化的方式繼續探討Testbench,深入了解仿真的意義。 |