全平臺輕量開源verilog仿真工具iverilog GTKWave使用教程
2. 關(guān)于 Icarus Verilog
Icarus Verilog是一個輕量、免費、開源的Verilog編譯器,基于C 實現(xiàn),開發(fā)者是 Stephen Williams ,遵循 GNU GPL license 許可證,安裝文件中已經(jīng)包含 GTKWave支持Verilog/VHDL文件的編譯和仿真,命令行操作方式,類似gcc編譯器,通過testbench文件可以生成對應的仿真波形數(shù)據(jù)文件,通過自帶的GTKWave可以查看仿真波形圖,支持將Verilog轉(zhuǎn)換為VHDL文件。3. iverilog的安裝
iverilog安裝時,默認會把GTKWave一起安裝,用于查看生成的波形圖。iverilog支持Windows、Linux和MacOS三大主流平臺,截止2019年12月1日,最新版本v11-20190809下載:http://bleyer.org/icarus/iverilog-v11-20190809-x64_setup.exe3.1 Windows下的安裝
Windows下直接雙擊上面下載的安裝文件即可,安裝完成后安裝目錄如下:3.2 Linux下的安裝
Linux下的安裝,以Ubuntu 16.04為例,可以通過apt-get直接安裝。- 安裝iverilog:?
sudo apt-getinstall iverilog
- 安裝GTKWave:?
sudo apt-getinstall gtkwave
3.3 MacOS下的安裝
Mac下的安裝可以通過 macports 或者 homebrew 來安裝,通過 Macports 安裝:- 安裝iverilog:?
sudo ports-d-v install iverilog
- 安裝GTKWave:?
sudo ports-d-v install gtkwave
- 安裝iverilog:?
brew install icarus-verilog
- 安裝GTKWave:?
brew install caskroom/cask/gtkwave
3.4 查看是否安裝成功
安裝成功后,可以通過命令窗口來查看命令所在的路徑。Windows環(huán)境可以通過where命令查看安裝路徑where iverilog
where vvp
where gtkwave
which iverilog
which vvp
which gtkwave
4. 基本參數(shù)介紹
Icarus Verilog編譯器主要包含3個工具:- iverilog:用于編譯verilog和vhdl文件,進行語法檢查,生成可執(zhí)行文件
- vvp:根據(jù)可執(zhí)行文件,生成仿真波形文件
- gtkwave:用于打開仿真波形文件,圖形化顯示波形
iverilog
回車,可以看到常用參數(shù)使用方法的簡單介紹:$ iverilog
D:\iverilog\bin\iverilog.exe: no source files.
Usage: iverilog [-EiSuvV] [-B base] [-c cmdfile|-f cmdfile]
[-g1995|-g2001|-g2005|-g2005-sv|-g2009|-g2012] [-g
] [-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] [-l file] source_file(s)
See the man page for details.
4.1 參數(shù)-o
這是比較常用的一個參數(shù)了,和GCC中-o的使用幾乎一樣,用于指定生成文件的名稱。如果不指定,默認生成文件名為a.out。如:iverilog-o test test.v
4.2 參數(shù)-y
用于指定包含文件夾,如果top.v中調(diào)用了其他的的.v模塊,top.v直接編譯會提示led_demo_tb.v:38: error: Unknownmodule type: led_demo
2 error(s) during elaboration.
*** These modules were missing:
led_demo referenced 1 times.
***
iverilog-y D:/test/demo led_demo_tb.v
如果是同一目錄下:iverilog-y./led_demo_tb.v
,另外,iverilog還支持Xilinx、Altera、Lattice等FPGA廠商的仿真庫,需要在編譯時通過-y參數(shù)指定庫文件的路徑,詳細的使用方法可以查看官方用戶指南:https://iverilog.fandom.com/wiki/User_Guide4.3 參數(shù)-I
如果程序使用`include語句包含了頭文件路徑,可以通過-i參數(shù)指定文件路徑,使用方法和-y參數(shù)一樣。如:iverilog-I D:/test/demo led_demo_tb.v
4.4 參數(shù)-tvhdl
iverilog還支持把verilog文件轉(zhuǎn)換為VHDL文件,如iverilog-tvhdl-o out_file.vhd in_file.v
5. Verilog的編譯仿真實際應用
新建led_demo.v源文件,內(nèi)容如下:module led_demo(
input clk,
input rst_n,
output reg led
);
reg [7:0] cnt;
always @ (posedge clk)
begin
if(!rst_n)
cnt <= 0;
elseif(cnt >= 10)
cnt <= 0;
else
cnt <= cnt 1;
end
always @ (posedge clk)
begin
if(!rst_n)
led <= 0;
elseif(cnt == 10)
led <= !led;
end
endmodule
`timescale 1ns/100ps
module led_demo_tb;
parameter SYSCLK_PERIOD = 10;
reg SYSCLK;
reg NSYSRESET;
initial
begin
SYSCLK = 1'b0;
NSYSRESET = 1'b0;
end
/*iverilog */
initial
begin
$dumpfile("wave.vcd"); //生成的vcd文件名稱
$dumpvars(0, led_demo_tb); //tb模塊名稱
end
/*iverilog */
initial
begin
#(SYSCLK_PERIOD * 10 )
NSYSRESET = 1'b1;
#1000
$stop;
end
always @(SYSCLK)
#(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;
led_demo led_demo_ut0 (
// Inputs
.rst_n(NSYSRESET),
.clk(SYSCLK),
// Outputs
.led( led)
);
endmodule
initial
begin
$dumpfile("wave.vcd"); //生成的vcd文件名稱
$dumpvars(0, led_demo_tb); //tb模塊名稱
end
5.1 編譯
通過iverilog-o wave led_demo_tb.v led_demo.v
命令,對源文件和仿真文件,進行語法規(guī)則檢查和編譯。由于本示例比較簡單,只有1個文件,如果調(diào)用了多個.v的模塊,可以通過前面介紹的-y參數(shù)指定源文件的路徑,否則編譯報錯。如果源文件都在同同一個目錄,可以直接通過 ./
絕對路徑的方式來指定。例如,leddemotb.v中調(diào)用了led_demo.v模塊,就可以直接使用 iverilog-o wave-y./top.v top_tb.v
來進行編譯。如果編譯成功,會在當前目錄下生成名稱為wave的文件。5.2 生成波形文件
使用vvp-n wave-lxt2
命令生成vcd波形文件,運行之后,會在當前目錄下生成.vcd文件。如果沒有生成,需要檢查testbench文件中是否添加了如下幾行:initial
begin
$dumpfile("wave.vcd"); //生成的vcd文件名稱
$dumpvars(0, led_demo_tb); //tb模塊名稱
end
5.3 打開波形文件
使用命令gtkwave wave.vcd
,可以在圖形化界面中查看仿真的波形圖。6. Verilog轉(zhuǎn)換為VHDL
雖然VHDL和Verilog都誕生于20世紀80年代,而且都屬于硬件描述語言(HDL),但是二者的語法特性卻不一樣。Icarus Verilog 還有一個小功能就是支持把使用Verilog語言編寫的.v文件轉(zhuǎn)換為VHDL語言的.vhd文件。如把leddemo.v文件轉(zhuǎn)換為VHDL文件leddemo.vhd,使用命令iverilog-tvhdl-o led_demo.vhd led_demo.v
。生成的VHDL文件內(nèi)容如下:-- This VHDL was converted fromVerilogusing the
-- IcarusVerilog VHDL CodeGenerator11.0(devel) (s20150603-612-ga9388a89)
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
-- GeneratedfromVerilogmodule led_demo (led_demo.v:1)
entity led_demo is
port (
clk : in std_logic;
led : out std_logic;
rst_n : in std_logic
);
end entity;
-- GeneratedfromVerilogmodule led_demo (led_demo.v:1)
architecture from_verilog of led_demo is
signal led_Reg : std_logic;
signal cnt : unsigned(7 downto 0); -- Declared at led_demo.v:8
begin
led <= led_Reg;
-- Generatedfrom always process in led_demo (led_demo.v:10)
process (clk) is
begin
if rising_edge(clk) then
if(not rst_n) = '1'then
cnt <= X"00";
else
ifResize(cnt, 32) >= X"0000000a"then
cnt <= X"00";
else
cnt <= cnt X"01";
endif;
endif;
endif;
end process;
-- Generatedfrom always process in led_demo (led_demo.v:20)
process (clk) is
begin
if rising_edge(clk) then
if(not rst_n) = '1'then
led_Reg <= '0';
else
ifResize(cnt, 32) = X"0000000a"then
led_Reg <= not led_Reg;
endif;
endif;
endif;
end process;
end architecture;
7. VHDL文件的編譯和仿真
如果你還和編譯Verilog一樣,使用iverilog led_dmeo.v
來編譯VHDL文件的話,那么會提示有語法錯誤,這是正常的,因為Verilog和VHDL是不同的語法規(guī)則,不能使用Verilog的標準來檢查VHDL文件的語法。需要添加 -g2012
參數(shù)來對VHDL文件進行編譯,如 iverilog-g2012 led_demo.vhd
,和Verilog一樣,同樣也支持Testbech文件的編譯和仿真,當然需要編寫對應的VHDL Testbench文件。8. 批處理文件一鍵執(zhí)行
通過批處理文件,可以簡化編譯仿真的執(zhí)行過程,直接一鍵執(zhí)行編譯和仿真。新建文本文檔,輸入以下內(nèi)容:echo "開始編譯"
iverilog -o wave led_demo.v led_demo_tb.v
echo "編譯完成"
vvp -n wave -lxt2
echo "生成波形文件"
cp wave.vcd wave.lxt
echo "打開波形文件"
gtkwave wave.lxt
9. 總結(jié)
從20040706版本,到現(xiàn)在的最新版本20190809,作者還在繼續(xù)更新,有興趣的朋友可以研究一下源代碼是如何實現(xiàn)語法規(guī)則檢查的,或者可以嘗試編譯源碼,獲得最新的版本。當然,和FPGA廠商的IDE相比,功能還是非常有限,GTKWave界面也比較簡陋,如不支持寬度測量等,主要是小巧 全平臺支持,可以配合IDE來使用。這個工具還支持主流FPGA廠商的IP核仿真,如Xilinx和Lattice,詳細的使用方法可以參考官方使用指南。10. 參考資料
文章部分內(nèi)容參考自Icarus Verilog官方網(wǎng)站。- iverilog官網(wǎng):http://iverilog.icarus.com/
- iverilog下載:http://bleyer.org/icarus/
- iverilog用戶指南:https://iverilog.fandom.com/wiki/User_Guide
- Github開源地址:https://github.com/steveicarus/iverilog
- GTKWave下載(iverilog已經(jīng)包含):http://gtkwave.sourceforge.net/