[Env] Icarus Verilog(iverilog) + gtkwave 安裝與環境建立
最近閒暇時間,我要開始使用 Intel 的 FPGA (DE2-115 VEEK-MT)來做一些小遊戲來玩玩。
在這之前我想先測試一些簡單的範例程式,例如顯示一些字在我買的 FPGA 螢幕上。
目前我要做的事為:
做到這裡就可以開始測試第一個 Verilog 程式了。先簡單寫個 Testbench 產生時序訊號,然後產生一個 counter 看一下波形:
將此檔案命名為 test.v,使用以下指令來編譯 test.v:
開啟 gtkwave 可以開始看到 simple_counter 的行為:
在這之前我想先測試一些簡單的範例程式,例如顯示一些字在我買的 FPGA 螢幕上。
目前我要做的事為:
- 先建立一個模擬環境來寫 Verilog 以及 Testbench。
- 在我們的模擬環境測試一些簡單的小程式。
- 然後把簡單的小程式燒錄進 FPGA。
本篇文章要記錄的事情,就是如何做到上述第一步驟:建立一個模擬環境。
Let's Go!
我的工作環境主要都在 Linux,我使用的作業系統為 Elementary OS。
首先可以安裝一套免費的 Verilog 模擬器 Icarus Verilog:
安裝方法很簡單,輸入以下指令:
sudo apt-get install iverilog
接著我們要有一個可以看數位訊號波形的免費軟體,叫做 gtkwave,安裝一下:
sudo apt-get install gtkwave
接著安裝 Verilator,這個軟體也是個免費的 Verilog 模擬器,但是我安裝 Verilator 目的為使用 Verilator 內建的 verilog lint 功能。lint 就是語法檢查,lint 可以讓 Verilog 內一些潛在的危險語法被偵測出來,例如 bit overflow 造成的運算錯誤。
我習慣將一個程式專案用以下的資料夾結構組織起來:
sudo apt-get install verilator安裝好以上三個免費工具之後,首先要練習將一個程式專案的資料夾結構整理好。
我習慣將一個程式專案用以下的資料夾結構組織起來:
├── build
├── doc
└── src
├── bench
└── rtl
build:編譯程式的地方,以及放編譯出來的執行檔和 log,以及跑 lint 和放波形都在 build 資料夾內操作。
doc:放一些文件筆記。
quartus:放 Quartus 專案的地方。我的 FPGA 買的是 Intel(Altera) 公司的,因此使用的 FPGA 專案建置軟體是 Quartus。
src:放源碼的地方,分成兩個資料夾,一個放 Testbench 類的檔案,另一個放 rtl code 檔案。(即 verilog 檔案)
quartus:放 Quartus 專案的地方。我的 FPGA 買的是 Intel(Altera) 公司的,因此使用的 FPGA 專案建置軟體是 Quartus。
src:放源碼的地方,分成兩個資料夾,一個放 Testbench 類的檔案,另一個放 rtl code 檔案。(即 verilog 檔案)
做到這裡就可以開始測試第一個 Verilog 程式了。先簡單寫個 Testbench 產生時序訊號,然後產生一個 counter 看一下波形:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | // This code is created by 0xff on 2020/03/08 module testbench; /*autowire*/ /*autoreginput*/ // common used signal: reg clk = 1'b1; reg rst_n = 1'b1; integer i = 0; integer j = 0; reg [7:0] simple_counter; always@(posedge clk or negedge rst_n) begin if(!rst_n) simple_counter <= 8'd0; else simple_counter <= simple_counter + 8'd1; end always #10 clk = ~clk; event after_rst_n; initial begin #6; rst_n = 1'b0; #30; rst_n = 1'b1; ->after_rst_n; end initial begin while(1) begin if(simple_counter == 8'd255) begin $display("\n\n"); $display(" ██████╗ █████╗ ███████╗███████╗ ██████╗ ██╗ ██╗███████╗███████╗"); $display(" ██╔══██╗██╔══██╗██╔════╝██╔════╝ ██╔═████╗╚██╗██╔╝██╔════╝██╔════╝"); $display(" ██████╔╝███████║███████╗███████╗ ██║██╔██║ ╚███╔╝ █████╗ █████╗ "); $display(" ██╔═══╝ ██╔══██║╚════██║╚════██║ ████╔╝██║ ██╔██╗ ██╔══╝ ██╔══╝ "); $display(" ██║ ██║ ██║███████║███████║ ╚██████╔╝██╔╝ ██╗██║ ██║ "); $display(" ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ "); $display("\n\n"); $finish; end else begin $display("\033[30;43m counter number: %d\033[0m", simple_counter); repeat(1)@(posedge clk); end end end initial begin $dumpfile("waveform.vcd"); $dumpvars(0, testbench); end endmodule // Local Variables: // verilog-library-directories:("." "./*/" "../" "../rtl/") // verilog-auto-inst-param-value:t // verilog-auto-read-includes:t // End: |
iverilog -o ./run_sim ../test.v執行 ./run_sim 後,使用以下指令觀看波形:
gtkwave ./waveform.vcd
開啟 gtkwave 可以開始看到 simple_counter 的行為:

留言
張貼留言