LiteXは自分でSoC環境を構成することができるツール。自作CPUをSoCに組み込んでみたいので、今回はこれを試行してみる。
前回までの試行で、Verilatorを起動することはできたが、いくつかの環境整備ができていない。defineの挿入ができずコンパイルが失敗していたのだった。
いろいろ調査すると、そもそもLiteXの環境ではdefineを直接操作するのが難しそうだ。
以下のコマンドには、defineを挿入するオプションが入っていない。
- litex_scariv/litex/litex/build/sim/core/Makefile
.PHONY: sim
sim: $(OBJS_SIM) | mkdir
verilator -Wno-fatal -O3 $(CC_SRCS) --top-module sim --exe \
-DPRINTF_COND=0 \
$(SRCS_SIM_CPP) $(OBJS_SIM) \
--top-module sim \
$(if $(THREADS), --threads $(THREADS),) \
-CFLAGS "$(CFLAGS) -I$(SRC_DIR)" \
-LDFLAGS "$(LDFLAGS)" \
--trace \
$(if $(TRACE_FST), --trace-fst,) \
$(if $(COVERAGE), --coverage,) \
--unroll-count 256 \
--output-split 5000 \
--output-split-cfuncs 500 \
--output-split-ctrace 500 \
$(INC_DIR) \
-Wno-BLKANDNBLK \
-Wno-WIDTH \
-Wno-COMBDLY \
-Wno-CASEINCOMPLETE \
--relative-includes
make -j$(JOBS) -C $(OBJ_DIR) -f Vsim.mk Vsim
したがって、以下のようなdefineを挿入するためだけのファイルを作成してみる。
- ../pythondata-cpu-scariv/pythondata_cpu_scariv/system_verilog/src/litex_defines.svh
define RV64
# Add Verilog sources.
# TODO: use Flist.cv64a6_imafdc_sv39 and Flist.cv32a6_imac_sv0 instead
+ basedir = get_data_mod("cpu", "scariv").data_location
+ platform.add_source(os.path.join(basedir, "src", "litex_defines.svh"))
+ platform.add_source(os.path.join(basedir, "src", "riscv_common_pkg.sv"))
+ platform.add_source(os.path.join(basedir, "src", "riscv_fpu_imafdc_pkg.sv"))
+ platform.add_source(os.path.join(basedir, "src", "riscv64_pkg.sv"))
+ platform.add_source(os.path.join(basedir, "src", "scariv_standard_conf_pkg.sv"))
これで再度コンパイルを実行してみる。そうするとVerilatorのコンパイルまでは進んだのだが、メモリの使い過ぎで落ちてしまった。少し調整が必要だな。
これは、Verilatorの以下のオプションを外すことで回避できるらしい。要するにメモリの使い過ぎだ。
diff --git a/litex/build/sim/core/Makefile b/litex/build/sim/core/Makefile index e662f27f..a1ce368b 100644 --- a/litex/build/sim/core/Makefile +++ b/litex/build/sim/core/Makefile @@ -45,17 +45,19 @@ sim: $(OBJS_SIM) | mkdir --trace \ $(if $(TRACE_FST), --trace-fst,) \ $(if $(COVERAGE), --coverage,) \ - --unroll-count 256 \ - --output-split 5000 \ - --output-split-cfuncs 500 \ - --output-split-ctrace 500 \ $(INC_DIR) \ -Wno-BLKANDNBLK \ -Wno-WIDTH \ -Wno-COMBDLY \ -Wno-CASEINCOMPLETE \ --relative-includes - make -j$(JOBS) -C $(OBJ_DIR) -f Vsim.mk Vsim + make -j16 -C $(OBJ_DIR) -f Vsim.mk Vsim
