Verilog HDLの勉強をしていて思ったことは、Icarus Verilogを用いてシミュレーションを実行し、結果の波形をGTKWaveで表示するまでに実行するコマンドの数が多く、煩雑であるということです。そこで1コマンドでシミュレーション波形の表示まで行ってくれるverisimu
コマンド1を実現させたいと思います。
検証環境
検証環境は以下の通りです。今回はMacで検証していますが、コマンドを少し書き換えるだけで、Linuxでも利用できます。
- macOS 11.4 Big Sur
- Icarus Verilog 11.0
- GTKWave 3.3.107
- XQuartz 2.8.1
シミュレーション波形を出すまでの行程
Icarus VerilogとGTKWaveを用いてシミュレーション波形を出すまでには以下の行程を順に実行します。
回路本体とテストベンチから実行ファイルを生成
Icarus Verilogに回路本体とテストベンチのソースを渡すと実行ファイル(a.out)が生成されます。
iverilog source.v source_test.v
波形ファイルの生成
GTKWaveで表示するシミュレーション波形はvcd
形式のファイルです。vvpコマンドに先程生成した実行ファイルを渡します。
vvp a.out
GTKWaveで波形を表示
最後にGTKWaveで波形を表示させます。Macの場合は以下の様に呼び出します。
open /Application/gtkwave.app source.vcd
Linuxの場合は以下のコマンドを実行します。
gtkwave source.vcd
verisimuコマンドの作成
これで波形が表示出来ます。しかし、これを毎回実行するのは煩雑です。Makefileを書くのも手ですが、ソースが増える毎にMakefileを書くのも面倒です。そこで、bashの自作関数を.bashrc
に記載し、コマンドライクに使える様にしたいと思います。verisimu
コマンドと呼んでいますが、実体はbashの関数です。
function verisimu() {
IFS=' '
filename=$1
testname=$2
iverilog ${filename} ${testname}
vvp a.out
list=(${filename//./' '})
vcdname=${list[0]}
open /Applications/gtkwave.app ${vcdname}.vcd
}
使い方としては、以下の様に実行します。
verisimu source.v source_test.v
関数内で、第一引数をソースファイル名、第二引数をテストベンチファイル名として変数に代入し、先述のコマンドに順に渡しているだけです。これで、煩雑な行程を実行せずに済みます。
Reference
-
実施にはコマンドでは無く、bashで自作関数を作って、それをコマンドライクに利用するという算段です。 ↩