Icarus Verilog



 Icarus Verilogは、Stephen Williamsさんが開発しているVerilogシミュレータです。ソースはsourceforgeにあります。ソースからコンパイルするにはver8.*までは、gccは3.2が最適です。波形は、GTKwaveで表示します。LinuxWindowsMacOS Xでバイナリーのインストールパッケージが見つかります。Verilog記述の解析と編集には、Source Navigator for Verilogが便利です。テストの網羅性を調べるCoveredはVerilogのコードカバレッジユーティリティで、Verilogの設計ファイルと出力された結果のVCD/LXTダンプファイルを読み取り、カバレッジファイルを生成します。このファイルは他のカバレッジファイルをマージして一つにまとめたり、あるいはそのままでカバレッジを集計したASCII形式のレポートが作成できます。またカバレッジファイルの結果をGUIで見ることもできます。同じDUTでテストベンチが異なっている複数のカバレッジファイルでは比較してランク付けができます。Coveredのカバレッジ・メトリクスは次の通りで、信号線、トルグ、メモリ、組み合わせ論理、FSM状態と状態遷移、およびアサーションになります。CoveredをGUIで使う為の起動コマンドは、 covered report -view です。他のコマンドの使い方は ここ にあります。論理合成をするオープンソースソフトウェアには、開発途中Yosys見つかります

 Icarus Verilogが実行できるか確かめるために4ビットカウンターを例にして説明します。1ビットカウンターを4個並べた構成にして記述しています。




module cnt_bit (CK, RES, EN, Q, CU);
   input   CK, RES, EN;
   output Q, CU;
   reg      Q;

always @(posedge CK or posedge RES) begin if (RES) Q <= 1'b0; else if (EN) Q <= ~Q; end
assign CU = EN & Q;
endmodule
module counter_hex (clk, res, q); input clk, res; output [3:0] q; wire [3:0] cu; cnt_bit cb0 (clk, res, 1'b1, q[0], cu[0]); cnt_bit cb1 (clk, res, cu[0], q[1], cu[1]); cnt_bit cb2 (clk, res, cu[1], q[2], cu[2]); cnt_bit cb3 (clk, res, cu[2], q[3], cu[3]); endmodule

これは回路モジュールなのでファイル名は何でもいいのですが counter_ins.vとします。(拡張子は、.vです。) 次にシュミレーションする為のテストベンチを作成します。GTKwaveで波形表示するためのダンプファイル(*.vcd)を作成する記述もしておきます。


`timescale 1ns/1ns

module top; reg clk, res; wire [3:0] q;
parameter STEP = 100; always #(STEP/2) clk = ~clk;
counter_hex counter_hex_i (clk, res, q);
initial begin #0 res = 0; clk = 0; #STEP res = 1; #STEP res = 0; #(STEP*20) $finish; end
$dumpfile ("counter.vcd"); //GTKwaveで波形表示する為の記述 $dumpvars(0, top); //GTKwaveで波形表示する為の記述
initial $monitor ($stime, "res=%b clk=%b Q=%h",res, clk, q);
endmodule

このファイル名はcounter_tb.vとします。
ではiverilogを走らせてみましょう。次のコマンドを入力してコンパイルします。


 iverilog -o counter counter_tb.v counter_ins.v

コンパイル後、次のコマンドを入力して実行します。


vvp counter

すると以下の表示がされます。

  0    res=0 clk=0 q=x
  50   res=0 clk=1 q=x
  100  res=1 clk=0 q=0
  150  res=1 clk=1 q=0
  200  res=0 clk=0 q=0
  250  res=0 clk=1 q=1
  300  res=0 clk=0 q=1
  350  res=0 clk=1 q=2
  400  res=0 clk=0 q=2
  ・・・・・

  ・・・・・
  1700 res=0 clk=0 q=f
  1750 res=0 clk=1 q=0
  ・・・・・
  2100 res=0 clk=0 q=3
  2150 res=0 clk=1 q=4
この時、counter.vcdのファイルも出来上がっているのでGTKwaveで表示させます。次のコマンドを入力して下さい。


gtkwave counter.vcd

ウインドウが開きます。SearchメニューのSignal Search Treeボタンをクリックして表示したいトレース波形を選んで下さい。一例ですが、下のような表示がされます。



試しにCoveredを見てみます。次のコマンドを入力して下さい。


covered score -t top -v counter_tb.v -v counter_ins.v -vcd counter.vcd

カバレッジファイル cov.cdd が出来ます。次に


covered report -d v -m ltcfram -o coverage.rpt cov.cdd

と入力して下さい。カバレッジレポート coverage.rpt が出来上がります。