これまで基本的に自作CPUのシミュレーションはVerilatorを使っていた。これには理由がある。 - ある程度の規模のデザインならばコンパイル時間も気にならない。 - SpikeとのDPI接続などの機能が豊富 - かなり攻めたSystemVerilogの構文もサポートしている
しかし最初の項目「デザインのコンパイル時間」が耐えきれないレベルになってきた。 シミュレーションする対象の規模がかなり大きくなってきており、1回のコンパイルで30分以上かかるようになっている。
さすがにまずいのでVivado Simulatorの検討を始めた。
しかしVivado Simulatorの方もかなり問題があり、
- WDBという意味不明な波形フォーマットをサポートしているビューアがVivado Simulatorしかない(FSTに対応してほしい)
- Vivado Simulatorの波形ビューアがかなりイマイチ
一応Vivado SimulatorにSpikeとのステップ実行も併せてVerilatorの環境をそのまま移行できた。DPI-Cの取り扱いについてはXSCコマンドを使ってどうにかする。
XSC_ARGS += -mt off
=# XSC_ARGS += -v 1
XSC_ARGS += -compile
XSC_ARGS += --cppversion 14
XSC_ARGS += $(CPP_FILELIST)
XSC_ARGS += -gcc_link_options "-L/usr/lib64 -lelf $(addprefix -I, $(INC_DIR))"
XSC_ARGS += $(addprefix -gcc_compile_options "-I, $(addsuffix ", $(INC_DIR)))
XSC_ARGS += $(addprefix -gcc_compile_options "-D, $(addsuffix ", $(DEFINE)))
XSC2_ARGS += -mt off
=# XSC2_ARGS += -v 1
XSC2_ARGS += -compile
XSC2_ARGS += --cppversion 14
XSC2_ARGS += $(ELF_LOADER)
XSC2_ARGS += -gcc_link_options "-L/usr/lib64 -lelf $(addprefix -I, $(INC_DIR))"
XSC2_ARGS += $(addprefix -gcc_compile_options "-I, $(addsuffix ", $(INC2_DIR)))
XSC2_ARGS += $(addprefix -gcc_compile_options "-D, $(addsuffix ", $(DEFINE)))
XSC_LINK_ARGS += -shared
XSC_LINK_ARGS += -gcc_link_options "-L/usr/lib64 $(addprefix -L, $(INC_DIR)) -lelf -lriscv -lsoftfloat -ldisasm -lfesvr -lfdt -ldl -lpthread $(addprefix -I, $(INC_DIR))"
=# XSC_LINK_ARGS += -v 1
sim_vivado: $(DECODE_FILES) $(FILELIST)
$(XSC) $(XSC2_ARGS) | tee sim.log
$(XSC) $(XSC_ARGS) | tee -a sim.log
$(XSC) $(XSC_LINK_ARGS) | tee -a sim.log
$(XVLOG) $(XVLOG_ARGS) ../src/riscv64_pkg.sv ../src/msrh_standard_conf_pkg.sv -f $(FILELIST) $(FILE_TEST) $(FILE_SRC) | tee -a sim.log
$(XELAB) $(XELAB_ARGS) tb | tee -a sim.log
DUMP_TYPE=$(DUMP) $(XSIM) $(XSIM_ARGS) "work.tb" | tee -a sim.log
XSCでSpike付きのライブラリをコンパイルできるようになるまで苦労したが、どうにか動くようになった。 ただしVivado波形データを見るのは相変わらずつらいなあ...

VCDも一応出力できるけど、VerilatorのFSTの階層と比べるとかなり使いずらい。これは使い続けるかどうか、迷うなあ...