Rocket Chip
基本结构
Rocket Chip
是基于Chisel开发的一款开源SoC生成器(Generator),也即它自己其实并不是一款处理器。它根据不同的配置参数可以产生不同的处理器的RTL代码,当配置参数确定之后,生成的才是一个真正的“处理器”。
从图中可以看出,
Rocket Chip
有六个组成部分:
- A为
Core Generator
,用于生成处理器核,支持Rocket-core和BOOM两种 - B为
Cache
,包括L1 Cache和L2 Cache - C为
RoCC
,即Rocket的用户自定义加速器接口,用户可以使用Chisel自行编写加速器挂载到Rocket-chip中 - D为
Tile
,一个处理器核和一个L1 Cache(包括指令Cache和数据Cache)构成一个Tile,在Rocket-chip中通过复用各种Tile构建一个多核(同构或异构)的体系 - E为
TileLink
,是UC Berkeley自己开发的片上总线,用于连接处理器、缓存和外设 - F为
Peripheral
,包括AMBA兼容总线(AXI,AHB-Lite和APB)的发生器以及各种转换器和控制器。
上图的具体示例包括了两个Tile,这些Tile连接到一个4-bank L2 Cache
,该缓存本身通过AXI
互连连接到外部I/O和存储系统。
Tile 1
内是一个乱序的BOOM
内核,它具有FPU
,L1
指令和数据缓存以及实现RoCC
接口的加速器。Tile 2
和Tile 1
类似,但是它使用的是顺序执行的Rocket-core
内核,并且具有不同的L1
数据缓存参数。
Rocket Chip
有两个主要的用途:
-
第一个是它可以用来生成
RISC-V
的RTL
实现,该实现具有顺序执行的流水线,符合IEEE标准的浮点运算单元,多级cache,虚拟内存,以及其他相关模块。 -
另一个用途是把
Rocket Chip
当做 “函数库” 来使用,只复用其中的某个部分。例如伯克利的另一个项目BOOM
(RISC-V的另一个乱序执行超标量实现)就把Rocket Chip
当做模块库来使用,并只重新实现了其中的core
和cache
部分。
Rocket Chip
工程目录
-
bootrom —包含第一阶段bootloader的源代码。
-
docs —代码库特定部分的文档、教程等。
-
emulator —编译和运行Verilator仿真的目录。
-
src\main\resources\csrc —用于Verilator仿真的C源代码。
-
regression —定义连续集成和nightly regression套件。
-
scripts —用于解析模拟输出或操作源文件内容的实用程序。
-
vsim —编译和运行Synopsys VCS仿真的目录。
-
src\main\resources\vsrc —包含interfaces、harnesses 和 VPI的Verilog源。
src\main\scala
目录:该目录包含两种类型的模块:
①一种是工具utility,类似helper性质,用来帮助代码实现,并不直接生成硬件。如:
-
config —此实用程序包提供Scala接口,用于通过动态查找的参数化库配置生成器。
-
diplomacy —此实用程序包通过允许
two-phase hardware elaboration
(双相硬件精化)扩展了Chisel,其中某些参数在模块之间动态协商。diplomacy
是一种用于高级参数化的机制:它实现了模块之间的参数协商,参数在模块之间传递时可以根据需求协商与检查,更加灵活且不容易出错;还可以快速实现设计拓扑的参数化,使用verilog实现设计拓扑的参数化是非常困难的一件事,往往包含着大量的define,容易出错,且写起来困难。有关diplomacy的更多信息,请参阅 这篇文章。 -
regmapper —该实用程序包生成具有标准化接口的从设备,用于访问其内存映射寄存器。
-
system —调用其他各种模块,构造可配置的系统。
-
unittest —可综合的单元测试代码的框架。注意,这与Chisel的tester框架完全不同。
②另一种是硬件模块的生成器。如:
-
amba —这个RTL包使用diplomacy机制生成AMBA协议的总线实现,包括AXI4、AHB lite和APB。
-
devices —这个RTL包包含了各种外设的实现,它包括调试模块和各种TL(UC Berkeley自己开发的片上总线协议)从机(外设做从机)。
-
groundtest —这个RTL包生成可综合的硬件测试器,这些测试器发出随机内存访问流,以便对非核心内存层次结构进行压力测试。
-
interrupts —使用diplomacy实现的中断逻辑。
-
jtag —这个RTL包提供了生成JTAG总线接口的定义。
-
rocket —该RTL包生成Rocket的 in-order 流水线内核、L1指令和数据缓存、FPU、RoCC协处理器等。
-
scie —用于在core流水线里面添加自定义指令的接口。
-
subsystem —公共总线架构的实现,包含master和slave接口。它包含了一些系统中经常需要添加的模块,用户自己创建系统时可以继承该子系统实现复用,这样只需要再手动添加其他模块即可。
-
tile —可以包含
core,FPU,L1缓存,RoCC协处理器
等的容器。在Rocket-chip
中通过复用各种Tile
构建一个多核(同构或异构)的系统。 -
tilelink —这个RTL包使用diplomacy机制生成TileLink协议的总线实现。它还包含各种适配器和协议转换器。
-
util —此实用程序包提供了多种常见的Scala和Chisel编写的程序,可在多个其他包中被重复使用。如一些常见逻辑,ECC,arbiter, mux,随机数生成器等。
Rocket Chip
依赖的其他库如下:
-
chisel3 —(https://github.com/ucb-bar/chisel3):Rocket Chip生成器使用 Chisel3 产生RTL代码。
-
firrtl (https://github.com/ucb-bar/firrtl):Firrtl (Flexible Internal Representation for RTL) RTL的中间语言表示,进而生成Verilog代码,C代码等最终代码。
-
hardfloat(https://github.com/ucb-bar/berkeley-hardfloat):包含有生成符合IEEE 754-2008标准的参数化浮点单元的chisel代码,这些浮点单元用于融合乘加运算、整数和浮点数之间的转换以及不同精度的浮点转换。
-
rocket-tools(https://github.com/freechipsproject/rocket-tools):RISC-V软件工具链,该工具与此存储库中提交的RTL一起工作。
-
torture(https://github.com/ucb-bar/riscv-torture):该模块用于生成和执行受约束的随机指令流,该指令流可用于对设计的核心部分和非核心部分进行压力测试。
未完待续…
参考链接:
- https://github.com/freechipsproject/rocket-chip
- https://zhuanlan.zhihu.com/p/140360043
- https://www.chiselchina.com/2019/06/10/Rocket-Chip/