作者:小墨同學(xué) 剛剛做完了高頻實(shí)驗,說(shuō)實(shí)話(huà)真是做的一頭霧水。還是那種感覺(jué),真是沒(méi)什么用,所有人拿著(zhù)早已經(jīng)復制好的電路圖,打開(kāi)軟件運行一下,再跟助教說(shuō)一聲做完了,隨便打個(gè)分就可以走人,而且還要寫(xiě)一些無(wú)聊的實(shí)驗報告。算了,不吐槽了,我們來(lái)說(shuō)說(shuō)今天的教學(xué)內容吧。 上一篇文章我介紹了一下一片簡(jiǎn)易CPU的設計,今天的課程我講仿真,也即前仿真。這次課程,小墨同學(xué)將和大家從建立工程開(kāi)始,一步步梳理testbench的書(shū)寫(xiě)過(guò)程,幫助大家對仿真有一個(gè)深刻的概念。以后在做項目時(shí),不要動(dòng)不動(dòng)就把程序下到板子里調試,看問(wèn)題不對再去改程序,再下到板子里調試,如此往返,會(huì )浪費大量的時(shí)間,簡(jiǎn)單的項目還好,但是到了大型項目的話(huà),是不可能有這么多時(shí)間讓我們這樣調的。因此,小墨同學(xué)在這里說(shuō),testbench很重要,做好了仿真,可以為我們節約大量的開(kāi)發(fā)時(shí)間。 下面我們開(kāi)始吧~ 一、什么是testbench? 從字面意思上來(lái)理解,testbench就是一個(gè)測試平臺,我們之前已經(jīng)設計好了我們需要的cpu模塊,我們怎么知道我們設計的對于不對呢?我們可以給其施加一個(gè)測試激勵,例如,給他送時(shí)鐘和復位信號,由于時(shí)鐘和復位信號是我們自定義的,因此我們可以產(chǎn)生任意頻率的時(shí)鐘信號和在任意時(shí)間給系統復位。 當然我們還可以觀(guān)察我們cpu的輸出,將我們想要觀(guān)察的輸出信號引出來(lái)甚至是反饋到cpu內部,都可以,testbench沒(méi)有像RTL代碼設計那樣嚴謹,我們可以在符合語(yǔ)法規則的前提下,隨意編寫(xiě)我們的測試文件,有些在RTL代碼中不可綜合的語(yǔ)句,我們可以在testbench中實(shí)現。 ![]() 二、testbench的結構 小墨同學(xué)認為testbench的結構可以分為這幾個(gè)方面: 1.要先對接口進(jìn)行例化,即模塊之間的鏈接關(guān)系 2.對我們的設計添加激勵 3.觀(guān)察設計輸出是否符合要求 三、測試模塊設計 要測試我們的cpu需要ROM和RAM模塊,這就需要我們先做好這兩個(gè)模塊 ![]() 這里定義了一個(gè) 1024 x 8 的RAM ![]() 再定義一個(gè)8192 x 8 的ROM ROM和RAM都還沒(méi)有裝入數據,等會(huì )我們會(huì )調用函數給他們裝數據 接下來(lái)是地址譯碼器,來(lái)控制ROM和RAM的打開(kāi)與關(guān)閉 ![]() 各模塊建立好之后我們就開(kāi)始仿真了 四、仿真 這次教學(xué)我們用的是modelsim SE 10.0 版本進(jìn)行教學(xué),以下是小墨同學(xué)習慣的仿真過(guò)程,因個(gè)人習慣不同,各位朋友可以按照你們 的方法來(lái)做 我習慣直接先在quartus II中建一個(gè).v文件將其保存在原來(lái)的工程文件目錄中,并命名為cpu_top.v,直接在這里寫(xiě)測試代碼 ![]() 下面大家可以跟著(zhù)小墨的步驟一起做,來(lái)完成cpu 的仿真過(guò)程了 1. 首先,我們需要將我們剛寫(xiě)好的那幾個(gè)模塊包含進(jìn)去,即CPU模塊,ROM模塊,RAM模塊,地址譯碼器模塊,并寫(xiě)好時(shí)間測量度,見(jiàn)下圖 ![]() 2.定義頂層模塊 由于我們的設計只有兩個(gè)輸入,即時(shí)鐘模塊和復位模塊,凡是輸入信號在testbench中通一定義成reg型變量,凡是輸出或者雙向輸入輸出信號通一定義成wire型變量,我們的設計只有輸入沒(méi)有輸出,故只定義輸入和連線(xiàn)即可 ![]() 下圖便是我們要組成的測試頂層模塊圖,我們定義的wire型變量,實(shí)際就是我們頂層模塊中,模塊模塊與模塊間的連線(xiàn)。而這些連線(xiàn)就是我們cpu的輸出,這樣我們就可以用我們的測試模塊來(lái)測試我們的cpu是否能正確工作 ![]() 3. 元件例化 就是將各個(gè)模塊連接起來(lái)即可,這里就不做太多的說(shuō)明了,因為以前都寫(xiě)過(guò)很多次了 ![]() 4.測試激勵的書(shū)寫(xiě) 小墨同學(xué)習慣上上來(lái)先寫(xiě)好時(shí)鐘產(chǎn)生模塊和復位模塊.并將復位模塊用task任務(wù)封裝,這樣我們在測試過(guò)程中就可以隨時(shí)調用復位任務(wù)進(jìn)行復位 時(shí)鐘為50Mhz,復位時(shí)間為20ns ![]() 然后,我們再用task封裝我們需要的模塊,我們來(lái)想一下,上電后,CPU會(huì )從ROM中讀兩個(gè)時(shí)鐘周期的數據是吧,但是我們的ROM現在還是空的,所以我們需要一個(gè)任務(wù)是往ROM中裝入程序,給ROM中裝數據我們可以用系統函數$readmemb,即打開(kāi)一個(gè)文件,并將其中的數據送到我們之前定義的ROM中去 ![]() 而test1.pro文件時(shí)需要我們自己定義的,我們可以在quartusII中再新建一個(gè).v文件,在里面寫(xiě)上我們自己定義的程序,并將其保存為.pro文件即可,至于寫(xiě)什么程序,是我們隨便定義的,大家可以參考我之前在上一篇文章中上傳的程序中,有一個(gè)test1.pro文件,打開(kāi)之后可以看到是一些16位的數字碼,這些碼就是我們ROM的地址,從第一行開(kāi)始,每8位數據位一個(gè)地址,注意我們每個(gè)地址的高三位是用下劃線(xiàn)隔開(kāi)的,這表明前三位是指令碼,這三位會(huì )被狀態(tài)機進(jìn)行譯碼,控制CPU執行相應的操作 ![]() 裝完ROM和RAM的數據之后,按說(shuō)就可以了進(jìn)行波形仿真了,因為cpu是自動(dòng)讀取數據的,下面我們先來(lái)做第一步仿真,我先把之后的代碼注釋掉,大家先看沒(méi)有被注釋掉的代碼 ![]() 里面都是我們之前封裝好的函數,剛開(kāi)始進(jìn)行復位,然后進(jìn)行第一步測試,之后停止 將其保存之后,小墨同學(xué)習慣將cpu_top.v文件用modelsim打開(kāi),并默認為用其打開(kāi),打開(kāi)后見(jiàn)下圖 ![]() 然后,file——new——library——ok即建好一個(gè)庫 ![]() 點(diǎn)擊左上角的編譯按鈕,將我們之前寫(xiě)好的所有.v文件全部都編譯進(jìn)去 ![]() 看到transcript一欄顯示編譯成功后即可,若沒(méi)有transcript一欄,可以選擇菜單中的view——transcript即可,若顯示有紅色錯誤,那就請讀者按照它的要求進(jìn)行修改代碼,這說(shuō)明你的代碼有問(wèn)題,一般是連接問(wèn)題 ![]() 編譯成功后,雙擊cpu_top就可以開(kāi)始波形仿真了 ![]() 進(jìn)入仿真頁(yè)面后,我們右擊cpu模塊將其加入至波形 ![]() 由于只能上傳20張照片,請大家看下一篇文章,小墨同學(xué)會(huì )給大家繼續講解 以后小墨同學(xué)的文章將北京至芯科技官方技術(shù)論壇更新,至芯科技的官方技術(shù)論壇也有很多的資料供大家下載,里面也有小墨的專(zhuān)題板塊,希望廣大網(wǎng)友和愛(ài)好者的大力支持~ http://www.fpgaw.com/ 小墨同學(xué)專(zhuān)版網(wǎng)址 http://www.fpgaw.com/thread-78527-1-1.html 下面是至芯科技官方網(wǎng)站,夏宇聞教授和那里的老師都超好的~有意愿接受FPGA培訓的可以找工作人員咨詢(xún) http://www.zxopen.com/ 以后小墨同學(xué)的教程會(huì )跟這款開(kāi)發(fā)板配套,想跟小墨同學(xué)一起學(xué)習,一起進(jìn)步的的可以考慮一下購買(mǎi)一塊開(kāi)發(fā)板,畢竟學(xué)習要舍得投資嘛,下面是開(kāi)發(fā)板淘寶鏈接 http://item.taobao.com/item.htm? ... ;abbucket=13#detail |