一、 Rocket Chip
基本结构
Rocket Chip
Rocket Chip
是基于Chisel开发的一款开源SoC生成器(Generator),也即它自己其实并不是一款处理器。它根据不同的配置参数可以产生不同的处理器的RTL代码,当配置参数确定之后,生成的才是一个真正的“处理器”。
从图中可以看出,
Rocket Chip
有六个组成部分:
- A为
,用于生成处理器核,支持Rocket-core和BOOM两种Core Generator
- B为
,包括L1 Cache和L2 CacheCache
- C为
,即Rocket的用户自定义加速器接口,用户可以使用Chisel自行编写加速器挂载到Rocket-chip中RoCC
- D为
,一个处理器核和一个L1 Cache(包括指令Cache和数据Cache)构成一个Tile,在Rocket-chip中通过复用各种Tile构建一个多核(同构或异构)的体系Tile
- E为
,是UC Berkeley自己开发的片上总线,用于连接处理器、缓存和外设TileLink
- F为
,包括AMBA兼容总线(AXI,AHB-Lite和APB)的发生器以及各种转换器和控制器。Peripheral
上图的具体示例包括了两个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
实现,该实现具有顺序执行的流水线,符合IEEE标准的浮点运算单元,多级cache,虚拟内存,以及其他相关模块。RTL
- 另一个用途是把
当做**“函数库”**来使用,只复用其中的某个部分。例如伯克利的另一个项目Rocket Chip
(RISC-V的另一个乱序执行超标量实现)就把BOOM
当做模块库来使用,并只重新实现了其中的Rocket Chip
和core
部分。cache
二、 Rocket Chip
工程目录
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源。
1、 src\main\scala
目录:该目录包含两种类型的模块:
src\main\scala
①一种是工具utility,类似helper性质,用来帮助代码实现,并不直接生成硬件。如:
- config —此实用程序包提供Scala接口,用于通过动态查找的参数化库配置生成器。
- diplomacy —此实用程序包通过允许
(双相硬件精化)扩展了Chisel,其中某些参数在模块之间动态协商。two-phase hardware elaboration
是一种用于高级参数化的机制:它实现了模块之间的参数协商,参数在模块之间传递时可以根据需求协商与检查,更加灵活且不容易出错;还可以快速实现设计拓扑的参数化,使用verilog实现设计拓扑的参数化是非常困难的一件事,往往包含着大量的define,容易出错,且写起来困难。有关diplomacy的更多信息,请参阅 这篇文章。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,随机数生成器等。
2、 Rocket Chip
依赖的其他库如下:
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/