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