Icarus Verilog和GTKwave使用簡析
來源 http://blog.csdn.net/husipeng86/article/details/60469543
本文測試文件在windows10和windows7上測試通過,其它平台請參考官方文檔
下載安裝
由於Icarus Verilog中已經包含了GTKWave所以直接從http://bleyer.org/icarus/下載安裝,這里提供的為Windows版,我下載的為當前時間最新版:iverilog-10.1.1-x64_setup.exe,整個安裝包才9.77MB,安裝后也只有不到50MB。經測試,其實安裝后只要把安裝所在目錄打包復制到其它電腦也可以用,即下載的這個安裝類似一個自解壓文件,但會增加兩個路徑到PATH。所以將安裝目錄打包復制到其它電腦后只要將以下兩個目錄(iverilog和gtkwave可執行文件所在目錄)加入系統PATH環境變量中即可(這里假設放入其它電腦的目錄為E:\iverilog):
E:\iverilog\bin E:\iverilog\gtkwave\bin
或者在運行批處理文件前加入如下代碼即可(即使用前將這兩個路徑臨時加入PATH):
set iverilog_path=d:\iverilog\bin; set gtkwave_path=d:\iverilog\gtkwave\bin; set path=%iverilog_path%%gtkwave_path%%path%
下面給出可能會用到的網址:
- iverilog 官網:http://iverilog.icarus.com/
- iverilog windows版本:http://bleyer.org/icarus/
- iverilog User Guide:http://iverilog.wikia.com/wiki/User_Guide
- iverilog GitHub:https://github.com/steveicarus/iverilog
- GTKWave 官網:http://gtkwave.sourceforge.net/
- GTKWave 手冊:http://gtkwave.sourceforge.net/gtkwave.pdf
基本使用
這里給出一個簡單的hello world例程,先對使用方法有一個大概的了解
iverilog使用
仿真當然首先要提供verilog源代碼,這里簡單的實現了一個打印”hello world!”的例子,由於涉及到GTKWave的使用所以加入了clk和rst_n兩個信號,以便介紹GTKWave的使用
/***** ** 文件名稱:hello_world_tb.v ** 創 建 人:hsp ** 創建日期:2017-03-05 ** 功能描述:一個iverilog和GTKWave使用方式介紹的hello world例子 *****/ // synopsys translate_off `timescale 1 ns / 1 ps // synopsys translate_on module hello_world_tb; parameter PERI = 10; reg clk; reg rst_n; always #(PERI/2) clk = ~clk; initial begin $dumpfile("hello_world_tb.vcd"); $dumpvars(0,hello_world_tb); $display("hello world!"); clk = 0; rst_n = 0; repeat(10) @(posedge clk); rst_n = 1; repeat(100) @(posedge clk); $finish; end endmodule
以上verilog:
- 首先定義了一個參數
PERI
,用於指定clk
輸出周期 - 然后定義了用於觀察的兩個
reg
:clk
和rst_n
- 然后一個
always
給出了時鍾信號clk
的輸出 - 之后一個
initial
- 通過
$dumpfile
指定要保存仿真波形數據需要存儲到的文件,指定保存在當前目錄中hello_world_tb.vcd
文件中(GTKWave還支持LXT,LXT2,VZT,FST和GHW等類型文件) - 通過
$dumpvars
指定要保存仿真波形數據的信號,這里指定為hello_world_tb
模塊(即本模塊)之下及其子模塊中的所有信號,當然這個例子中沒有子模塊,所以仿真數據被存儲的為本模塊中僅有的兩個信號:clk
和rst_n
$display
打印hello world!
- 之后就是對
clk
和rst_n
的賦值操作 - 最后結束仿真,這里要注意最好用
$finish
而不是$stop
,因為若使用$stop
在iverilog仿真完后需要手動停止,而用$finish
則會自動停止
- 通過
注意:以上代碼最好保存為名稱為hello_world_tb.v
的文件,即模塊名和文件名(不包括后綴)相同
之后就是仿真命令的問題,可使用以下批處理使用iverilog執行仿真並最后使用GTKWave打開仿真波形(將以下代碼保存為xxx.bat或.cmd后綴的文件並放入以上verilog相同目錄即可)
@echo off rem 若沒有設置路徑到PATH則關閉以下注釋 rem set iverilog_path=d:\iverilog\bin; rem set gtkwave_path=d:\iverilog\gtkwave\bin; rem set path=%iverilog_path%%gtkwave_path%%path% set testbentch_module=hello_world_tb set testbentch_file="./%testbentch_module%.v" iverilog -o "%testbentch_module%.vvp" %testbentch_file% vvp "%testbentch_module%.vvp" set gtkw_file="%testbentch_module%.gtkw" if exist %gtkw_file% (gtkwave %gtkw_file%) else (gtkwave "%testbentch_module%.vcd")
以上批處理:
- 第一行關閉顯示包括本行,非必須,不要也可以
- 設置iverilog和GTKWave可執行文件路徑到PATH,若沒有加入到PATH才需要,這里直接注釋
- 然后設置兩個變量,后面會使用
testbentch_module
設置為前面verilog模塊名相同testbentch_file
設置為verilog文件名,即模塊名+.v
- 然后使用
iverilog
編譯verilog
-o
指定輸出文件名,這里使用模塊名+.vvp- 之后指定源文件
- 然后使用
vvp
開始仿真,參數為上面iverilog
的輸出文件 - 之后開始仿真數據波形顯示
- 設置了一個變量,為GTKWave保存文件的文件名,這里使用模塊名+.gtkw
- 然后判斷GTKWave保存文件是否存在,若存在則直接使用GTKWave打開該.gtkw文件,否則打開剛仿真生成的.vcd文件(原因請參考下一節)
GTKWave使用
通過上面批處理最后一條中gtkwave
命令即可打開GTKWave軟件,同時打開了對應的.gtkw或.vcd文件;首次運行打開的為.vcd文件,此時可以看到GTKWave軟件界面的Signals和Waves窗口並沒有信號顯示,需要:
- 在左上角的SST窗口選中一個模塊,此時在其下面窗口就可以看到對應模塊的所有信號
- 在顯示信號的窗口選中要查看的信號(ctrl+a全選,ctrl和shift可多選),然后點擊其下面的Append按鈕即可將這些信號顯示到Signals和Waves窗口
- 在Signals窗口選中各信號,然后按
G
可以將信號分組,推薦將不同模塊的信號分為不同的組,這樣方便查看 - 這樣操作后若不保存(類似modelsim也需要保存),下次再次打開.vcd文件仍然為初次打開一樣Signals和Waves窗口都沒有信號,所以此時ctrl+s將其保存,保存文件名推薦為模塊名+.gtkw(配合上面的批處理),這樣下次上面的批處理發現存在.gtkw文件則直接打開這個.gtkw文件,這樣上面添加顯示的信號和分組都存在,而波形數據也為最新的仿真數據
注:查看.gtkw文件可以發現其保存的內容不包括波形數據而只包括.vcd文件路徑和GTKWave的一些設置(如添加的信號和分組等)
iverilog常用選項
直接運行iverilog -help
或iverilog
則會顯示以下幫助信息,顯示了iverilog支持的參數
Usage: iverilog [-ESvV] [-B base] [-c cmdfile|-f cmdfile] [-g1995|-g2001|-g2005|-g2005-sv|-g2009|-g2012] [-g<feature>] [-D macro[=defn]] [-I includedir] [-M [mode=]depfile] [-m module] [-N file] [-o filename] [-p flag=value] [-s topmodule] [-t target] [-T min|typ|max] [-W class] [-y dir] [-Y suf] source_file(s)
下面簡單列舉幾個常用的參數的簡單說明,詳細參數列表請查看http://iverilog.wikia.com/wiki/Iverilog_Flags
選項-g
指定使用verilog的版本,推薦使用最新的-g2012
基本的SystemVerilog語法都支持(不完全支持),方便使用SV仿真。如上幫助信息顯示支持:
- -g1995
- -g2001
- -g2005
- -g2005
- -g2009
- -g2012
還支持:
- verilog-ams
- assertions/no-assertions
- relative-include/no-relative-include
- specify/no-specify
- strict-ca-eval/no-strict-ca-eval
- strict-expr-width/no-scrict-expr-width
- xtypes/no-xtypes
- io-range-error/no-io-range-error
選項-o
指定編譯后輸出文件,若不指定默認為a.out
選項-y
指定庫的目錄,編譯時發現了一個沒有定義的模塊時會到這個參數指定的目錄中查找,此選項在使用Xilinx和Lattice庫時會用到
選項-I
指定verilog中`include
包含文件的搜索目錄,會按-I
出現順序查找
選項-D
傳遞一個宏定義,如-DIS_DEF
同-DIS_DEF=1
,則在verilog中就可以用IS_DEF這個宏定義
選項-t
使用-tvhdl
可將verilog轉換為VHDL,如將上面的例子轉換為VHDL:iverilog -tvhdl -o hello_world_tb.vhd hello_world_tb.v
使用庫
若要仿真使用了各FPGA公司IP的設計則需要支持對應公司的庫,這里簡單介紹使用Xilinx和Lattice公司庫的方法
Xilinx
vivado
本人安裝的為vivado 2015.3,安裝在E盤:E:\Xilinx\Vivado\2015.3
;則在使用iverilog編譯時使用以下命令即可(替換上面例子中iverilog命令那行):
set vivado_dir=E:\Xilinx\Vivado\2015.3\data\verilog\src set vivado_lib="-y%vivado_dir%" "-y%vivado_dir%\retarget" "-y%vivado_dir%\unifast" "-y%vivado_dir%\unimacro" "-y%vivado_dir%\unisims" "-y%vivado_dir%\xeclib" iverilog -g2012 -o "%testbentch_module%.vvp" %vivado_lib% %rtl_file% %testbentch_file% %vivado_dir%/glbl.v
以上命令:
- 設置vivado 2015.3仿真庫目錄
- 並通過
-y
選項列出仿真庫各子目錄:
- retarget
- unifast
- unimacro
- unisims
- xeclib
- 在iverilog命令中增加了
%vivado_dir%/glbl.v
,否則IP編譯出錯
注意:以上iverilog中還增加了一個%rtl_file%
,為要仿真RTL文件,類似%testbentch_file%
的變量需要在之前設置
Lattice
Lattice的庫仿真,編譯較簡單只要指定使用到的芯片的庫即可(不同於Xilinx,Lattice各芯片的仿真庫不同),只是在仿真測試文件中(如上面例子中的hello_world_tb.v文件)模塊中需要例化兩個模塊:
// lattice庫使用testbentch模塊中要加 GSR GSR_INST(.GSR(1'b1)); PUR PUR_INST(.PUR(1'b1));
本機安裝Diamond3.5,安裝目錄在E盤
ECP3
則在使用iverilog編譯時使用以下命令即可(替換上面例子中iverilog命令那行)
set lattice_dir=E:\lscc\diamond\3.5_x64\cae_library\simulation\verilog set ecp3_lib="-y%lattice_dir%\ecp3" "-y%lattice_dir%\pmi" iverilog -g2012 -o "%testbentch_module%.vvp" %ecp3_lib% %rtl_file% %testbentch_file%
以上命令:
- diamond 3.5仿真庫目錄
- 並通過
-y
選項列出ECP3芯片仿真庫子目錄:
- pmi
- ecp3
MachOX2
則在使用iverilog編譯時使用以下命令即可(替換上面例子中iverilog命令那行)
set lattice_dir=E:\lscc\diamond\3.5_x64\cae_library\simulation\verilog set machxo2_lib="-y%lattice_dir%\machxo2" "-y%lattice_dir%\pmi" iverilog -g2012 -o "%testbentch_module%.vvp" %machxo2_lib% %rtl_file% %testbentch_file%
以上命令:
- diamond 3.5仿真庫目錄
- 並通過
-y
選項列出MachOX2芯片仿真庫子目錄:
- pmi(同ECP3)
- machxo2
注意事項
這里列出我在使用中遇到的一些問題或建議
verilog源碼
- 代碼文件名最好為模塊名+.v方式,因為通過
-y
方式指定目錄時查找模塊時iverilog要求模塊名和文件名要相同,否則可能導致無法找到對應模塊(這個要求也是平時寫verilog應該有的好習慣) - testbentch中結束仿真推薦用
$finish
而不用$stop
;因為$finish
可以直接結束仿真並退出,而不需要手動退出,這樣運行類似以上例子批處理后可以直接打開GTKWave窗口
編譯命令
iverilog
命令中通過-y
指定目錄時,需要放在源文件參數之前,否則提示有錯iverilog
命令中通過-D
傳遞宏包含引號的方法:-DIN_FILE="\"xxx.v\""
,這在verilog有`include IN_FILE
時需要使用;而iverilog命令中使用-DIN_FILE="xxx.v"
方式有錯誤- 指定源文件時可以用通配符
*
,如本人用的批處理中通常使用這種方式指定RTL文件:set rtl_file="../rtl/*.v"
其它
- 加大DOS窗口高度。由於運行批處理需要在DOS窗口查看verilog中
$display
的打印,有時iverilog編譯打印的信息較多時會導致部分信息無法查看,所以需要加大DOS窗口的高度:在DOS窗口標題欄右鍵->默認值->布局中設置屏幕緩沖區中高度為較大的值(如1000)即可 - iverilog即使指定為
-g2012
也不支持break、static等(測試得到)