ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Spike RISC-V 模拟器上手:5 分钟一次跑通参考实现

Spike RISC-V 模拟器上手:5 分钟一次跑通参考实现

Spike RISC-V 模拟器上手:5 分钟一次跑通参考实现

【免费下载链接】riscv-isa-simSpike, a RISC-V ISA Simulator项目地址: https://gitcode.com/GitHub_Trending/ri/riscv-isa-sim

Spike(riscv-isa-sim)是 RISC-V 指令集的官方参考实现,用 C++ 对一颗或多颗 RISC-V 处理器核(hart)做精确的功能级模拟,覆盖 M、A、F、D、C、V 等主流扩展。它的定位是给架构学习者和指令集开发者提供一块"可运行的白板":装好之后,任何 RISC-V 程序都能在本地模拟执行,寄存器、内存、特权级状态随时可查。

动手前先把环境查一遍

下面这一项项对照着装,比编译报错后再回头补依赖省事得多。

项目说明
操作系统Linux 为主,macOS / WSL 也可以
构建工具gcc/g++、GNU make、autoconf、automake
device-tree-compiler生成设备树用,Debian/Ubuntu 包名device-tree-compiler,Fedora 用yum install dtc
Boost 头文件libboost-regex-dev、libboost-system-dev;不做交互式调试的 socket I/O 可以跳过
RISC-V 工具链riscv64-unknown-elf-gcc(编译示例程序用),以及riscv-pk(Spike 下的代理内核)
磁盘 / 网络约 500 MB 空闲空间,能正常访问源码仓库

拉代码、编译、装好、配 PATH 一条线走完

把下面整段按顺序敲完即可,中间不需要切换思路:

export RISCV=/opt/riscv # 想装到哪就改成哪 git clone https://gitcode.com/GitHub_Trending/ri/riscv-isa-sim cd riscv-isa-sim mkdir build && cd build ../configure --prefix=$RISCV make -j$(nproc) sudo make install export PATH=$RISCV/bin:$PATH

两步小提醒:

  1. 全程在build/目录里做配置和编译,不要把configure直接跑在源码根目录,源码树保持干净,后面想换--prefix重配也方便。
  2. 最后一行建议顺手写进~/.bashrc,新开终端时spike才不会"消失"。

仓库里几个关键目录各管什么

编译产物之外,目录结构本身就是一张地图,后面找代码时按这张表翻就行:

路径职责
riscv/模拟器核心:processor.cc管单核状态,sim.cc管多核主循环,mmu.cc管访存与地址翻译
riscv/insns/每条指令一个.h文件,写它的功能行为,是加自定义指令的主要落点
spike_main/spike可执行程序的入口与命令行解析
fesvr/前端服务器(Front-End Server),承接系统调用、终端 I/O、HTIF 设备
fdt/设备树解析与生成,决定启动时模拟出哪些外设
disasm/反汇编器,spike-dasm工具也出自这里

敲一个最小例子:跑通一个 hello 程序

先建一个hello.c:

#include <stdio.h> int main() { printf("hi from spike\n"); return 0; }

然后编译、上模拟器:

riscv64-unknown-elf-gcc -o hello hello.c spike pk hello

终端里看到hi from spike就说明整条链路通了:Spike 加载pk(代理内核),内核再加载并运行你的 ELF。这里刻意选 C 而不是手写汇编——示例越短,越容易确认问题出在哪一环。

三个常见卡点,按现象对号入座

现象原因解法
configure报dtc: command not found或设备树相关错误没装device-tree-compilerapt-get install device-tree-compiler(Fedora 系yum install dtc)
编译期报 boost regex/system 头文件缺失缺 Boost 开发包apt-get install libboost-regex-dev libboost-system-dev;确定不用 socket 调试时可在configure阶段跳过对应检查
make install成功但敲spike提示命令不存在安装目录没进PATH执行export PATH=$RISCV/bin:$PATH,并用which spike确认

跑通之后,往深里走的几个方向

  • 加自定义指令:在riscv/insns/下仿照现有文件写一条指令的功能行为,把编码登记进riscv/opcodes.h和构建清单,再重新make即可生效,README.md 里有完整步骤。
  • 交互式调试:spike -d pk hello进入单步模式,可以用: reg、: mem等命令直接看寄存器与内存;--rbb-port还能配合 OpenOCD 和 gdb 做远程调试。
  • 调模拟规模:-p指定核数、-m指定内存布局、--isa指定扩展组合、-l输出执行日志,排查问题时基本够用。

延伸阅读

源码即文档,以下本地文件值得在动手改代码前通读一遍:README.md(构建与调试全流程)、configure.ac(配置项定义)、ChangeLog.md(版本变更记录)。

【免费下载链接】riscv-isa-simSpike, a RISC-V ISA Simulator项目地址: https://gitcode.com/GitHub_Trending/ri/riscv-isa-sim

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进