全平臺(tái)輕量開(kāi)源verilog仿真工具iverilog+GTKWave使用教程

全平臺(tái)輕量開(kāi)源verilog仿真工具iverilog+GTKWave使用教程

1. 前言

如果你只是想檢查Verilog文件的語(yǔ)法是否有錯(cuò)誤,然后進(jìn)行一些基本的時(shí)序仿真,那么Icarus Verilog 就是一個(gè)不錯(cuò)的選擇。相比于各大FPGA廠商的ide幾個(gè)G的大小,Icarus Verilog 顯得極其小巧,最新版安裝包大小僅有17MB,支持全平臺(tái):windows+linux+Macos,并且源代碼開(kāi)源。本文將介紹如何使用Icarus Verilog來(lái)進(jìn)行verilog文件的編譯和仿真。

2. 關(guān)于 Icarus Verilog

Icarus Verilog是一個(gè)輕量、免費(fèi)、開(kāi)源的Verilog編譯器,基于c++實(shí)現(xiàn),開(kāi)發(fā)者是 Stephen Williams ,遵循 gnu GPL license 許可證,安裝文件中已經(jīng)包含 GTKWave支持Verilog/VHDL文件的編譯和仿真,命令行操作方式,類似gcc編譯器,通過(guò)testbench文件可以生成對(duì)應(yīng)的仿真波形數(shù)據(jù)文件,通過(guò)自帶的GTKWave可以查看仿真波形圖,支持將Verilog轉(zhuǎn)換為VHDL文件。

全平臺(tái)輕量開(kāi)源verilog仿真工具iverilog+GTKWave使用教程

3. iverilog的安裝

iverilog安裝時(shí),默認(rèn)會(huì)把GTKWave一起安裝,用于查看生成的波形圖。

iverilog支持Windows、Linux和macos三大主流平臺(tái),截止2019年12月1日,最新版本v11-20190809下載:

http://bleyer.org/icarus/iverilog-v11-20190809-x64_setup.exe

3.1 Windows下的安裝

Windows下直接雙擊上面下載的安裝文件即可,安裝完成后安裝目錄如下:

全平臺(tái)輕量開(kāi)源verilog仿真工具iverilog+GTKWave使用教程

3.2 Linux下的安裝

Linux下的安裝,以ubuntu 16.04為例,可以通過(guò)apt-get直接安裝。

安裝iverilog: sudo apt-getinstall iverilog安裝GTKWave: sudo apt-getinstall gtkwave

不能成功安裝的,嘗試更換鏡像地址,我使用的是網(wǎng)易的開(kāi)源鏡像地址。

3.3 MacOS下的安裝

Mac下的安裝可以通過(guò) macports 或者 homebrew 來(lái)安裝,

通過(guò) Macports 安裝:

安裝iverilog: sudo ports-d-v install iverilog安裝GTKWave: sudo ports-d-v install gtkwave

通過(guò) homebrew 安裝:

安裝iverilog: brew install icarus-verilog安裝GTKWave: brew install caskroom/cask/gtkwave3.4 查看是否安裝成功

安裝成功后,可以通過(guò)命令窗口來(lái)查看命令所在的路徑。

Windows環(huán)境可以通過(guò)where命令查看安裝路徑

代碼語(yǔ)言:JavaScript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

where iverilogwhere vvpwhere gtkwave

Linux環(huán)境可以通過(guò)which命令查看安裝路徑

代碼語(yǔ)言:javascript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

which iverilogwhich vvpwhich gtkwave

4. 基本參數(shù)介紹

Icarus Verilog編譯器主要包含3個(gè)工具

iverilog:用于編譯verilog和vhdl文件,進(jìn)行語(yǔ)法檢查,生成可執(zhí)行文件vvp:根據(jù)可執(zhí)行文件,生成仿真波形文件gtkwave:用于打開(kāi)仿真波形文件,圖形化顯示波形

在終端輸入 iverilog回車,可以看到常用參數(shù)使用方法的簡(jiǎn)單介紹:

代碼語(yǔ)言:javascript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

$ iverilogD:iverilogbiniverilog.exe: no source files.Usage: iverilog [-EiSuvV] [-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] [-l file] source_file(s)See the man page for details.

下面來(lái)詳細(xì)介紹幾個(gè)常用參數(shù)的使用方法。

4.1 參數(shù)-o

這是比較常用的一個(gè)參數(shù)了,和GCC中-o的使用幾乎一樣,用于指定生成文件的名稱。如果不指定,默認(rèn)生成文件名為a.out。如:iverilog-o test test.v

4.2 參數(shù)-y

用于指定包含文件夾,如果top.v中調(diào)用了其他的的.v模塊,top.v直接編譯會(huì)提示

代碼語(yǔ)言:javascript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

led_demo_tb.v:38: error: Unknownmodule type: led_demo2 error(s) during elaboration.*** These modules were missing:        led_demo referenced 1 times.***

找不到調(diào)用的模塊,那么就需要指定調(diào)用模塊所在文件夾的路徑,支持相對(duì)路徑和絕對(duì)路徑。

如:iverilog-y D:/test/demo led_demo_tb.v

如果是同一目錄下:iverilog-y./led_demo_tb.v,另外,iverilog還支持Xilinx、Altera、Lattice等FPGA廠商的仿真庫(kù),需要在編譯時(shí)通過(guò)-y參數(shù)指定庫(kù)文件的路徑,詳細(xì)的使用方法可以查看官方用戶指南:

https://iverilog.fandom.com/wiki/User_Guide

4.3 參數(shù)-I

如果程序使用`include語(yǔ)句包含了頭文件路徑,可以通過(guò)-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的編譯仿真實(shí)際應(yīng)用

新建led_demo.v源文件,內(nèi)容如下:

代碼語(yǔ)言:javascript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

module led_demo(    input clk,    input rst_n,    output reg led);reg [7:0] cnt;always @ (posedge clk)beginif(!rst_n)        cnt <= 0;elseif(cnt >= 10)        cnt <= 0;else        cnt <= cnt + 1;endalways @ (posedge clk)beginif(!rst_n)        led <= 0;elseif(cnt == 10)        led <= !led;endendmodule

功能非常簡(jiǎn)單,每10個(gè)時(shí)鐘周期,led翻轉(zhuǎn)一次。

仿真testbench文件leddemotb.v,內(nèi)容如下:

代碼語(yǔ)言:javascript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

`timescale 1ns/100psmodule led_demo_tb;parameter SYSCLK_PERIOD = 10;reg SYSCLK;reg NSYSRESET;initialbegin    SYSCLK = 1'b0;    NSYSRESET = 1'b0;end/*iverilog */initialbegin    $dumpfile("wave.vcd");        //生成的vcd文件名稱    $dumpvars(0, led_demo_tb);    //tb模塊名稱end/*iverilog */initialbegin    #(SYSCLK_PERIOD * 10 )        NSYSRESET = 1'b1;    #1000        $stop;endalways @(SYSCLK)    #(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;led_demo led_demo_ut0 (    // Inputs    .rst_n(NSYSRESET),    .clk(SYSCLK),    // Outputs    .led( led));endmodule

注意testbench文件中有幾行iverilog編譯器專用的語(yǔ)句,如果不加的話后面不能生成vcd文件。

代碼語(yǔ)言:javascript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

initialbegin    $dumpfile("wave.vcd");        //生成的vcd文件名稱    $dumpvars(0, led_demo_tb);    //tb模塊名稱end

5.1 編譯

通過(guò) iverilog-o wave led_demo_tb.v led_demo.v命令,對(duì)源文件和仿真文件,進(jìn)行語(yǔ)法規(guī)則檢查和編譯。由于本示例比較簡(jiǎn)單,只有1個(gè)文件,如果調(diào)用了多個(gè).v的模塊,可以通過(guò)前面介紹的-y參數(shù)指定源文件的路徑,否則編譯報(bào)錯(cuò)。如果源文件都在同同一個(gè)目錄,可以直接通過(guò) ./絕對(duì)路徑的方式來(lái)指定。

例如,leddemotb.v中調(diào)用了led_demo.v模塊,就可以直接使用 iverilog-o wave-y./top.v top_tb.v來(lái)進(jìn)行編譯。

如果編譯成功,會(huì)在當(dāng)前目錄下生成名稱為wave的文件。

全平臺(tái)輕量開(kāi)源verilog仿真工具iverilog+GTKWave使用教程

5.2 生成波形文件

使用 vvp-n wave-lxt2命令生成vcd波形文件,運(yùn)行之后,會(huì)在當(dāng)前目錄下生成.vcd文件。

全平臺(tái)輕量開(kāi)源verilog仿真工具iverilog+GTKWave使用教程

如果沒(méi)有生成,需要檢查testbench文件中是否添加了如下幾行:

代碼語(yǔ)言:javascript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

initialbegin    $dumpfile("wave.vcd");        //生成的vcd文件名稱    $dumpvars(0, led_demo_tb);    //tb模塊名稱end

5.3 打開(kāi)波形文件

使用命令 gtkwave wave.vcd,可以在圖形化界面中查看仿真的波形圖。

全平臺(tái)輕量開(kāi)源verilog仿真工具iverilog+GTKWave使用教程

6. Verilog轉(zhuǎn)換為VHDL

雖然VHDL和Verilog都誕生于20世紀(jì)80年代,而且都屬于硬件描述語(yǔ)言(HDL),但是二者的語(yǔ)法特性卻不一樣。Icarus Verilog 還有一個(gè)小功能就是支持把使用Verilog語(yǔ)言編寫的.v文件轉(zhuǎn)換為VHDL語(yǔ)言的.vhd文件。

如把leddemo.v文件轉(zhuǎn)換為VHDL文件leddemo.vhd,使用命令 iverilog-tvhdl-o led_demo.vhd led_demo.v。

全平臺(tái)輕量開(kāi)源verilog仿真工具iverilog+GTKWave使用教程

生成的VHDL文件內(nèi)容如下:

代碼語(yǔ)言:javascript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

-- 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:8begin  led <= led_Reg;-- Generatedfrom always process in led_demo (led_demo.v:10)  process (clk) isbeginif rising_edge(clk) thenif(not rst_n) = '1'then        cnt <= X"00";elseifResize(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) isbeginif rising_edge(clk) thenif(not rst_n) = '1'then        led_Reg <= '0';elseifResize(cnt, 32) = X"0000000a"then          led_Reg <= not led_Reg;endif;endif;endif;end process;end architecture;

7. VHDL文件的編譯和仿真

如果你還和編譯Verilog一樣,使用 iverilog led_dmeo.v來(lái)編譯VHDL文件的話,那么會(huì)提示有語(yǔ)法錯(cuò)誤,這是正常的,因?yàn)閂erilog和VHDL是不同的語(yǔ)法規(guī)則,不能使用Verilog的標(biāo)準(zhǔn)來(lái)檢查VHDL文件的語(yǔ)法。需要添加 -g2012參數(shù)來(lái)對(duì)VHDL文件進(jìn)行編譯,如 iverilog-g2012 led_demo.vhd,和Verilog一樣,同樣也支持Testbech文件的編譯和仿真,當(dāng)然需要編寫對(duì)應(yīng)的VHDL Testbench文件。

全平臺(tái)輕量開(kāi)源verilog仿真工具iverilog+GTKWave使用教程

8. 批處理文件一鍵執(zhí)行

通過(guò)批處理文件,可以簡(jiǎn)化編譯仿真的執(zhí)行過(guò)程,直接一鍵執(zhí)行編譯和仿真。

新建文本文檔,輸入以下內(nèi)容:

代碼語(yǔ)言:javascript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

echo "開(kāi)始編譯"iverilog -o wave led_demo.v led_demo_tb.vecho "編譯完成"vvp -n wave -lxt2echo "生成波形文件"cp wave.vcd wave.lxtecho "打開(kāi)波形文件"gtkwave wave.lxt

文件擴(kuò)展名需要更改,Windows系統(tǒng)保存為.bat文件,Linux系統(tǒng)保存為.sh文件。Windows直接雙擊運(yùn)行,Linux在終端執(zhí)行。

9. 總結(jié)

從20040706版本,到現(xiàn)在的最新版本20190809,作者還在繼續(xù)更新,有興趣的朋友可以研究一下源代碼是如何實(shí)現(xiàn)語(yǔ)法規(guī)則檢查的,或者可以嘗試編譯源碼,獲得最新的版本。當(dāng)然,和FPGA廠商的IDE相比,功能還是非常有限,GTKWave界面也比較簡(jiǎn)陋,如不支持寬度測(cè)量等,主要是小巧+全平臺(tái)支持,可以配合IDE來(lái)使用。這個(gè)工具還支持主流FPGA廠商的IP核仿真,如Xilinx和Lattice,詳細(xì)的使用方法可以參考官方使用指南。

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_Guidegithub開(kāi)源地址:https://github.com/steveicarus/iverilogGTKWave下載(iverilog已經(jīng)包含):http://gtkwave.sourceforge.net/

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享