はじめに
この記事ではVerilog HDLというハードウェア記述言語の1つをIcarus VerilogというオープンソースのVerilog Simulatorを用いて実行し、GTKWaveで波形を観察する?ことを目標とします。
用語まとめ
-
Verilog HDL
ハードウェア記述言語の1つ -
Icarus Verilog
Verilog の Simulator -
GTKWave
Wave Viewer 波形描画ソフト
Icarus Verilog(イカルス・ヴェリログ) はオープンソースの Verilog シミュレータ。Verilog 1995, 2001, SystemVerilog 2005 をサポートしている。
ref : https://ja.wikipedia.org/wiki/Icarus_Verilog
HomeBrewによるIcarus VerilogのInstall
$ sudo xcodebuild -license accept
$ brew install icarus-verilog
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 3 taps (homebrew/science, homebrew/core, caskroom/cask).
==> Downloading https://homebrew.bintray.com/bottles/icarus-verilog-10.1.1.high_
######################################################################## 100.0%
==> Pouring icarus-verilog-10.1.1.high_sierra.bottle.tar.gz
🍺 /usr/local/Cellar/icarus-verilog/10.1.1: 59 files, 5.6MB
ref : http://iverilog.wikia.com/wiki/Installation_Guide
Installできていることを確認
$ iverilog
iverilog: no source files.
Usage: iverilog [-ESvV] [-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] source_file(s)
See the man page for details.
GTKWaveのダウンロード
http://gtkwave.sourceforge.net/ からInstallします。Installといっても、zipを落として、.appファイルを開くだけです。
OSX版のダウンロードに移動して https://sourceforge.net/projects/gtkwave/files/
これの、gtkwave.zip をダウンロードします。これを展開して、Applications直下にgtkwave.appを移動させます。
これを、右クリックからopenで実行します。
サンプルを書いてコンパイル&実行
Verilogを書く
http://monoist.atmarkit.co.jp/mn/articles/0703/16/news148.html
の例に倣って、4bitカウンターのサンプルを記述します。
counter.v
を以下のように記述します。これはカウンターのハードウェアを記述したことになります。
module counter(CLK, RST_X, cnt);
input RST_X, CLK;
output reg [3:0] cnt;
always @(posedge CLK) begin
if (!RST_X)
cnt <= 4'h0;
else
cnt <= cnt + 4'h1;
end
endmodule
counter_test.v
は以下のようにしました。
module top();
reg CLK, RST_X;
wire [3:0] w_cnt;
counter counter_instance(CLK, RST_X, w_cnt);
initial begin
CLK = 0;
forever #10 CLK = ~CLK;
end
initial begin
RST_X = 0;
#30 RST_X = 1;
end
initial begin
#500 $finish();
end
always @(posedge CLK) begin
$write("[%t] counter: %b\n", $time, w_cnt);
end
initial begin
$dumpfile("counter_test.vcd");
$dumpvars(0, counter_instance);
end
endmodule
コンパイル&実行
次に、これをコンパイルして、実行してみます。
$ iverilog -o counter_test.out counter.v counter_test.v
これにて、counter_test.out
という実行ファイルが作られます。
このcounter_test.out
を用いて、vvpコマンドでSimulationの実行を行います。
$ vvp counter_test.out
VCD info: dumpfile counter_test.vcd opened for output.
[ 10] counter: xxxx
[ 30] counter: 0000
[ 50] counter: 0001
[ 70] counter: 0010
[ 90] counter: 0011
[ 110] counter: 0100
[ 130] counter: 0101
[ 150] counter: 0110
[ 170] counter: 0111
[ 190] counter: 1000
[ 210] counter: 1001
[ 230] counter: 1010
[ 250] counter: 1011
[ 270] counter: 1100
[ 290] counter: 1101
[ 310] counter: 1110
[ 330] counter: 1111
[ 350] counter: 0000
[ 370] counter: 0001
[ 390] counter: 0010
[ 410] counter: 0011
[ 430] counter: 0100
[ 450] counter: 0101
[ 470] counter: 0110
[ 490] counter: 0111
この時、counter_test.vcd
というファイルが生成されています。
波形を見る
生成された、.vcdファイルを開くだけです。
こんな感じで波形が見れます。
終わりに
以上となります。
今後の発展の為にもご意見、ご感想、その他要望等お待ちしております。