目的:
Icarus Verilog でのシミュレーション環境を構築する。背景:
- rtl, テストベンチ,コンパイル結果,波形ファイル等を同じディレクトリに混在させたくない。
- 異なる テストパターン でのシミュレーションを手軽に実行したい。
- シミュレーション時のコマンド入力を簡単にしたい。
概要:
ディレクトリ構成
以下の様にディレクトリを分ける。
rtl : 論理合成可能な RTL を格納する
testbench : テストベンチ を格納する
testpattern : テストパターン を格納する。
log : コンパイル,シミュレーション時の LOG を格納する。
sim_work : コンパイル結果等の 中間ファイルを格納する。
wave : シミュレーション結果の波形ファイルを格納する。
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 を起動する。
実行は、
- テストパターン ファイルを tp.sv のファイル名で testbench ディレクトリにコピーする。
TESTNAME を指定しない場合( make のみで実行 ) は、空の tp.sv を作成する。
(pre) - コンパイル (iverilog) を実行する。
この時、出力を log 下にも ファイル(comp.log) として出力する。 - シミュレーション (vvp) を実行する。
実行時の log を log 下に sim.log として出力する。
結果 (波形ファイル wave.vcd) を wave ディレクトリ下に <テストパターン名>.vcd として移動する。 - gtkwave で <テストパターン名>.vcd を開く。
0 件のコメント:
コメントを投稿