[Env] Icarus Verilog(iverilog) + gtkwave 安裝與環境建立

最近閒暇時間,我要開始使用 Intel 的 FPGA (DE2-115 VEEK-MT)來做一些小遊戲來玩玩。
在這之前我想先測試一些簡單的範例程式,例如顯示一些字在我買的 FPGA 螢幕上。

目前我要做的事為:
  1. 先建立一個模擬環境來寫 Verilog 以及 Testbench。
  2. 在我們的模擬環境測試一些簡單的小程式。
  3. 然後把簡單的小程式燒錄進 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 檔案)

做到這裡就可以開始測試第一個 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:
將此檔案命名為 test.v,使用以下指令來編譯 test.v:
iverilog -o ./run_sim ../test.v
執行  ./run_sim 後,使用以下指令觀看波形:
gtkwave ./waveform.vcd

開啟 gtkwave 可以開始看到 simple_counter 的行為:




留言

這個網誌中的熱門文章

[Env] Vim 安裝 Verilog-mode

[Tools] Verilog-mode 用法整理 (usage collections)