FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LiteXによるSoC環境構築を試行する (5. 自作CPUのコンフィグレーション追加試行)

https://raw.githubusercontent.com/enjoy-digital/litex/master/doc/litex.png

LiteXは自分でSoC環境を構成することができるツール。自作CPUをSoCに組み込んでみたいので、今回はこれを試行してみる。

github.com

前回までの試行で、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