FPGA開発日記

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

LiteXのBIOSソフトウェアを独自に構築する方法調査

LiteXのBIOS立ち上げ環境を、独自のRTLシミュレーション環境に移植したくて、メモしておく。

基本的に、LiteXをダウンロードしたときに登場するlitex/litex/soc/software/を丸ごと別ディレクトリに移動することになる。 さらに、ライブラリを作成するの、pythondata-software-picolibcpythondata-software-compiler_rtもコピーしておく。

LiteXのCPU環境構築用に作った、以下のファイルもすべて移動しておく。

boot-helper.S
crt0.S
csr-defs.h
irq.h
system.h

基本的にはsoftwareディレクトリでvariables.makをいじって、例えばリポジトリ管理をしているならばそこの絶対パスに置き換えるような処置をしておけばOK。これで、各ソフトウェアを順番にビルドしていけばよい。

REPO_BASE_DIR=$(shell git rev-parse --show-superproject-working-tree --show-toplevel | head -1)

PACKAGES=libc libcompiler_rt libbase libfatfs liblitespi liblitedram libliteeth liblitesdcard liblitesata bios
PACKAGE_DIRS=$(REPO_BASE_DIR)/tests/litex_soc/software/libc $(REPO_BASE_DIR)/tests/litex_soc/software/libcompiler_rt $(REPO_BASE_DIR)/tests/litex_soc/software/libbase $(REPO_BASE_DIR)/tests/litex_soc/software/libfatfs $(REPO_BASE_DIR)/tests/litex_soc/software/liblitespi $(REPO_BASE_DIR)/tests/litex_soc/software/liblitedram $(REPO_BASE_DIR)/tests/litex_soc/software/libliteeth $(REPO_BASE_DIR)/tests/litex_soc/software/liblitesdcard $(REPO_BASE_DIR)/tests/litex_soc/software/liblitesata $(REPO_BASE_DIR)/tests/litex_soc/software/bios
LIBS=libc libcompiler_rt libbase libfatfs liblitespi liblitedram libliteeth liblitesdcard liblitesata
TRIPLE=riscv64-unknown-elf
CPU=mycpu
CPUFAMILY=riscv
CPUFLAGS=-march=rv64i2p0_m     -mabi=lp64 -D__mycpu__
CPUENDIANNESS=little
CLANG=0
CPU_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/mycpu
SOC_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/
PICOLIBC_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/pythondata_software_picolibc/data
PICOLIBC_FORMAT=integer
COMPILER_RT_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/pythondata_software_compiler_rt/data
export BUILDINC_DIRECTORY
BUILDINC_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/include
LIBC_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/libc
LIBCOMPILER_RT_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/libcompiler_rt
LIBBASE_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/libbase
LIBFATFS_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/libfatfs
LIBLITESPI_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/liblitespi
LIBLITEDRAM_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/liblitedram
LIBLITEETH_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/libliteeth
LIBLITESDCARD_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/liblitesdcard
LIBLITESATA_DIRECTORY=$(REPO_BASE_DIR)/tests/litex_soc/software/liblitesata
BIOS_DIRECTORY=$(abspath $(REPO_BASE_DIR)/tests/litex_soc/software/bios)
LTO=0
BIOS_CONSOLE_FULL=1

このようなMakefileを作成して、一気通貫でビルドができるようにしておく。

all:
        $(MAKE) -C libbase
#       $(MAKE) -C libc
        $(MAKE) -C libcompiler_rt
        $(MAKE) -C libfatfs
        $(MAKE) -C liblitedram
        $(MAKE) -C libliteeth
        $(MAKE) -C liblitesata
        $(MAKE) -C liblitesdcard
        $(MAKE) -C liblitespi
        $(MAKE) -C bios

clean:
        $(MAKE) clean -C libbase
#       $(MAKE) clean -C libc
        $(MAKE) clean -C libcompiler_rt
        $(MAKE) clean -C libfatfs
        $(MAKE) clean -C liblitedram
        $(MAKE) clean -C libliteeth
        $(MAKE) clean -C liblitesata
        $(MAKE) clean -C liblitesdcard
        $(MAKE) clean -C liblitespi
        $(MAKE) clean -C bios

で、作成されたbios.elfを流してみればよいのだが、Spikeではデフォルトで動作しない。これはなんでだっけ?dtsの書き換えとか必要だったっけ。

spike -l  -m0x0:0x1000 ../tests/litex_soc/software/bios/bios.elf
Access exception occurred while loading payload ../tests/litex_soc/software/bios/bios.elf:
Memory address 0x0 is invalid