全平台輕量開源verilog仿真工具iverilog+GTKWave使用教程


前言

如果你只是想檢查Verilog文件的語法是否有錯誤,然后進行一些基本的時序仿真,那么Icarus Verilog 就是一個不錯的選擇。相比於各大FPGA廠商的IDE幾個G的大小,Icarus Verilog 顯得極其小巧,最新版安裝包大小僅有17MB,支持全平台:Windows+Linux+MacOS,並且源代碼開源。本文將介紹如何使用Icarus Verilog來進行verilog文件的編譯和仿真。

關於 Icarus Verilog

Icarus Verilog是一個輕量、免費、開源的Verilog編譯器,基於C++實現,開發者是 Stephen Williams ,遵循 GNU GPL license 許可證,安裝文件中已經包含 GTKWave支持Verilog/VHDL文件的編譯和仿真,命令行操作方式,類似gcc編譯器,通過testbench文件可以生成對應的仿真波形數據文件,通過自帶的GTKWave可以查看仿真波形圖,支持將Verilog轉換為VHDL文件。

iverilog的安裝

iverilog安裝時,默認會把GTKWave一起安裝,用於查看生成的波形圖。

iverilog支持Windows、Linux和MacOS三大主流平台,截止2019年12月1日,最新版本v11-20190809下載:

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

Windows下的安裝

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

Linux下的安裝

Linux下的安裝,以Ubuntu 16.04為例,可以通過apt-get直接安裝。

  • 安裝iverilog:sudo apt-get install iverilog
  • 安裝GTKWave:sudo apt-get install gtkwave

不能成功安裝的,嘗試更換鏡像地址,我使用的是網易的開源鏡像地址。

MacOS下的安裝

Mac下的安裝可以通過 macports 或者 homebrew 來安裝,

通過 Macports 安裝:

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

通過 homebrew 安裝:

  • 安裝iverilog: brew install icarus-verilog
  • 安裝GTKWave:brew install caskroom/cask/gtkwave

查看是否安裝成功

安裝成功后,可以通過命令窗口來查看命令所在的路徑。

Windows環境可以通過where命令查看安裝路徑


where iverilog
where vvp
where gtkwave

Linux環境可以通過which命令查看安裝路徑


which iverilog
which vvp
which gtkwave

基本參數介紹

Icarus Verilog編譯器主要包含3個工具:

  • iverilog:用於編譯verilog和vhdl文件,進行語法檢查,生成可執行文件
  • vvp:根據可執行文件,生成仿真波形文件
  • gtkwave:用於打開仿真波形文件,圖形化顯示波形

在終端輸入iverilog回車,可以看到常用參數使用方法的簡單介紹:


$ 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<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.

下面來詳細介紹幾個常用參數的使用方法。

參數-o

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

參數-y

用於指定包含文件夾,如果top.v中調用了其他的的.v模塊,top.v直接編譯會提示


led_demo_tb.v:38: error: Unknown module 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參數指定庫文件的路徑,詳細的使用方法可以查看官方用戶指南:

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

參數-I

如果程序使用`include語句包含了頭文件路徑,可以通過-i參數指定文件路徑,使用方法和-y參數一樣。

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

參數-tvhdl

iverilog還支持把verilog文件轉換為VHDL文件,如iverilog -tvhdl -o out_file.vhd in_file.v

Verilog的編譯仿真實際應用

新建led_demo.v源文件,內容如下:


module led_demo(
	input clk,
	input rst_n,

	output reg led
);

reg [7:0] cnt;

always @ (posedge clk)
begin
	if(!rst_n)
		cnt <= 0;
	else if(cnt >= 10)
		cnt <= 0;
	else 
		cnt <= cnt + 1;
end

always @ (posedge clk)
begin
	if(!rst_n)
		led <= 0;
	else if(cnt == 10)
		led <= !led;
end

endmodule 

功能非常簡單,每10個時鍾周期,led翻轉一次。

仿真testbench文件led_demo_tb.v,內容如下:


`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

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


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

1.編譯

通過iverilog -o wave led_demo_tb.v led_demo.v命令,對源文件和仿真文件,進行語法規則檢查和編譯。由於本示例比較簡單,只有1個文件,如果調用了多個.v的模塊,可以通過前面介紹的-y參數指定源文件的路徑,否則編譯報錯。如果源文件都在同同一個目錄,可以直接通過./絕對路徑的方式來指定。

例如,led_demo_tb.v中調用了led_demo.v模塊,就可以直接使用iverilog -o wave -y ./ top.v top_tb.v來進行編譯。

如果編譯成功,會在當前目錄下生成名稱為wave的文件。

2.生成波形文件

使用vvp -n wave -lxt2命令生成vcd波形文件,運行之后,會在當前目錄下生成.vcd文件。

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


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

3.打開波形文件

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

Verilog轉換為VHDL

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

如把led_demo.v文件轉換為VHDL文件led_demo.vhd,使用命令iverilog -tvhdl -o led_demo.vhd led_demo.v

生成的VHDL文件內容如下:


-- This VHDL was converted from Verilog using the
-- Icarus Verilog VHDL Code Generator 11.0 (devel) (s20150603-612-ga9388a89)

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-- Generated from Verilog module 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;

-- Generated from Verilog module 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;

  -- Generated from 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
        if Resize(cnt, 32) >= X"0000000a" then
          cnt <= X"00";
        else
          cnt <= cnt + X"01";
        end if;
      end if;
    end if;
  end process;

  -- Generated from 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
        if Resize(cnt, 32) = X"0000000a" then
          led_Reg <= not led_Reg;
        end if;
      end if;
    end if;
  end process;
end architecture;

VHDL文件的編譯和仿真

如果你還和編譯Verilog一樣,使用iverilog led_dmeo.v來編譯VHDL文件的話,那么會提示有語法錯誤,這是正常的,因為Verilog和VHDL是不同的語法規則,不能使用Verilog的標准來檢查VHDL文件的語法。需要添加-g2012參數來對VHDL文件進行編譯,如iverilog -g2012 led_demo.vhd,和Verilog一樣,同樣也支持Testbech文件的編譯和仿真,當然需要編寫對應的VHDL Testbench文件。

批處理文件一鍵執行

通過批處理文件,可以簡化編譯仿真的執行過程,直接一鍵執行編譯和仿真。

新建文本文檔,輸入以下內容:


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

文件擴展名需要更改,Windows系統保存為.bat文件,Linux系統保存為.sh文件。Windows直接雙擊運行,Linux在終端執行。

總結

從20040706版本,到現在的最新版本20190809,作者還在繼續更新,有興趣的朋友可以研究一下源代碼是如何實現語法規則檢查的,或者可以嘗試編譯源碼,獲得最新的版本。當然,和FPGA廠商的IDE相比,功能還是非常有限,GTKWave界面也比較簡陋,如不支持寬度測量等,主要是小巧+全平台支持,可以配合IDE來使用。這個工具還支持主流FPGA廠商的IP核仿真,如Xilinx和Lattice,詳細的使用方法可以參考官方使用指南。

參考資料

文章部分內容參考自Icarus Verilog官方網站。

推薦閱讀


  • 我的個人博客:www.wangchaochao.top
  • 我的公眾號:mcu149


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM