はじめに
この文書ではIcarus Verilogのインストール方法と,簡単な使い方について述べています.Icarus Verilogは無料のVerilogコンパイラですが,その中にシミュレータが含まれています.今回はこのシミュレータのみを使用します.参考にしたのはこちらのページです.
Icarusのダウンロード
こちらにあるサイトがIcarusの公式となります.下の図はこの原稿を書いている2023年10月時点のものです.最新版はV12ですのでこちらをダウンロードしてください.
Icarusのインストール
ダウンロードしたファイルを実行するとインストールが開始されます.最初にユーザーアカウント制御(UAC)が下のように働きますので,「はい」を選択してください.
次にライセンスの許諾を求められますので,I accept the agreementを選択し,「Next」を選択してください.
次に情報が現れます.要するに,インストールするフォルダまでのパスにスペースが無いようにして下さい,ということのようです.念のため,スペース以外にも漢字やひらがななども避けておいた方が無難です.
インストール先を選びます.デフォルトのままでよいと思いますので,「Next」を押してください.
必要なコンポーネントを選択します.すべて選択後,「Next」を押してください.
スタートメニューフォルダに何と表示するかを聞かれています.デフォルトのままでよいです.「Next」を押してください.
パスを通しておきたいため,下図のようにAdd executable folder(s) to the user PATHにチェックを入れて「Next」を押してください.
インストールの最終確認です.「Install」を押してください.
インストールが終わると下のようになります.
簡単な使い方
Icarus verilogはVerilogコードをコンパイルすることもできますが,ここではあくまでシミュレーションの機能のみを使うこととします.まずはVerilogコードを書きます.今回のコードは10進カウンタです.下のコードはVerilogのコードです.それに続くのがテストベンチです.
`timescale 1ns / 1ps module DecimalCounter(iClk, oCnt); input iClk; output [3:0] oCnt; reg [3:0] oCnt = 4'b1001; always @(posedge iClk) begin if(oCnt == 4'b1001) oCnt <= 4'b0000; else oCnt <= oCnt + 4'b0001; end endmodule
`timescale 1ns / 1ps module t_DecimalCounter; reg iClk; wire [3:0] oCnt; DecimalCounter uut ( .iClk(iClk), .oCnt(oCnt) ); integer i; initial begin $dumpfile("t_DecimalCounter.vcd"); $dumpvars(1, t_DecimalCounter); iClk = 0; #100; for(i=0; i<30; i=i+1) #10 iClk = ~iClk; end endmodule
上記のコードとテストベンチがあるディレクトリをコマンドプロンプトで移動します.下の図はその様子を表しています.
続いてこれらのファイルからシミュレーション結果をグラフィカルに表示することを行います.下に示す3行のコマンドを実行してください.
iverilog -o DecimalCounter t_DecimalCounter.v DecimalCounter.v vvp DecimalCounter gtkwave t_DecimalCounter.vcd
うまくいくと下の図の様なアプリケーション(GTKWave)が立ち上がります.SSTにはt_DecimalCounterとなっていますのでここをクリックしてください.
次に画面左下には3つの信号が現れます.ここではreg iClkとwire oCnt[3:0]をダブルクリックしてください.そうすると画面中央付近にあるSignalsとWavesにそれらの信号が表示されます.ただし,そのままだと信号の変化がわかりづらいです.これはズームインしすぎているためです.そこで,画面左上にある表示するズームをフィットさせるZoom Fitを押します.その結果,下の図のように信号がすべてみられるようになります.
さらにSignalsにあるoCntのような,複数の信号から成り立つたびっと信号については,ダブルクリックするとその中を展開してくれます.下の図はその様子を示しています.
このようにすることでシミュレーションをすることができます.