Icarus Verilogの使い方

LatticeのECCモジュールを題材として、Icarus Verilogの使い方を解説します。

材料

準備

  • rd1025.pdfを読んでください。大雑把に説明すると、rd1025_source_code.zipの中に「1bit化け訂正 2bit化け検出」のエンコーダ・デコーダのソースが含まれていて、それをシミュレーションできます。
  • rd1025_source_code.zipを展開してください。eccという名前のディレクトリが作られます。
  • Icarus Verilogでの作業用に、ivlという名前のディレクトリをeccと同一の階層に作成してください。
  • MSYSのプロンプトを開いて、カレントディレクトリをivlにしてください。以降の解説でのパス表記は、ivlがカレントディレクトリであることを前提にしています。

解説

  • rd1025_source_code.zipにはModelSim向けに用意されたスクリプトが入っているので、それを参考にしてIcarus Verilogによるシミュレーションができる状態に持っていきます。
  • ecc/simulation/ec/modelsim/rtl/run.tclを見ると、以下のことがわかります。
  1. インクルードディレクトリは~sourceであること(vlogの引数より)
  2. コンパイル対象は4つのVerilogソースファイルであること(vlogの引数より)
  3. 時間の分解能は1psであること(vsimの引数より)
  4. トップ階層のモジュール名はecc_tbであること(vsimの引数より)
  5. wave.doに信号波形を表示させるための記述がある

波形表示は後回しにするとして、ModelSimと同じことをIcarus Verilogでやろうとすると、

iverilog -I ../ecc/source -s ecc_tb -o ecc_tb.out \
../ecc/source/ecc_top.v ../ecc/source/ecc_encoder.v ../ecc/source/ecc_decoder.v ../ecc/testbench/ecc_tb.v
vvp -n ecc_tb.out
となります。iverilogコマンドの解説vvpコマンドも参考にしてください。

出力は以下のようになるはずです。Atom Z560 2.13Ghzを搭載したPCで、完了まで約38秒かかりました。

TESTING CAPABILITY TO DETECT AND CORRECT ONE BIT ERROR
TESTING CAPABILITY TO DETECT TWO BIT ERRORS
ALL TESTS COMPLETED SUCCESSFULLY

信号波形を見る方法

  • ModelSIMと違って、波形をファイル出力するためのVerilogモジュールを用意しないと、波形を見ることができません。

エディタで下記の内容のテキストファイルを作り、WAVEDUMP.vという名前で保存してください。$dumpvarsの第一引数は英字のオーでなく数字のゼロですので注意。

`timescale 1 ps / 1 ps
module WAVEDUMP;
    initial begin
        $dumpfile("ecc_tb.vcd");
        $dumpvars(0, ecc_tb);
    end
endmodule

そして、iverilogのオプションに-s WAVEDUMPWAVEDUMP.vを加えます。

iverilog -I ../ecc/source -s ecc_tb -s WAVEDUMP -o ecc_tb.out \
WAVEDUMP.v ../ecc/source/ecc_top.v ../ecc/source/ecc_encoder.v ../ecc/source/ecc_decoder.v ../ecc/testbench/ecc_tb.v
vvp -n ecc_tb.out
このときWAVEDUMP.vは、Verilogソースの羅列の最後尾ではなく一番最初に書いてください。 モジュールに`timescaleの指定が含まれていない場合iverilogは#1を1秒と解釈するので、`timescale指定を含むWAVEDUMP.vが一番最初にこないと、見づらい波形ファイルができてしまいます。

vvpを実行した結果としてecc_tb.vcdが出力されます。gtkwaveで波形を表示することができます。

gtkwave ecc_tb.vcd
ecc_tb_gtkwave.png