これまで基本的に自作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の階層と比べるとかなり使いずらい。これは使い続けるかどうか、迷うなあ...