在 Mac 上編寫 Verilog 代碼


在 Mac 上編寫 Verilog 代碼

前言


本文將會介紹在 Mac 上如何編寫,編譯和仿真你的 Verilog 代碼,來完成馮愛民老師《計算機組成原理A》課程的實驗內容,我將會介紹一款免費的文本編輯器 Sublime Text ,一個自由軟件Icarus Verilog,一個免費的波形文件查看軟件Scansion。在這里也呼吁大家力所能及的使用正版軟件或者免費的自由軟件。破解收費軟件是不道德並且違法的行為。

使用 Sublime Text 編寫代碼


你可能需要一個有語法高亮和更加聰明的縮進功能的文本編輯器。如果你現在沒有趁手的,我推薦 Sublime Text,然后安裝 Sublime Verilog 插件。按照以下步驟:

  • 從 Sublime Text
    官方網站下載安裝。
  • 按照這個頁面
    的指導安裝Package Contro,重啟 Sublime Text。
  • 打開 Sublime ,使用快捷鍵 Command+Shift+P(對Windows 和
    Linux用戶是Ctrl+Shift+P),一個窗口或者菜單就出現了。
  • 輸入 install 然后按回車。
  • 輸入 verilog 然后按回車。
  • 現在隨便打開一份 Verilog 代碼源文件,可以看到已經正確的
    進行了高亮,Sublime主界面的左下角也提示 Verilog 字樣。

下一步,你需要在 Mac, Linux 或者 Windows上安裝 Icarus Verilog 用來進行編譯和仿真。

安裝Icarus Verilog


首先,讓我們安裝軟件:

  • 確保你安裝了 Xcode 和 Developer Tools,參見.(從 App store 或蘋果開發者網站安裝Xcode,然后安裝Xcode command line tools, 在終端.app 中運行命令xcode-select --install ,運行完成后你可以得到 GUN 工具鏈,一些常用的重要命令:make, GCC, clang, git。譯者注)。

  • 原文推薦使用 MacPorts,但是我推薦大家選擇 Homebrew作為自己的包管理工具。點擊上面鏈接按照官網說明安裝,或者在終端運行下面的命令。

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
  • 打開控制台輸入

    brew install icarus-verilog
    
  • 使用Homebrew安裝軟件包時,會自動先下載軟件包,然后解壓安裝,但有時候下載會卡住,或者很慢,這個時候你可以通過其他工具先將所需的軟件包下載下來,注意版本一定要對應,下載的鏈接可以在 brew 在終端中的輸出看到。例如

    ftp://icarus.com/pub/eda/verilog/v0.9/verilog-0.9.7.tar.gz
    
  • Homebrew放置軟件包源碼的路徑為/Library/Caches/Homebrew/,只要你將所需要的軟件包下載正確的版本,放置在此目錄下,那么再使用brew install icarus-verilog的時候, brew 就能直接安裝了,注意軟件包的命名,一般是name-version.suffix,參考以下下命令:

    cp ~/Desktop/verilog-0.9.7.tar.gz /Library/Caches/Homebrew/icarus-verilog-0.9.7.tar.gz
    
  • 當你安裝成功,在終端運行命令iverilog可以看到如下的輸出:

    iverilog: no source files.
    Usage: iverilog [-ESvV] [-B base] [-c cmdfile|-f cmdfile]
        	        [-g1995|-g2001|-g2005] [-g<feature>]
                	[-D macro[=defn]] [-I includedir] [-M depfile] [-m module]
                    [-N file] [-o filename] [-p flag=value]
        	        [-s topmodule] [-t target] [-T min|typ|max]
                	[-W class] [-y dir] [-Y suf] source_file(s)
    See the man page for details.
    

編譯和仿真


  • 下載例子代碼,解壓后放在桌面,文件夾命名為tutorial1

  • 在終端中打開文件夾。

    cd Desktop/tutorial1
    
  • 下一步編譯例子代碼,運行命令:

    iverilog -o example_3_1.vvp example_3_1_tb.v
    
  • 成功編譯后可以看到生成了example_3_1.vvp文件,你可以在 Finder 中查看,也可以使用命令:

    ls
    

    可以看到輸出

    example_3_1.v    example_3_1_tb.v
    example_3_4_tb.v example_3_5_tb.v
    example_3_1.vvp  example_3_4.v    
    example_3_5.v
    
  • 現在就可以運行了,使用命令:

    vvp example_3_1.vvp
    

    或者直接運行可執行文件example_3_1.vvp(其實是腳本文件,vvp 文件內容第一行指明了使用 vpp 解釋)。

    ./example_3_1.vvp
    

    然后得到輸出:

    VCD info: dumpfile example_3_1.vcd opened for output.
    done testing case           0
    done testing case           1
    done testing case           2
    done testing case           3
    done testing case           4
    done testing case           5
    done testing case           6
    done testing case           7	
    
  • 這個頁面下載Scansion,並安裝。

  • 使用 Scansion 查看仿真產生的波形文件。可以在 Finder 中雙擊 vcd 文件,也可以使用命令:

    open -a Scansion example_3_1.vcd
    

恭喜你,你已經熟練的掌握了工具了,接下來趕快去寫作業吧。

一些更復雜的應用和我的體會


如何使用多文件組織

本部分內容參考Icarus Verilog官方 Wiki 的某個頁面

舉個例子,對於兩個文件,實現了計數器 count model 在 counter.v文件

module counter(out, clk, reset);

  parameter WIDTH = 8;

  output [WIDTH-1 : 0] out;
  input 	       clk, reset;

  reg [WIDTH-1 : 0]   out;
  wire 	       clk, reset;

  always @(posedge clk)
    out <= out + 1;

  always @reset
    if (reset)
      assign out = 0;
    else
      deassign out;

endmodule // counter

並且 test bench model 的實現在 counter_tb.v文件中。

module test;

  /* Make a reset that pulses once. */
  reg reset = 0;
  initial begin
     # 17 reset = 1;
     # 11 reset = 0;
     # 29 reset = 1;
     # 11 reset = 0;
     # 100 $stop;
  end

  /* Make a regular pulsing clock. */
  reg clk = 0;
  always #5 clk = !clk;

  wire [7:0] value;
  counter c1 (value, clk, reset);

  initial
     $monitor("At time %t, value = %h (%0d)",
              $time, value, value);
endmodule // test

你當然可以使用 include 宏。這里我們介紹的是另外的方法。

iverlog 命令通過兩種方式支持多文件組織。第一種是在命令的末尾列出所有的源代碼文件。像這樣:

% iverilog -o my_design  counter_tb.v counter.v
% vvp my_design

提醒一下 PC 上可執行文件一般要.exe后綴,但是在 Linux 上我們習慣把有執行權限的文件命名成沒有后綴的。我們更傾向於命名為my_design,而不是my_design.vvp

這個方法在文件很少的時候非常靈活好用,但是對於實驗,以為我為例,我寫了11個.v 文件,這時候就要用到第二種方法,使用命令的-c 參數。官方叫做“use a commandfile”,創建一個文本文件,列出要編譯的所有文件名。對於上面的例子,我們創建一個“file_list.txt”,每行列出一個文件名,文本文件內容如下:

counter.v
counter_tb.v

運行下面的命令來編譯和運行:

% iverilog -o my_design -c file_list.txt
% vvp my_design

在編譯時,還可以使用 -s 參數指定稍后進行仿真的頂層模塊,例如:

% iverilog -s main -o hello hello.v

學習和調試的體會

  1. 熟悉工具以前不要開始寫實驗內容,先寫幾個老師推薦的譯者是夏宇聞的那本教材中的例子,例如:模16計數器,RS 數據鎖存器等等。

  2. 看書很重要,$dumpfile,$dumpvars,$display,$monitor,$stop,$finish一定要搞清楚,想要仿真正常結束並且生成波形文件,一定在 test_bench 的一個 initial塊中正確的設置$dumpvars,並且在適當的周期后使用$finish。用$stop的話 vpp 會進入交互的調試的功能。

  3. 使用編輯器+命令行運行仿真的方式調試要多多借助$display 和 $monitor 這兩個宏。注意$monitor只有最后一次的設置會生效。

  4. 我在寫 mips 模塊的時候,把很多模塊用 wire 連起來的過程中出現了拼寫錯誤,比如 Branch 寫成 branch,這一點跟 c 語言不同,編譯器是不會報錯提示未定義的 wire,而是會生成空信號,我就坑了一把。其實應該早點用Scansion看看,空信號的是藍色的線!特別明顯啊!一查一個准啊!

  5. 調試輸出善用[%m]參數,高層模塊引用底層模塊可以使用點語法。

    eg1 : 輸出 time = 890 [testbench._mips._regfile]Register[16] <= 00007fff
    eg2 : 代碼 $display("Register[s%d] = %h",i-16,_mips._regfile.rf[i]);
    

結語


本文面向的是第一次在 Mac 上配置開發環境的同學,已經熟悉命令行的同學,直接使用brew install icarus-verilog 一條命令即可獲得一切。對第一次配置生產環境的同學,我將為你介紹必要的命令行工具 Xcode-select 和 Hombre。如何配置 Sublime Build System 幫助你更快的編譯和運行,使用 Sublime Project 功能構建一個完美的工作流程是比較復雜的話題,可以參考sublime-text-unofficial-documentation

文章參考了

本文面向使用 Mac OSX 的同學,對使用 Linux 的同學,本文和參考資料也會給你帶來幫助。

如果有問題歡迎聯系:李建霖 lijianlin1995@iCloud.com Wechat:lijianlin1995


免責聲明!

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



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