Icarus Verilogとgtkwaveをインストール †更新日 2020-06-15 (月) 16:45:21
Verilog HDLの学習用に Icarus Verilogは、オープンソースのVerilogコンパイラ&シミュレータとgtkwaveは波形ビューワをUbuntu 18.04LTS DeskTopにインストール Ubuntuの設定 †最小構成でインストール VNCのインストール †$ sudo apt install vino OS再起動すると設定の「共有」の個所に「画面共有」が表示する。 Windowsからの接続のため暗号化しない設定 $ sudo DISPLAY=:0 gsettings set org.gnome.Vino require-encryption false 以下のような設定をしてOS再起動した。不要かもしれない $ nmcli connection show NAME UUID TYPE DEVICE 有線接続 1 ba688a1f-889f-30a0-b947-ed395181dc52 ethernet enp5s0 $ dconf write /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections "['ba688a1f-889f-30a0-b947-ed395181dc52']" $ dconf read /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections ['ba688a1f-889f-30a0-b947-ed395181dc52'] $ ss -lnt | grep 5900 LISTEN 0 5 0.0.0.0:5900 0.0.0.0:* LISTEN 0 5 [::]:5900 [::]:* SSHのインストール †$ sudo apt install -y openssh-server $ sudo systemctl enable ssh $ sudo systemctl restart ssh Icarus Verilogとgtkwaveのインストール †インストール †# sudo apt-get install iverilog gtkwave パッケージリストを読み込んでいます... 完了 (略) mime-support (3.60ubuntu1) のトリガを処理しています ... desktop-file-utils (0.23-1ubuntu3.18.04.2) のトリガを処理しています ... libc-bin (2.27-3ubuntu1) のトリガを処理しています ... Icarus Verilog使用方法 †コンパイル
$ iverilog -o and2 -s and2_testbench *.v シミュレーション方法 これを実行すると波形ファイルが出来る
サンプルを作成してみる †必要なファイル
2入力AND回路 †2つの方法で作成してみる $ mkdir -p icarus_files/and2-1 $ cd icarus_files/and2-1 回路構成 ''and2.v'' (拡張子は「.v」)
/* AND2 */ module AND2 ( A, B, X ); /* モジュールの入出力端子を設定 */ input A, B; output X; /* モジュール内部の信号名を設定 */ /* wire は wire IA; wire IB; /* 回路動作を設定 */ assign IA = A; assign IB = B; assign X = IA & IB; /* ANDを実行 */ endmodule
/* AND2 */ module AND2 ( A, B, X ); input A, B; output X; and AAA (X, A, B); endmodule ベンチ内容(シミュレーション内容) その1,その2とも同じ内容でOK テストベンチではテスト入力として使う信号のデータ型をレジスタ宣言(reg 宣言)し、反対に検証対象の出力ポートに接続するテストベンチで値を与えない信号のデータ型はワイヤー宣言(wire宣言)する。 and2_testbench.v (拡張子は「.v」) /* AND2 テストベンチ */ /* 単位時間を10ナノ秒に設定 timescale<1タイムスケールあたりの実時間>/ <丸めの精度>*/ /*timescale の記述は、通常はテストベンチにのみに記述*/ `timescale 1ns/1ps module and2_testbench; /* 入力は:reg 出力は:wire */ reg a, b; wire out; /*回路のインスタンス化する。 AND2 ⇒ bbb*/ AND2 bbb (a, b, out); /*シミュレーションの開始宣言*/ initial begin /*シミュレーション出力ファイルの指定*/ $dumpfile("wave.vcd"); /*VCDファイルに出力するダンプを取る対象を指定する。0: 全階層の全変数 (ポート、ネット、変数など) */ $dumpvars(0, and2_testbench); /*コンパイル時に表示する内容を指定 */ /*下の例は時間ごとに a, b, outをバイナリで表示する */ $monitor ("%t: a = %b, b = %b, out = %b", $time, a, b, out); /*入力信号をバイナリで指定timescaleが 1ns/なので #100で100nsごとに値変化させている*/ a = 0; b = 0; #100 a = 1; #100 a = 0; b = 1; #100 a = 1; #100 a = 0; b = 0; #100 $finish; /*シミュレーションが終了すること指定*/ end endmodule コンパイル $ iverilog -o and2 -s and2_testbench *.v 「and2」という実行形式が出来る $ ls -l 合計 16 -rwxr-xr-x 1 okada okada 2317 6月 15 14:53 and2 ← これ -rw-rw-r-- 1 okada okada 361 6月 15 14:53 and2.v -rw-rw-r-- 1 okada okada 492 6月 15 14:49 and2.v~ -rw-rw-r-- 1 okada okada 1133 6月 15 14:50 and2_testbench.v シミュレーション波形生成 $ vvp and2 VCD info: dumpfile wave.vcd opened for output. 0: a = 0, b = 0, out = 0 100: a = 1, b = 0, out = 0 200: a = 0, b = 1, out = 0 300: a = 1, b = 1, out = 1 400: a = 0, b = 0, out = 0 「wave.vcd」というファイルが出来る $ ls -l 合計 20 -rwxr-xr-x 1 okada okada 2317 6月 15 14:53 and2 -rw-rw-r-- 1 okada okada 361 6月 15 14:53 and2.v -rw-rw-r-- 1 okada okada 492 6月 15 14:49 and2.v~ -rw-rw-r-- 1 okada okada 1133 6月 15 14:50 and2_testbench.v -rw-rw-r-- 1 okada okada 464 6月 15 14:54 wave.vcd ← これ GTKWaveで表示 †参考 † |