使用Spike 进行RISCV程序仿真
1. 安装RISCV Toolchain
git克隆项目
git clone --recursive https://github.com/2212047152/riscv-gnu-toolchain.git
安装依赖
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev
编译配置
# 加上--enable-multilib使用指令集组合
# --prefix指定安装地址
./configure --prefix=/opt/riscv --enable-multilib
编译(时间很长,建议多开核和线程)
若安装位置须管理员,加入sudo
sudo make -j32
编辑环境变量
编辑后注销登录或使用source ~/.bashrc
# file:~/.bashrc
# spike 和 pk 编译使用
export RISCV=/opt/riscv
# toolchain 变量
export PATH="$PATH:/opt/riscv/bin"
# 后续pk变量提前设置
export PATH="$PATH:/opt/pk/riscv32-unknown-elf/bin"
验证
riscv64-unknown-elf-gcc
2. 安装RISCV ISA Sim Spike
git克隆项目
git clone --recursive https://github.com/2212047152/riscv-isa-sim.git
预配置,编译,安装
不需要配置32/64或ABI
../configure --prefix=$RISCV
make -j32
sudo make install
3. 安装RISCV PK
git克隆项目
git clone --recursive https://github.com/2212047152/riscv-pk.git
预配置,编译,安装
需要指定ISA和ABI,必须和编译程序的ISA和ABI一致,否则会抛出异常或卡住无输出
../configure --prefix=/opt/pk --host=riscv64-unknown-elf --with-arch=rv32imac_zicsr_zifencei --with-abi=ilp32
make -j32
sudo make install
验证
由于步骤1配置了PATH,因此可以直接验证
pk
4. 测试
编写测试程序(只采用I指令集)
// file:hello.c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
int main ()
{
double x, ret, val;
x = 45.0;
val = PI / 180;
ret = sin(x*val);
printf("%lf 的正弦是 %lf 度\n", x, ret);
return(0);
}
编写Makefile
编译必须加-g
,否则反汇编没有原文,spike也无法运行
编译加入-lm
目的是为了使用math.h
all:
riscv64-unknown-elf-gcc -march=rv32i -mabi=ilp32 -g hello.c -o hello -lm
riscv64-unknown-elf-objdump -d -S hello > hello.dasm
编译
make
5. 验证
必须保证pk build / gcc make / spike sim时的ISA和ABI一致
spike --isa=RV32I $(which pk) ./hello