簡單得modelsim命令行仿真
PART ONE
ModelSim之命令行仿真入門
用do文件進行仿真真得很方便,比寫testbench方便多了,采用do文件沒有那么多信號定義,管理也比較方便.
1.運行仿真,在主窗口輸入命令:vsim work.實體名
2.為時鍾信號添加驅動,輸入命令:force clk 0 0,1 10 -r 20,將仿真時鍾設為50MHz;(設時間單位為ns)
3.打開波形窗口,輸入命令:view wave
4.為波形窗口添加信號,輸入命令:add wave -hex *,這里的*表示添加設計中所有的信號,-hex表示以十六進制來表示波
形窗口中的信號值;
5.開始仿真,輸入命令,run 3us,這時候在波形窗口中出現仿真波形
6.退出仿真,輸入命令:quit –sim //很常用!!
7.查看錯誤詳細信息: verror **(錯誤數字代號)
--vlib - 建立一個新的工作庫。
如:vlib work
在當前目錄建立邏輯庫work,運行后會在當前目錄下找到work文件夾。
--vmap - 映射邏輯庫名到指定的目錄
--vsim - 啟動仿真
如:vsim -c -l vsim.log -do ./YourDo.do -L ./work work.foo
開始仿真,-c 選項讓vsim工作在commandline模式;-l 選項是輸出log文件到vsim.log; -do 選項是開始仿真后運行tcl腳本文件;-L 選項是指定工作邏輯庫;work.foo是仿真的top level module。
PART TWO
ModelSim仿真常用命令以及仿真腳本的編寫
在我們用ModelSim仿真的時候經常是修改一點一點修改代碼,這樣會造成一個無奈的操作循環:修改代碼--->編譯代碼--->仿真設置--->進入仿真頁面--->添加需要觀察的波形--->運行仿真。如果仿真結果不理想,還得需要重新修改代碼,重復上述的操作。
計算機擅長做重復的事情,為什么不讓計算機代勞呢?
我們可以參照Xilinx ISE是如何調用ModelSim進行仿真的,尤其是腳本的編寫。
下面一個腳本是我用ISE10.1建立了一個AES256的工程,然后在調用ModelSim6.5的時候,ISE會生成這幾個腳本文件,AES256_tb.fdo, AES256_tb_wave.fdo 和 AES256_tb.udo。
下面的代碼是AES256_tb.fdo文件的內容。
1: vlib work #創建名字是work的庫,這個仿真之前必須做的 2: vcom -explicit -93 "SBOX_ROM.vhd" #編譯vhd代碼 3: vcom -explicit -93 "Inv_SBOX_ROM.vhd" 4: vcom -explicit -93 "AES_package.vhd" 5: vcom -explicit -93 "subbytes.vhd" 6: vcom -explicit -93 "SBOX_ROM_reg.vhd" 7: vcom -explicit -93 "round_key_BRAM.vhd" 8: vcom -explicit -93 "Inv_subbytes.vhd" 9: vcom -explicit -93 "Keyexpansion_Yao.vhd" 10: vcom -explicit -93 "AES256_ENC_DEC.vhd" 11: vcom -explicit -93 "AES256_TOP.vhd" 12: vcom -explicit -93 "AES256_tb.vhd" 13: vsim -t 1ps -lib work AES256_tb #進入仿真設置,時間單位為1ps,庫指定為work,AES256_tb就是指你的top層設計的名字 14: do {AES256_tb_wave.fdo} #執行*.fdo文件,用來添加信號和變量或者內部的寄存器到波形(WAVE)窗口 15: view wave #打開波形窗口 16: view structure #打開架構(structure)窗口 17: view signals #打開信號列表窗口 18: run 1000ns #運行1000ns 19: do {AES256_tb.udo} #運行用戶定義的腳本
只要編譯的時候沒有出現語法錯誤或者是找不到定義的庫文件等錯誤提示,一般會很容易的看到仿真的波形,而不用手動進行操作。這樣方便了仿真的整個過程,而無需用很多鼠標點擊操作。
現在通過一個具體的實例來說明如何運用腳本來實現ModelSim的仿真。
工具版本:ISE10.1 ,ModelSim 6.5a
步驟:
1. 創建ISE工程
首先通過ISE創建test.vhd 和test_tb.vhd文件並添加到工程中,這里不細說如何創建HDL源代碼。
然后配置ISE的仿真器,右鍵選中FPGA芯片,點擊properties,然后在Simulator選擇Modelsim-SE VHDL。
圖1. 工程屬性
在source窗口選擇“Behavioral Simulation”,可以看到工程中的test_tb.vhd(testbench文件)。
選中test_tb.vhd文件,在Process窗口中雙擊Simulate Behavioral Model,ISE開始調用ModelSim,
這是ISE自動生成了三個腳本文件:test_tb.fdo, test_tb_wave.fdo和test_tb.udo。
圖2. Behavioral Simulation 窗口
看看三個腳本文件的內容吧。
test_tb.fdo內容如下:
1: vlib work #添加library 2: vcom -explicit -93 "test.vhd" #編譯test的頂層文件 3: vcom -explicit -93 "test_tb.vhd" #編譯test_tb的testbench文件 4: vsim -t 1ps -lib work test_tb #進入仿真,時間單位1ps,仿真test_tb 5: do {test_tb_wave.fdo} #執行*.fdo腳本文件,用於添加仿真波形 6: view wave #打開波形窗口 7: view structure #打開structure窗口 8: view signals #打開信號窗口 9: run 1000ns #仿真運行1000ns 10: do {test_tb.udo} #執行*.udo腳本文件,用於執行用戶定義的腳本命令
test_tb_wave.fdo內容如下():
1: ## Project Navigator simulation template: test_tb_wave.fdo 2: ## You may edit this file to control your simulation. 3: add wave * ##添加Top層所有的端口信號
test_tb.ufo內容為空白,是留着給用戶自己添加。
對我們來說最有用的就是test_tb.fdo文件了,只要稍微修改就可以成為一個針對這個工程的很好的用於仿真的腳本。
當然我們可以自己手動來編寫類似的腳本,用ISE自動生成主要是為了圖個省事。
2.調用ModelSim進行仿真
在圖2中,Process窗口中雙擊Simulate Behavioral Model,進入ModelSim仿真環境。請仔細觀察ModelSim Transcript窗口中消息的輸出。內容如下:
1: # do {test_tb.fdo} #<-------執行腳本文件 2: # ** Warning: (vlib-34) Library already exists at "work". 3: # Model Technology ModelSim SE vcom 6.5 Compiler 2009.01 Jan 22 2009 #<-----編譯test.vhd得到的message 4: # -- Loading package standard 5: # -- Loading package std_logic_1164 6: # -- Loading package std_logic_arith 7: # -- Loading package std_logic_unsigned 8: # -- Compiling entity test 9: # -- Compiling architecture test of test 10: # Model Technology ModelSim SE vcom 6.5 Compiler 2009.01 Jan 22 2009 #<-----編譯test.vhd得到的message 11: # -- Loading package standard 12: # -- Loading package std_logic_1164 13: # -- Loading package std_logic_arith 14: # -- Loading package std_logic_unsigned 15: # -- Compiling entity test_tb 16: # -- Compiling architecture behavior of test_tb 17: # vsim -lib work -t 1ps test_tb #仿真設置命令行 18: # Loading std.standard 19: # Loading ieee.std_logic_1164(body) 20: # Loading ieee.std_logic_arith(body) 21: # Loading ieee.std_logic_unsigned(body) 22: # Loading work.test_tb(behavior)#1 #加載test_tb 23: # .main_pane.wave.interior.cs.body.pw.wf #打開wave窗口 24: # .main_pane.structure.interior.cs.body.struct #列出structure 25: # .main_pane.objects.interior.cs.body
注:在test_tb.fdo的每一行都可以在ModelSim Transcript窗口中分開一行一行執行。
然后可以觀察到仿真波形文件。
圖3.仿真波形
3. 調試代碼
或許仿真出來的結果不是我們想要的,必須的修改代碼,然后再仿真。那我們應該怎么辦呢?
在trasncript窗口輸入:
1: quit -sim #退出仿真 2: do test_tb.fdo #修改代碼完成后重新執行該腳本進行仿真
在仿真的波形的時候,我們不僅僅希望看到Top層設計的端口信號的波形,還希望能觀察到內部信號是如何變化的,所以我們在Sim窗口中找到內部的信號放到wave中進行觀察。但是如果我們重新運行當初test_tb.fdo文件,我們又再一次只能看到Top層設計的端口信號的波形,而內部信號的波形已經被刪除。那我們應該如何保存和運用我們仿真波形文件呢?
我現在需要觀察內部的一個寄存器輸出:tmp信號,見圖4。Ctrl+S,保存波形文件。默認保存為工程目錄下/wave.do,但是我們將用波形文件保存為test_tb_wave.fdo文件,這樣做的好處可以不用修改test_tb.fdo文件。
圖4.內部信號觀察
我們重新運行test_tb.fdo腳本文件之后,輸出的波形是圖4,而不是圖3。
差不多常用的VHDL仿真命令都用上了,我相信這樣做肯定會提高仿真的效率。如果想要熟悉更多的ModelSim的仿真命令,請查看ModelSim的用書手冊。