若是你只是想檢查Verilog文件的語法是否有錯誤,而後進行一些基本的時序仿真,那麼Icarus Verilog 就是一個不錯的選擇。相比於各大FPGA廠商的IDE幾個G的大小,Icarus Verilog 顯得極其小巧,最新版安裝包大小僅有17MB,支持全平臺:Windows+Linux+MacOS,而且源代碼開源。本文將介紹如何使用Icarus Verilog來進行verilog文件的編譯和仿真。html
Icarus Verilog是一個輕量、免費、開源的Verilog編譯器,基於C++實現,開發者是 Stephen Williams ,遵循 GNU GPL license 許可證,安裝文件中已經包含 GTKWave支持Verilog/VHDL文件的編譯和仿真,命令行操做方式,相似gcc編譯器,經過testbench文件能夠生成對應的仿真波形數據文件,經過自帶的GTKWave能夠查看仿真波形圖,支持將Verilog轉換爲VHDL文件。git
iverilog安裝時,默認會把GTKWave一塊兒安裝,用於查看生成的波形圖。github
iverilog支持Windows、Linux和MacOS三大主流平臺,截止2019年12月1日,最新版本v11-20190809下載:網絡
http://bleyer.org/icarus/iverilog-v11-20190809-x64_setup.exedom
Windows下直接雙擊上面下載的安裝文件便可,安裝完成後安裝目錄以下:ide
Linux下的安裝,以Ubuntu 16.04爲例,能夠經過apt-get直接安裝。工具
sudo apt-get install iverilog
sudo apt-get install gtkwave
不能成功安裝的,嘗試更換鏡像地址,我使用的是網易的開源鏡像地址。測試
Mac下的安裝能夠經過 macports 或者 homebrew 來安裝,網站
經過 Macports 安裝:ui
sudo ports -d -v install iverilog
sudo ports -d -v install gtkwave
經過 homebrew 安裝:
brew install icarus-verilog
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
回車,能夠看到經常使用參數使用方法的簡單介紹:
$ 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.
下面來詳細介紹幾個經常使用參數的使用方法。
這是比較經常使用的一個參數了,和GCC中-o的使用幾乎同樣,用於指定生成文件的名稱。若是不指定,默認生成文件名爲a.out。如:iverilog -o test test.v
用於指定包含文件夾,若是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
若是程序使用`include語句包含了頭文件路徑,能夠經過-i參數指定文件路徑,使用方法和-y參數同樣。
如:iverilog -I D:/test/demo led_demo_tb.v
iverilog還支持把verilog文件轉換爲VHDL文件,如iverilog -tvhdl -o out_file.vhd in_file.v
新建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
經過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的文件。
使用vvp -n wave -lxt2
命令生成vcd波形文件,運行以後,會在當前目錄下生成.vcd文件。
若是沒有生成,須要檢查testbench文件中是否添加了以下幾行:
initial begin $dumpfile("wave.vcd"); //生成的vcd文件名稱 $dumpvars(0, led_demo_tb); //tb模塊名稱 end
使用命令gtkwave wave.vcd
,能夠在圖形化界面中查看仿真的波形圖。
雖然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;
若是你還和編譯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官方網站。