12

RISC-V-学习笔记1-Rocket Chip学习

 2 years ago
source link: https://iamywang.github.io/2020/study-rocket-chip/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

0x01 什么是Rocket Chip

Rocket Chip是基于Chisel开发的一款开源SoC生成器(Generator),它包含了由core,cache以及互连(interconnect)等构成的模块库,以此为基础构成一个完整的SoC,并可以生成可综合的RTL代码。

0x02 Rocket Chip生成器的构成

Rocket Chip有非常灵活的参数化设计,便于我们根据特定的应用场景对其进行定制,我们可以通过仅仅更改一个配置,就得到大小迥异的SoC,可以是嵌入式微处理器,也可以是多核服务器芯片。

Rocket Chip支持以指令集扩展、协处理器或完全独立的新核的形式来组成定制加速器,利用混合的方式提高开发效率,方便设计者们的使用。

1.png

  • A) Core生成器:包括标量处理器内核Rocket的生成器和乱序执行的超标量处理器内核BOOM的生成器,这两种生成器均含有一个可选的FPU、可配置的功能单元流水线和可定制的分支预测器;
  • B) Cache生成器:包括一组缓存和TLB(TranslationLookasideBuffer,页表缓存)生成器,其大小、连接和替换方法都是可以配置的;
  • C) RoCC生成器:Rocket协处理器接口(RocketCustomCoprocessor,RoCC)是一种协处理器模板,其参数可以基于特定应用修改;
  • D) Tile生成器:缓存一致性的tile生成器模板,其中可以配置处理器内核、加速器和缓存的数目和类型;
  • E) TileLink生成器:包括缓存一致性端口模块和缓存控制器的生成器,可配置的选项包括tile的数量、一致性的策略、共享的备份存储器和底层物理网络的实现;
  • F) 外设:兼容AMBA总线和很多转换器和控制器的生成器,包括Z-scale处理器。

0x03 Chipyard文档中的示意图和说明

2.png

  • Tiles:上图展示了一个双核的Rocket系统,每个Rocket核有带有页表查询器、L1 i-cache和L1 d-cache。
  • Memory System:Tiles与连接到L2 Bank的SystemBus相连接,然后L2 Bank又连接到MemoryBus,后者通过TL to AXI转换器连接到DRAM控制器。
    • MMIO:对于MMIO外设,SystemBus连接到ControlBus和PeripheryBus。
    • `BootROM包含第一阶段的引导程序,即系统退出复位状态时要运行的第一条指令。它还包含设备树,Linux使用该树来确定连接了哪些其他外围设备。
    • PLIC汇总并屏蔽设备中断和外部中断。
    • 内核本地中断包括每个CPU的软件中断和计时器中断。
    • 调试单元用于从外部控制芯片。它可用于将数据和指令加载到内存或从内存中提取数据。可以通过自定义DMI或标准JTAG协议进行控制。
    • 在PeripheryBus增加附加外围设备,如网卡和块设备。它还可以选择公开一个外部AXI4端口,该端口可以连接到供应商提供的AXI4 IP。
  • DMA:您还可以添加直接从内存系统读取和写入的DMA设备。这些附在FrontedBus上。

0x04 Rocket Chip和Chisel

  • Rocket Chip本身是基于Chisel硬件描述语言开发的,Chisel利用Scala嵌入式语言来描述硬件,可以直接对可综合的电路进行描述。
  • 相对于高级别的软件语言,Chisel更接近于像Verilog这种传统的硬件描述语言,但Chisel使得Scala这种编程语言可以用来生成电路,对电路进行指向功能和对象的描述。
  • Chisel还拥有支持结构化数据的丰富的类型系统,可以推测线宽,拥有高层次的状态机描述,可以进行批量线操作。
  • 我们可以用Chisel生成可综合的Verilog代码,将其读入FPGA和ASIC设计工具。
  • Chisel还可以生成快速的周期精确的C++模拟器,与Verilog仿真器功能一致,但速度明显更快,可以用来对Rocket Chip项目生成的SoC进行仿真。

0x05 Rocket和RISC-V

  • Rocket Chip使用RISC-V作为其指令集,RISC-V令集架构可以广泛使用于各种处理器内核,可以应用于高性能的乱序执行的设计,也可以应用于小型的嵌入式的处理器。
  • RISC-V本身是一种灵活的模块化的架构,它最基本的特征是所有RISC-V处理器核心都必须使用的整数指令子集,可由字母I表示,同时也为其他的可选的扩展指令子集留有足够的操作码空间。
  • 可选的指令子集中已因其规范性而得到标准化的模块有:乘除法指令,可由字母M表示;原子(Atomics)指令,可由字母A表示;单精度浮点指令,可由字母F表示;双精度浮点指令,可由字母D表示;这些比较具有代表性的模块可以组合起来,也就是IMAFD,组合作为一种通用的标量指令集,可由字母G表示;RISC-V的地址编码模式可以是32位、64位或者128位,还有一种压缩的扩展指令子集,可由字母C表示,使用的是16位的指令编码模式,来减小编码的长度。
  • Rocket Chip生成器基于Chisel构建了一个RISC-V平台,Rocket Chip生成器包含许多参数化的芯片构建库,可以生成自定义的SoC。
  • Rocket Chip将连接不同的库的生成器的接口标准化,我们可以仅仅通过修改配置文件就将设计中的许多组件替换掉,不需要去对硬件的源代码作出修改。我们可以只测试某个生成器的输出,也可以对整个设计做测试,测试也同样是参数化的,保证测试的覆盖范围足够大。

0x06 Rocket Chip代码依赖的Scala库

  • amba:Rocket Chip利用该RTL包使用diplomacy生成AMBA总线,包括AXI4、AHB-lite和APB。
  • config:Rocket Chip利用这个程序包来提供Scala接口,通过动态变化的参数库来配置生成器。
  • coreplex:Rocket Chip利用这个RTL包将其他包里的各种组件组合起来生成一个完整的coreplex,包括Rocket内核块、系统总线网络、缓存一致性端口、调试设备、中断处理程序、外设、时钟crosser以及从TileLink到外部总线如AXI或者AHB的转换器。
  • devices:Rocket Chip利用该RTL包实现外设,包括调试模块和各种TLslave。
  • diplomacy:生成参数化的总线所需的参数协商机制,Rocket Chip中的TileLink利用Diplomacy来确定不同级别的总线间的互连。
  • groundtest:用于Rocket Chip硬件测试的RTL包,生成随机的内存访问流,对非核心的内存层次进行压力测试。
  • jtag:Rocket Chip利用这个RTL包实现JTAG接口。
  • regmapper:Rocket Chip利用该程序包来生成具有标准接口的从设备,以访问其内存映射寄存器。
  • rocket:该RTL包生成了顺序执行的流水线的处理器内核Rocket,以及L1指令和数据缓存,用来例化内存中的内核并将其连接到外部。
  • tile:这个RTL包中的组件可以与内核组合构成tile,比如FPU和加速器。
  • tilelink:该RTL包利用Diplomacy实现TileLink总线协议,包含很多适配器和协议转换器。
  • unittest:这个程序包包含有生成各个模块的可综合的硬件测试器的框架。
  • util:Rocket Chip利用该程序包提供其他包里共用的Scala和Chisel构造。

0x07 Rocket Chip代码依赖的Git子模块

0x08 搭建开发环境

克隆仓库、配置子模块

$ git clone https://github.com/ucb-bar/rocket-chip.git
$ cd rocket-chip
$ export ROCKETCHIP=`pwd`
$ git submodule update --init

配置环境变量

export RISCV=/path/to/install/riscv/toolchain

使用高性能、周期准确的Verilator

下一步是使Verilator运行。假设有N个核心,执行以下操作:

$ cd $ROCKETCHIP/emulator
$ make -jN run

这样,构建系统将为周期精确的仿真器生成C ++代码,编译仿真器,编译所有RISC-V组装测试和基准测试,并在仿真器上运行测试和基准测试。

如果Make完成没有任何错误,则表示生成的Rocket芯片已通过所有组装测试和基准测试!

生成vcd波形,可以运行以下命令之一:

$ make -jN run-debug
$ make -jN run-asm-tests-debug
$ make -jN run-bmark-tests-debug

把Rocket核映射到FPGA

使用以下命令生成可综合的Verilog:

$ cd $ROCKETCHIP/vsim
$ make verilog CONFIG=freechips.rocketchip.system.DefaultFPGAConfig

用于FPGA工具的Verilog将在vsim / Generated-src中生成。

使用以下命令在模拟中运行装配体测试和基准测试:

$ cd $ROCKETCHIP/vsim
$ make -jN run CONFIG=freechips.rocketchip.system.DefaultFPGAConfig

生成的输出看起来与从仿真器生成的输出相似。

通过VSLI工具

使用以下命令为VLSI流生成Verilog:

$ cd $ROCKETCHIP/vsim
$ make verilog

查看config文件:

conf文件包含流中实例化的所有SRAM的信息。

$ cat $ROCKETCHIP/vsim/generated-src/*.conf
name data_arrays_0_ext depth 512 width 256 ports mrw mask_gran 8
name tag_array_ext depth 64 width 88 ports mrw mask_gran 22
name tag_array_0_ext depth 64 width 84 ports mrw mask_gran 21
name data_arrays_0_1_ext depth 512 width 128 ports mrw mask_gran 32
name mem_ext depth 33554432 width 64 ports mwrite,read mask_gran 8
name mem_2_ext depth 512 width 64 ports mwrite,read mask_gran 8

使用以下命令运行组装测试和基准测试

$ cd $ROCKETCHIP/vsim
$ make -jN run

参数化Rocket Chip

在make命令行上更改CONFIG变量:

$ cd $ROCKETCHIP/vsim
$ make -jN CONFIG=freechips.rocketchip.system.DefaultSmallConfig run-asm-tests

甚至通过将CONFIG定义为环境变量:

$ export CONFIG=freechips.rocketchip.system.DefaultSmallConfig
$ make -jN run-asm-tests

这种参数化是用Chisel编写的处理器生成器的众多优势之一,要覆盖特定的配置项(例如外部中断的数量),也可以创建自己的配置,并使用Config的++运算符进行组合。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK