Skip to content

difftest支持elf文件加载

Zhicheng edited this page Oct 12, 2023 · 11 revisions

1. 通过xs-env搭建环境。

参考 https://github.com/OpenXiangShan/xs-env/tree/master

用NanhuV3替换Xiangshan

cd xs-env
rm -rf XiangShan
git clone https://github.com/Siudya/Nanhu-V3.git
mv Nanhu-V3 XiangShan

:先根据xs-env配置,保证能正常编译emu后,再进行后继步骤。

2. 替换并编译NEMU(elf)

cd xs-env
. env.sh
rm -rf NEMU
git clone https://github.com/yaozhicheng/NEMU.git
cd NEMU
make riscv64-xs-ref_defconfig  # 目前只有这个配置能用
make menuconfig                # 进入 Memory Configuration  ---> 开启 Use sparse memory model
make                           # 编译生成 build/riscv64-nemu-interpreter-so

如果出现 softfloat.a 连接错误,进入 resource/softfloat/repo/build/Linux-x86_64-GCC/ 编辑 Makefile,在COMPILE_C中添加 -fPIC:

cd resource/softfloat/repo/build/Linux-x86_64-GCC/
vim Makefile

...
COMPILE_C = \
  gcc -c -Werror-implicit-function-declaration -fPIC -DSOFTFLOAT_FAST_INT64 \
    $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@
...

然后make clean && make重新编译 softfloat.a

3. 替换difftest并编译

cd xs-env
cd XiangShan
rm -rf difftest
git clone -b SpMem https://github.com/yaozhicheng/difftest.git # 采用 SpMem分支
make emu EMU_THREADS=8 CONFIG_USE_SPARSEMM=1 -j20              # CONFIG_USE_SPARSEMM=1 开启 elf支持

4. 运行elf文件

./build/emu -b 0 -e 0 -i ./ready-to-run/amtest-riscv64-xs.elf --diff ../NEMU/build/riscv64-nemu-interpreter-so

:请提前确定对应的elf文件存在

5. 用spike作为参考模型

下载修改后的 spike 并进行编译

cd xs-env
git clone https://github.com/yaozhicheng/riscv-isa-sim.git
cd riscv-isa-sim/difftest
make CONFIG_USE_SPARSEMM=1         # 使用参数 CONFIG_USE_SPARSEMM=1 开启 sparse ram
ls build/riscv64-spike-so          # 查看编译结果

在difftest侧,需要启用 CONFIG_USE_SPARSEMM=1 和 REF=spike,开启sparse ram 和spike接口

cd xs-env
cd XiangShan
rm build/emu* -rf
make emu EMU_THREADS=8 REF=spike CONFIG_USE_SPARSEMM=1 -j20

编译完成执行测试(请提前确定对应的elf文件存在)

./build/emu -b 0 -e 0 -i ./ready-to-run/amtest-riscv64-xs.elf --diff ../riscv-isa-sim/difftest/build/riscv64-spike-so

6.最新版本spike支持

如果需要使用最新版本spike,请使用以下仓库

git clone -b nanhu-v3 https://github.com/Siudya/riscv-isa-sim.git      # 采用nanhu-v3分支的spike
git clone -b nanhu-v3 https://github.com/Siudya/difftest.git           # 采用nanhu-v3分支的difftest 

对于该版本difftest,编译时需要指定DIFF_PROXY, DIFF_PROXY=SpikeProxy (默认) 或者 DIFF_PROXY=NemuProxy

7. 硬编码

cat /NEMU/include/common.h
cat /config/config.h

...
#ifndef CONFIG_USE_SPARSEMM
#define CONFIG_USE_SPARSEMM 1
#endif
...

: spike和nemu在现实上不一致,所以diff时会出现不一致的地方。例如csr寄存器的默认值等。