在 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
學習和調試的體會
-
熟悉工具以前不要開始寫實驗內容,先寫幾個老師推薦的譯者是夏宇聞的那本教材中的例子,例如:模16計數器,RS 數據鎖存器等等。
-
看書很重要,$dumpfile,$dumpvars,$display,$monitor,$stop,$finish一定要搞清楚,想要仿真正常結束並且生成波形文件,一定在 test_bench 的一個 initial塊中正確的設置$dumpvars,並且在適當的周期后使用$finish。用$stop的話 vpp 會進入交互的調試的功能。
-
使用編輯器+命令行運行仿真的方式調試要多多借助$display 和 $monitor 這兩個宏。注意$monitor只有最后一次的設置會生效。
-
我在寫 mips 模塊的時候,把很多模塊用 wire 連起來的過程中出現了拼寫錯誤,比如 Branch 寫成 branch,這一點跟 c 語言不同,編譯器是不會報錯提示未定義的 wire,而是會生成空信號,我就坑了一把。其實應該早點用Scansion看看,空信號的是藍色的線!特別明顯啊!一查一個准啊!
-
調試輸出善用
[%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