天天看点

RISC-V SoC生成器---Rocket Chip介绍

一、

Rocket Chip

基本结构

Rocket Chip

是基于Chisel开发的一款开源SoC生成器(Generator),也即它自己其实并不是一款处理器。它根据不同的配置参数可以产生不同的处理器的RTL代码,当配置参数确定之后,生成的才是一个真正的“处理器”。

RISC-V SoC生成器---Rocket Chip介绍

从图中可以看出,

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源。
1、

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,随机数生成器等。
2、

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/

继续阅读