1. 程式人生 > >搭建Modelsim SE仿真環境-使用do文件仿真

搭建Modelsim SE仿真環境-使用do文件仿真

cal 簡單的 inf ram 轉載 參考 通過 更多 wave

摘要: 本章我們介紹仿真環境搭建是基於ModelsimSE的。Modelsim有很多版本,比如說Modelsim-Altera,但是筆者還是建議大家使用Modelsim-SE,Modelsim-Altera實際是針對Altera 的OEM版本,它事先將Altera的一些IP核仿真庫添加到了工具中,但功能上有一些縮減。而Modelsim-SE需要自己手動添加這些仿真庫,但是功能更全,而且工作中,工程師更傾向

本章我們介紹仿真環境搭建是基於Modelsim SE的。Modelsim有很多版本,比如說Modelsim-Altera,但是筆者還是建議大家使用Modelsim-SE,Modelsim-Altera實際是針對Altera 的OEM版本,它事先將Altera的一些IP核仿真庫添加到了工具中,但功能上有一些縮減。而Modelsim-SE需要自己手動添加這些仿真庫,但是功能更全,而且工作中,工程師更傾向用SE版本,因為今後的FPGA開發中我們會接觸更多其他廠商的FPGA,比如Xilinx、Lattice的,遇到這些FPGA時,我們同樣需要將他們的IP核的仿真庫添加到Modelsim 中。

1.1.1.仿真基本概念

FPGA的仿真實際就是一個驗證設計的過程,驗證在“模擬的輸入”的情況下,設計文件的輸出是否和我們期望是一致的。這裏的“模擬的輸入”就是“測試激勵”,設計文件就是待測設計,最終通過對輸出結果的分析來驗證設計的正確性。這就構成了仿真的三個基本組成部分:測試激勵(Test_bench)、待測設計(DUT)和最終結果的輸出驗證。

技術分享圖片

上面介紹可能還是有些抽象,我們通過一個簡單的仿真例子來介紹仿真中的各個部分。大家打開我們的例程《05_clk_div_even》。

待測設計(DUT):首先看src文件夾下的clk_div_even.v就是我們待測設計(DUT)。這個比較好理解,就是我們設計的模塊。這是一個偶數分頻的例子,每次計數從0-4,計數5次,計數器clk_div_cnt會清零一次,同時輸出分頻信號o_clk_div翻轉一次,這樣每五個時鐘周期,輸出信號都會翻轉一次,十個時鐘周期後又恢復到初始狀態,使得輸出信號10分頻。這裏大家需要額外關註一下這個模塊的輸入和輸出,輸入將來是我們激勵信號進來的地方。

1. module clk_div_even

2. (

3. input i_clk , //模塊輸入時鐘 ,50mhz

4. input i_rst_n , //復位信號,低電平有效

5. outputreg o_clk_div //偶數分頻輸出

6. );

7.

8. parameter DIV_EVEN =10 ; //10分頻,輸入50MHz,輸出頻率為5Mhz

9. reg [3:0]clk_div_cnt ; //分頻計數器

10.//-------------------------------------------------------------------

11.// 分頻計數器,每次計數到N-1時歸零

12.//-------------------------------------------------------------------

13. always @ (posedge i_clk ornegedge i_rst_n)

14. begin

15. if(!i_rst_n)

16. clk_div_cnt <=4‘d0;

17. else if(clk_div_cnt ==DIV_EVEN/2-1)

18. clk_div_cnt <=4‘d0;

19. else

20. clk_div_cnt <=clk_div_cnt + 4‘d1;

21. end

22.//-------------------------------------------------------------------

23.// 分頻計數器,每次計數N/2-1時,輸出分頻信號翻轉

24.//-------------------------------------------------------------------

25. always @ (posedge i_clk ornegedge i_rst_n)

26. begin

27. if(!i_rst_n)

28. o_clk_div <=1‘b0;

29. else if(clk_div_cnt ==DIV_EVEN/2-1)

30. o_clk_div <=~o_clk_div;

31. end

32.endmodule

測試激勵(Testbench):Testbench是FPGA仿真的關鍵,Testbench可以理解為一個激勵產生器。大家可以看到我們的待測設計的輸入是i_clk和i_rst_n,實際在開發板上,板子上的晶振輸出50MHz激勵時鐘信號給FPGA,同樣電路中的復位電路給FPGA提供了i_rst_n的激勵信號。在仿真過程中,Testbench就代替了實際的電路,通過Verilog模擬實現這些外部電路的激勵信號,提供給DUT,從而通過輸出驗證設計。工程目錄的sim文件夾下的tb_clk_div_even.v 就是我們已經編寫好的Testbench。如下就是一個基本Testbench的設計。

技術分享圖片

下面從上圖所示5個部分介紹Testbench基本寫法。

1、`timescale 1ns/1ps 決定整個仿真中的時間單位信息,在文件中任何關於時間的信息都是基於此的,1ns表示仿真中的基本時間單位,1ps則表示仿真精度可以達到1ps。例如 #10.005表示的就是延時10.005ns。實際仿真中,精度是可以控制到0.005ns的,即5ps。

2、tb_clk_div_even() 是實際testbench的名稱,同樣用module定義,但是註意testbenc是沒有端口描述的,這與我們待測文件DUT是不一樣的。

3、激勵信號和輸出信號的定義,細心的同學應該可以看出,激勵信號就是我們DUT文件的輸入,輸出信號也就是我們DUT文件的輸出。不同的是在Testbench中,我們將激勵信號定義為reg類型,輸出信號定義為了wire類型。

4、第四部分就是產生激勵信號,具體詳細實現我們就不介紹了,大家可以閱讀我們的文檔《Testbench常用語法及技巧》,閱讀之後這個地方就很容易理解了。

5、最後一部分是待測設計的實例化,在FPGA設計中,模塊的實例化就類似C語言中的函數調用,我們在其他模塊中調用當前模塊時,就需要以實例化的方式來實現。不同的是,Verilog文件模塊實例化時,我們需要標明每一個端口信號。在我們設計的Testbench中,通過模塊實例化,將我們的激勵信號最終傳遞給了待測設計文件。

輸出驗證:下圖是我們仿真的最終輸出的波形文件,可以看出輸出信號o_clk_div是輸入信號i_clk的10分頻。

技術分享圖片

最後我們總結整個仿真過程中,各個部分之間的關系,如下圖。

1.1.2. 建立Modelsim仿真工程

本節我們介紹如何建立Modelsim仿真工程,了解Modelsim仿真工具的使用。

第一步:打開Modelsim SE,點擊菜單欄“File—>New—>Project”,準備新建工程。

技術分享圖片

第二步:彈出“Create Project”對話框,按下圖填寫仿真工程名稱,以及工程的存儲路徑,以及默認庫的的名稱,這裏默認庫名為“work”,我們通常叫作工作庫。設置好後點擊OK。

技術分享圖片

這裏介紹一下庫的概念,即library。庫是Modelsim仿真的載體,Modelsim會將仿真工程中的設計文件(DUT)和激勵文件(Testbench)的編譯(Compile)結果存放在work庫中,在我們新建工程的時候就會帶著生成一個work庫,如下圖在Modelsim工作區,選擇Library選項卡,我們可以看到生成的work庫,此時work庫是空的,因為我們還沒有添加並仿真設計文件和激勵文件。

技術分享圖片

第三步:新建或添加設計文件,這裏我們已經寫好的testbench和待測模塊,所以選擇直接添加已存在文件即可。

第四步:依次添加testbench和待測模塊文件。

第五步:編譯我們的DUT和Testbench文件,如下圖在工作區域選擇Project選項卡,右鍵選擇Compile—>Compile All,編譯所有。

第六步:切回到Library,此時再看work庫就不是空的了,work庫裏的clk_div_even和tb_clk_div_even分別是tb_clk_div_even.v(Testbench)和clk_div_even.v(DUT)的編譯結果。選中Testbench仿真結果tb_clk_div_even,右鍵—>Simulate without Optimization,啟動無優化仿真。

第七步:彈出仿真波形窗口(wave窗口),但是窗口內沒有任何信號波形,工作區域多了一個sim選項卡,進入sim選項頁,可以看到仿真實例clk_div_even和tb_clk_div_even。選擇相應的實例,右鍵—>add wave,添加信號到wave窗口。

技術分享圖片

第八步:切到wave 窗口,如下圖,設置仿真運行時間為100us,這個時間根據具體設計所需時間來決定,再點擊旁邊的技術分享圖片,運行仿真。這樣我們就可以看到輸出的波形信號了,從而驗證設計的正確性。

技術分享圖片

1.1.3. 使用do文件進行Modelsim仿真

上一節我們介紹了通過Modelsim建立仿真工程的方法,但是這種方法我們需要使用界面操作,這樣會很費時很麻煩。這裏我們介紹一種快捷的方法,通過do文件快速搭建仿真環境,只需要雙擊批處理文件modelsim_run.bat,就可以自動調用Modelsim,並自動完成對Testbench和待驗證設計文件的編譯和仿真,並且可以自動將要觀察的信號添加到wave窗口。

首先打開“02_Project_Examples\05_clk_div_even\sim”文件夾,可以看到如下文件。

技術分享圖片

我們主要介紹一下前兩個文件,最後一個是我們的testbench:

modelsim_run.bat文件:這是一個批處理文件,裏面就一行“modelsim -do sim.do”,這是一條DOS命令,意思就是調用Modelsim工具,並在Modelsim工具中執行sim.do這個文件。

sim.do:do文件是由tcl腳本語言編寫的,這個參考例程中的do文件是最基本的tcl腳本語言。下面介紹一下關鍵腳本語言的用法。以下是do文件的內容。

1. vlib work

2. vlog ../sim/*.v

3. vlog ../src/*.v

4. vsim-t ns -novopt +notimingchecks work.tb_clk_div_even

5. radix hex

6. addwave -position insertpoint sim:/tb_clk_div_even/clk_div_even_inst/*

7. run -all

vlib work:建立work庫,相當於在上一節中新建工程時所生成的work庫,後期我們編譯的結果信息存放到work庫中。

vlog ../sim/*.v:vlog相當於modelsim工具中的compile,“../sim/*.v ”表示編譯05_clk_div_even\sim路徑下所有的verilog文件。vlog ../src/*.v表示編譯05_clk_div_even /src/路徑下的所有verilog文件。

vsim -t ns -novopt +notimingchecks work.tb_clk_div_even:編譯完成所有verilog文件後,就要啟動仿真了,vsim就是啟動仿真功能,vsim後面有許多關鍵詞,這裏簡單說明一下,-t表示仿真時間單位為ns,-novopt表示仿真時無優化,+notimingchecks表示無時序檢查,work.tb_clk_div_even表示對work庫中的tb_clk_div_even進行仿真,實際相當於在界面操作時,展開work庫,右鍵—>Simulate without Optimization,啟動仿真。

radix hex :表示要添加wave窗口的信號,以16進制的顯示。

add wave–position insertpoint sim:/tb_clk_div_even/clk_div_even_inst/*:表示將clk_div_even_inst中的所有信號添加到wave窗口中去,執行這句以後,我們每次仿真時,就不用每次都手動去添加仿真波形了。但是這句話實際是Modelsim生成的,不需要我們自己編寫。最開始我們寫的do文件是不包含這條語句的,當我們運行到如下圖狀態時,選擇要添加的信號,右鍵—>add wave後,下面的腳本窗口會彈出相應操作的tcl腳本語句。這樣我們把這條語句賦值到我們的do文件中即可。第二次再調用sim.do文件時,就不用再手動添加波形了。

技術分享圖片

run –all : 運行全過程。當然也可以運行一段時間。run 10us 表示運行10us。

掌握這些最基本的tcl腳本,使用do文件仿真會為我們節省很多時間。後續的教程裏我們都會默認以這種方式進行仿真。當然這裏只是介紹了最基本的仿真腳本語言,今後我們仿真時可能還會有第三方的IP核文件,如altera的PLL、FIFO、RAM等需要添加到仿真用例中,這些我們後面在介紹IP核使用時會給大家介紹如何利用do文件仿真含有IP核的設計。

現在我們可以體驗一下do文件仿真所用的時間,雙擊“modelsim_run.bat”,即可運行仿真。

搭建Modelsim SE仿真環境-使用do文件仿真

轉載:http://www.it610.com/article/5104421.htm

搭建Modelsim SE仿真環境-使用do文件仿真