NutShell处理器核快速上手教程
源代码结构
项目 Repository 建立在 Scala 框架下, 其中主要的的目录和文件如下
.
├── debug/ # 处理器核测试脚本
├── fpga/ # 用于FPGA平台调试运行的相关文件
├── project/ # 构建SBT项目的相关配置文件
├── src/ # 处理器核源代码
├── script/ # 其他脚本文件
├── tool/ # 其他工具
├── Makefile
└── README.md # 项目介绍
./src 下的文件是项目最核心的处理器核源代码, 简要说明如下
./src
├── main/scala
│ ├── bus # 总线相关
│ ├── device # 输入输出设备相关
│ ├── nutcore # 核心相关
│ ├── sim # 仿真相关
│ ├── system # 外围系统
│ ├── top # 项目顶层文件及配置文件
│ └── utils # 工具相关
└── test
├── csrc # C++测试文件, 主要用于Verilator仿真项目构建
├── vsrc # Verilog测试文件
└── scala # Scala测试文件
准备工作
推荐在 Ubuntu 18.04 或者 Debian 10 以上的 Linux 发行版环境中运行本项目.
安装 Mill
- 请参考该指南的Manual部分
安装 GNU RISCV 工具链
Ubuntu 18.04 或者 Debian 10 以上:
sudo apt-get install g++-riscv64-linux-gnu
其他平台
安装 Verilator
Ubuntu 18.04 或者 Debian 10 以上:
sudo apt-get install verilator
其他平台
- 参考官方教程从源文件编译安装
关联项目
运行和测试 NutShell 核心还需要一些关联项目的辅助, 来提供核上运行时, 操作系统, 以及行为对比验证等
NEMU
NEMU (NJU Emulator) 是一个简单但完整的全系统模拟器, 目前支持 x86, mips32, riscv32, riscv64 指令集. 在一生一芯项目中, NEMU 作为一个重要的基础设施, 被用来与处理器核作对比仿真验证.
NEMU 的源代码参见这里.
AM
AM (Abstract Machine) 是一个向程序提供运行时环境的包装库, 它提供了一个面向裸金属的运行时环境, 把程序与体系结构进行了解耦. 我们只要在 AM 的框架下编写好程序, 就能方便地运行在 NEMU 和 Nutshel 之上. AM 在一生一芯项目中被用来包装一系列测试程序从而验证核心的正确性.
RISCV-PK & RISCV-LINUX
RISCV-PK (The RISC-V Proxy Kernel) 是一个轻量的 RISCV 运行时环境, 它能够将搭载程序的 I/O 系统请求代理到主机来完成. 我们项目中没有这样的需求, 而是主要使用了其中的 BBL (Berkeley Boot Loader) 部分, 它为 Linux 内核的运行提供预先准备, 包括注册 M mode 中断处理请求, 读取并解析设备树, 设置相应 CSR 寄存器值等等. 当 BBL 运行结束, 它就会将控制器正式交给内核.
OSCPU 项目组中的 riscv-linux 工程内置了 BBL, 也包含了一个最精简的 Linux 内核, ELF文件仅有1.4MB 大小, 初始 init 为一个输出 Hello World 的小程序.
仿真运行流程
请参考此处的说明来使用我们预编译好的映像文件进行处理器核的仿真运行. (推荐)
如果要手动编译运行映像, 我们以 Microbench 作为例子进行说明.
Microbench
Microbench 是一个建立在 AM 之上的基准测试程序, 位置在 nexus-am/apps/microbench/.
- 准备好 NutShell, NEMU, AM 这三个项目, 做好 NutShell 的 Setting 工作
设置三个环境变量
NEMU_HOME
= NEMU 项目的绝对路径NUTSHELL_HOME
= NutShell 项目的绝对路径AM_HOME
= AM 项目的绝对路径
进入 nexus-am/apps/microbench/, 执行
make ARCH=riscv64-nemu mainargs=test run
该命令首先会使用 AM 运行时框架编译 Microbench 源代码, 形成一个内存映像二进制文件 (.bin), 然后让该文件载入进 NEMU 模拟器的内存中运行, 最后可以在终端中看到相应的输出以及最后的 Pass 字样.
其中, ARCH 指定 AM 的编译条件,
-
之前部分指示指令集,-
之后部分指示运行平台; mainargs 指定目标程序的传入参数, 在 Microbench 中可以传入 "test", "train", "ref" 来设定测试规模.进入 nexus-am/apps/microbench/, 执行
make ARCH=riscv64-nutshell mainargs=test run
该命令与上面唯一的不同是让 Microbench 运行到了 NutShell 的仿真平台之上, 如果顺利的话可以看到终端输出了和 NEMU 上一致的内容(除了运行时间有差异).
值得注意的是, 第一次运行该命令会从头开始 build NutShell 项目, 通常第一次 build 的时间会非常漫长, 这是因为 Mill 工具会下载依赖的 Scala/Java 包, 这些包在国内的网络环境中下载速度很慢. 一旦第一次构建成功后, 后续就不会重复下载了, build 速度会快很多.