FPGA開発日記

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

RISC-V Bit-Manipulation命令を自作RISC-Vシミュレータに実装解説 (2. 命令のツールセットをビルド)

RISC-V Bit-Manipulationの環境については、GitHubでツールセットやテストパタンが公開されている。ここには、Imperasのシミュレータ、コンプライアンステスト、ツールセット、Verilogモデルなどが含まれている。自作RISC-Vシミュレータに実装するにあたりこれらのツールセットが必要になるので、さっそく準備を整えていこう。

github.com

ダウンロードしてビルドする。この時、インストールディレクトリはデフォルトで/opt/riscv64b/となっている。これは面倒なので変更して${HOME}/riscv64b/に変更してしまおう。

git clone git@github.com:riscv/riscv-bitmanip.git
cd riscv-bitmanip
sed -i 's|/opt/riscv64b|${HOME}/riscv64b|g' `find . -name "*.sh"`
mkdir ${HOME}/riscv64b

ツールセットのコンパイルには、以下のように入力する。

bash ./build-all.sh

GCCのダウンロードとコンパイルが必要だ。1時間くらいでコンパイルが完了した。テストを実行してみよう。

$ cd test
$ bash ./run.sh

以下のようになった。特に問題はなさそうだ。

+ gcc -o testgen -Wall -O1 -I../cproofs testgen.cc
+ ./testgen
+ /home/msyksphinz/riscv64b/bin/riscv64-unknown-elf-gcc -Wall -march=rv64gb -Os -o tests tests.c
+ /home/msyksphinz/riscv64b/bin/spike --isa=RV64GCB pk tests
bbl loader
test_zbb  0x90f45e4e OK
test_zbs  0xe4fa9ed0 OK
test_zbp  0xbf7dc8c4 OK
test_zbe  0xad938c6a OK
test_zbc  0xcdef75a4 OK
test_zbr  0x31fc780f OK
test_zbm  0x355a32a3 OK
test_zbt  0xcef7df02 OK
test_zbf  0x3fa35b76 OK
test_stdc 0x5a983d30 OK
ALL TESTS PASSED.

次に、asmtestsのテストを動かしてみる。このためにGCCの実行バイナリの場所を変える必要があった。

diff --git a/asmtests/extB/Makefile b/asmtests/extB/Makefile
index 2dee07c..c9894f9 100644
--- a/asmtests/extB/Makefile
+++ b/asmtests/extB/Makefile
@@ -1,6 +1,6 @@
 # include Cross Compiler settings for RISCV

-RISCV_PREFIX  ?= riscv-none-embed-
+RISCV_PREFIX  ?= ${HOME}/riscv64b/bin/riscv64-unknown-elf-
 RISCV_CC      ?= $(RISCV_PREFIX)gcc
 RISCV_OBJDUMP ?= $(RISCV_PREFIX)objdump

これでテストを実行する。

make runtests
$ make runtest
make -C asmtests/auto
make[1]: Entering directory '/home/msyksphinz/work/riscv/riscv-bitmanip/asmtests/auto'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/home/msyksphinz/work/riscv/riscv-bitmanip/asmtests/auto'
make -C asmtests
make[1]: Entering directory '/home/msyksphinz/work/riscv/riscv-bitmanip/asmtests'
make -C extB all
make[2]: Entering directory '/home/msyksphinz/work/riscv/riscv-bitmanip/asmtests/extB'
mkdir -p object/clz
cat ../common/log.S clz/test.S > object/clz/concat.S
/home/msyksphinz/riscv64b/bin/riscv64-unknown-elf-gcc -mabi=ilp32 -march=rv32im -Wl,-Ttext=0x80000000 -nostartfiles -DXLEN32 -o object/clz/test.32.elf object/clz/concat.S -I../common -I../../Imperas/ImperasLib/source/riscv.ovpworld.org/intercept/extB/1.0/model
/home/msyksphinz/riscv64b/bin/riscv64-unknown-elf-objdump -D object/clz/test.32.elf > object/clz/test.32.elf.32.objdump
mkdir -p object/bdep
cat ../common/log.S bdep/test.S > object/bdep/concat.S
...
../riscv-ovpsim/bin/Linux64/riscvOVPsim.exe --customcontrol --override riscvOVPsim/cpu/simulateexceptions=T --override riscvOVPsim/cpu/defaultsemihost=F --override riscvOVPsim/cpu/user_version=2.3 --override riscvOVPsim/cpu/priv_version=1.11 --override riscvOVPsim/cpu/add_Extensions=B --variant RV64GC --program extB/object/bext/test.64.elf --logfile extB/object/bext/test.64.log.tmp >/dev/null
../riscv-ovpsim/bin/Linux64/riscvOVPsim.exe --customcontrol --override riscvOVPsim/cpu/simulateexceptions=T --override riscvOVPsim/cpu/defaultsemihost=F --override riscvOVPsim/cpu/user_version=2.3 --override riscvOVPsim/cpu/priv_version=1.11 --override riscvOVPsim/cpu/add_Extensions=B --variant RV64GC --program extB/object/ctz/test.64.elf --logfile extB/object/ctz/test.64.log.tmp >/dev/null
make[2]: Leaving directory '/home/msyksphinz/work/riscv/riscv-bitmanip/asmtests'
make verify
make[2]: Entering directory '/home/msyksphinz/work/riscv/riscv-bitmanip/asmtests'
Test Passed Bit autoasm
Test Passed Bit bdep
Test Passed Bit bext
Test Passed Bit clz
Test Passed Bit ctz
Test Passed Bit pcnt
Summary: All Tests Passed
make[2]: Leaving directory '/home/msyksphinz/work/riscv/riscv-bitmanip/asmtests'
make[1]: Leaving directory '/home/msyksphinz/work/riscv/riscv-bitmanip/asmtests'

上手く環境構築が完了したようだ。