自作RISC-V CPUのシミュレーション環境を、VerilatorとVivado Simで立ち上げたが、やはりVerilatorが2値しか扱ってくれないのはデバッグがはかどらないし、そもそもGTKWaveが死ぬほど使いにくい。そしてVivado Simulatorでのシミュレーション環境を立ち上げたことによりなんとか4値でのシミュレーションができるようになったが、今度はVivado Simulatorの波形ビューアが死ぬほど見にくい。System VerilogのStructやInterfaceを使っていると、値がどういう意味なのかまるで追えなくなってしまうため、最終手段としてやはりModelSim Intel FPGA Starterのシミュレーション環境を立ち上げることにした。
しかしModelSim Intel FPGA Starterは32ビットバイナリとして配布されているので、WSLでの動作はできない(WSL2だとどうだか分からないが)。 そこで仕方なくCygwinの環境を立ち上げてModelSimを動作させることにした。Cygwinならば昔使っていたのでModelSimが動くことは分かっているし、何と言ってもVivado SimulatorとGTKWaveのゴミクズみたいなUIのビューアを使わなくても良い。
しかしその際どうしても諦めなめなければならないことがあり、例えばlibelfは64ビットバイナリしか配布されていないのでModelSimでのシミュレーションでは使えない。そしてDPI-C周りをテストすると原因不明のクラッシュでModelSimが全く動かなかったため、泣く泣くDPI-Cの使用を取りやめ、大幅に制約のある環境でシミュレーションをすることにした。全くどいつもこいつも...
という訳でModelSim(コマンドライン)を用いたRTLシミュレーション環境を構築する。基本的には以下のようなMakefileを作成してシミュレーションをする。
all: $(MAKE) vlib $(MAKE) vlog $(MAKE) vsim vlib: $(VLIB) work $(FILELIST): ../src/filelist.f filelist.f cat $^ > $@ vlog: $(FILELIST) $(VLOG) $(VLOG_OPTS) ../src/riscv64_pkg.sv $(shell cat $^) vsim: $(VSIM) -c work.tb -do "add wave * -recursive; run -all; archive write vsim.dbar -wlf vsim.wlf ; quit;" -l sim.log
コンパイルしてシミュレーションという大きな流れはVivado Simulatorと変わらない。波形をすべてダンプしたいので、シミュレーション前にadd wave * -recursive
としてすべての波形の記録を取るようにしている(ただしこれではMulti-Dimensionalな信号のダンプを取ることができず、これをどうやって取得すればいいのかオプションがまるで分らない)。
丸一日四苦八苦した結果、どうにかModelSimでもシミュレーションできるようになった。ただしModelSimを使うのは実装直後の波形デバッグの時のみで、リグレッションテストとかテストパタンを流すような場合にはやはりVerilatorとVivado Simulatorかな。DPI-Cが不安定なシミュレータとか実用性はゼロに近しいので。