2020年7月26日日曜日

verilog : Icarus Verilog でのシミュレーション環境

目的:

Icarus Verilog でのシミュレーション環境を構築する。


背景:

  1. rtl, テストベンチ,コンパイル結果,波形ファイル等を同じディレクトリに混在させたくない。
  2. 異なる テストパターン でのシミュレーションを手軽に実行したい。
  3. シミュレーション時のコマンド入力を簡単にしたい。
これらの為、シミュレーション環境の整備を行う。尚、以下は、現時点での自環境の例を示す。

概要:

ディレクトリ構成


以下の様にディレクトリを分ける。
rtl         : 論理合成可能な RTL を格納する
testbench   : テストベンチ を格納する
testpattern : テストパターン を格納する。
log         : コンパイル,シミュレーション時の LOG を格納する。
sim_work    : コンパイル結果等の 中間ファイルを格納する。
wave        : シミュレーション結果の波形ファイルを格納する。

コンパイル, シミュレーション実行

Makefile を作成し、
make TESTNAME=test_1
の様に テストパターンを指定してコンパイル、シミュレーションを実行できる様にする。
コンパイル、シミュレーション時に実行 LOG を log ディレクトリ下に生成/移動する。

詳細:

ディレクトリ構成は、概要の通り。
サンプルの環境は こちら を参照。(rtl, testbench の内容についての説明は省略)
サンプルは パルス生成回路。
テストパターンは test_1. sv と test_2.sv
make TESTNAME=test_1
make TESTNAME=test_2
でそれぞれ異なるパルス出力 (output_pls) が発生。

尚、icarus verilog,  gtkwave のインストールは、
コンパイル/シミュレーション環境のインストール (WSL)
を参照。

テストベンチ構成

テストパターン(項目) に依存しない共通部分を testbench.sv に記述。
テストパターン(項目)毎の記述は、パターンごとにファイルを作成し、testpattern ディレクトリに格納する。
make 実行時に、実行するテストパターン(項目)のファイルを testbench ディレクトリにtp.sv のファイル名でコピーし、testbench.sv から include で 呼び出す。

Makefile 例

# ==============================================

TESTNAME = default

# -- SHELL setting -------------------------
SHELL=/bin/bash -o pipefail

# -- dir -----------------------------------
RTLDIR = ./rtl
TBDIR  = ./testbench
TPDIR  = ./testpattern
OUTDIR = ./sim_work
WAVE   = ./wave
LOG    = ./log

# -- rtl source ----------------------------
RTL  = $(RTLDIR)/plsgen.v
RTL += $(RTLDIR)/D_CNT.v

# -- testbench source ----------------------
TESTBENCH  = $(TBDIR)/testbench.sv

# -- compile option ------------------------
CMPOPT  = -g 2012
# CMPOPT += -v

# -- simulation option ---------------------
SIMOPT   = -l $(LOG)/simlog.log

# -- compile file name ---------------------
CMP_NAME = work

# -- wave file name ------------------------
VCD_NAME = wave.vcd

# -- Description ---------------------------
all : pre comp sim wav

pre :
ifeq ($(TESTNAME),default)
 echo >| $(TBDIR)/tp.sv
else
 cp $(TPDIR)/$(TESTNAME).sv $(TBDIR)/tp.sv
endif

comp :
 iverilog $(CMPOPT) -o $(OUTDIR)/$(CMP_NAME) $(TESTBENCH) $(RTL) 2>&1 | tee $(LOG)/comp.log

sim :
 vvp $(SIMOPT) $(OUTDIR)/$(CMP_NAME)
 mv $(VCD_NAME)  $(WAVE)/$(TESTNAME).vcd

wav :
 gtkwave $(WAVE)/$(TESTNAME).vcd

clean :
 rm -f $(LOG)/*
 rm -f $(OUTDIR)/*

Make file 内容
TESTNAME : テストパターンファイル名の拡張子と除いた部分。初期値として "defaule"を設定。
SHELL setting :Shell 設定。パイプ中でのエラーコードを返す様にする。
dir : 各ディレクトリ名を設定。
rtl source : ここに コンパイルする RTL を列挙する。
testbench source : ここに テストベンチ の RTL を列挙する。
compile option : コンパイルオプション (iverilog のオプション )を指定する。
simulation option : シミュレーションオプション (vvp のオプション)を指定する。
compile file name : コンパイル結果のファイル名。
wave file name : 波形ファイル名。(テストベンチに記述しているファイル名)
Description : make での 実行内容。

実行方法
make TESTNAME=<テストパターンファイル名(拡張子を除く)
で、テストパターンファイルに記述したテスト内容で コンパイル、シミュレーションし、gtkwave を起動する。
実行は、
  1. テストパターン ファイルを tp.sv のファイル名で testbench ディレクトリにコピーする。
    TESTNAME を指定しない場合( make のみで実行 ) は、空の tp.sv を作成する。
    (pre)
  2.  コンパイル (iverilog) を実行する。
    この時、出力を log 下にも ファイル(comp.log) として出力する。
  3. シミュレーション (vvp) を実行する。
    実行時の log を log 下に sim.log として出力する。
    結果 (波形ファイル wave.vcd) を wave ディレクトリ下に <テストパターン名>.vcd として移動する。
  4. gtkwave で <テストパターン名>.vcd を開く。
の順に行う。

0 件のコメント:

コメントを投稿