スポンサーリンク
Translate

Icarus VerilogとGTKWaveでMacでも手軽にVerilogシミュレーションする

スポンサーリンク

どうもkohaniiです

普段使っているAlteraのCPLD、FPGAのプログラムを書くときに開発環境がWindowsとUbuntuしか無く、
macOS上でVerilogを書いて実行することができません。

せめてMacにVerilogを書いてシミュレーションができる環境があれば、Mac上で書いてWindowsでデバイス用にコンパイルすることができます。

そして調べてみるとIcarus VerilogというオープンソースのVerilogシミュレーターがあることがわかりました。
このソフトウェアはCLIでMacだけでなくUnix系、Linux、Windowsにも対応しているのでさまざまな環境でVerilogをシミュレーションできます。
ただこのソフトでシミュレーションしたところで内部の動作は分かりません。
調べてみるとVerilogコード内で$dumpfileコマンドなどを使用してValue change dump(VCD)ファイルを作成し、
そのファイルを専用のビューアで見ることで信号を確認するようです。

ビューアとなると画面表示などかなりハードウェア的な処理をするのでMacに対応したソフトは難しいと思ったのですが、GTKWaveというソフトがあるそうです。
このソフトもMacだけでなくUnix系 Linux Windowsに対応しています。
GUIはGTKという画像編集ソフトのGIMPのために開発されたツールキットを使用しているので様々な環境で動作するようです。

あとはテキストエディタさえあればいいのでこれで開発できます。

スポンサーリンク

Icarus Verilogのインストール

Homebrewがインストールされている環境で

brew install icarus-verilog

と入力すればインストールされます。簡単ですね。
Homebrewは何かとよく使うのでインストールしておくのをお勧めします。

スポンサーリンク

GTKWaveのインストール

gtkwave - Browse Files at SourceForge.net
GTKWave is a fully featured GTK+ based wave viewer for Unix and Win32 which reads LXT, LXT2, VZT, FST, and GHW files as well as standard Verilog…

このURLのDownload Latest Versionからzipをダウンロードします。

zipを解凍するとアプリケーションが出てくるので、アプリケーションフォルダにでも入れておきます。

スポンサーリンク

試してみる

まずテストに使うtopモジュールのプログラムです。

top.v

`timescale 1s/1ms

module top;
  reg clk = 1'd0;
  initial begin
    forever #1 clk = ~clk;
  end
  initial begin
    #16 $finish;
  end

  wire dff1_Q;
  dff dff1(
    .clk(clk),
    .reset(1'd0),
    .D(~dff1_Q),
    .Q(dff1_Q)
  );

  wire dff2_Q;
  dff dff2(
    .clk(dff1_Q),
    .reset(1'd0),
    .D(~dff2_Q),
    .Q(dff2_Q)
  );

  wire dff3_Q;
  dff dff3(
    .clk(dff2_Q),
    .reset(1'd0),
    .D(~dff3_Q),
    .Q(dff3_Q)
  );

  initial begin
    $dumpfile("top.vcd");
    $dumpvars(0, top);
  end
endmodule

そしてサブモジュールのdffです。

dff.v

module dff (
  input clk,
  input reset,
  input D,
  output reg Q
);
  initial begin
    Q <= 0;
  end
  always @(posedge clk or posedge reset) begin
    if(reset) begin
      Q <= 0;
    end else begin
      Q <= D;
    end
  end
endmodule

これをまずコンパイルします。
ターミナルで以下を実行します。

iverilog -o top.out -s top dff.v top.v

そうするとtop.outファイルが作成されます。

そしてtop.outファイルを実行します。

vvp -n top.out

そうするとtop.vファイル内の$dumpfileで指定されているtop.vcdファイルが作成されます。

このtop.vcdファイルを起動したGTKWaveウィンドウにドラックアンドドロップすると、
このように左上のSSTにtopが表示されるはずです。

このtopを選択すると、下のSignalsにtop内のwireとregが表示されるはずです。

このSignalsにある要素をダブルクリックすると右のWavesに追加されていきます。
追加しても波形が止まっているように見えますが、ズームアウトすると波形全体が見えるはずです。

SSTタブのtopの左の三角からその中の使われているモジュールの内部も見る事ができます。

これで開発がずいぶん楽になるはずです。

おわり