risc-v中文社区

 找回密码
 立即注册
查看: 2612|回复: 0

[经验] chipyard学习经验分享

[复制链接]

1

主题

1

帖子

40

积分

新手上路

Rank: 1

积分
40
发表于 2021-9-29 08:06:36 | 显示全部楼层 |阅读模式

目录
一 . 进入chipyard后的环境变量设置... 3
二 . 6. Customization 自定义SoC学习:... 3
1.    Chipyard document 6.1 :... 3
2.    Chipyard document 6.2:... 4
3.    Chipyard document 6.3 :... 4
4.    Chipyard document 6.4 :... 4
5.    Chipyard document 6.5 :... 5
6.    Chipyard document 6.6 :... 5
7.    Chipyard document 6.7 :... 6
8.    Chipyard document 6.8 :adding a DMA Device. 8
9.    Chipyard document 6.9 :Incorporating Verilog Blocks. 9
10.      Chipyard document 6.10 :Memory Hierarchy 内存结构... 10
11.      Chipyard documentation 6.11 : Chipyard Boot Process. 12
12.      Chipyard documentation 6.12:Adding a Firrtl Transform... 14
13.      Chipyard documentation 6.13:IOBinders. 14
三 .Ubuntu终端命令学习:... 14
四 .如何自己写一个 makefile : 15
五 .Chipyard 项目里各个文件的内容以及作用:... 15
六 .tmux命令:... 16
七 .可执行的软件代码:... 16
八 .怎么给chipyard添加一个accelerator,有如下三个步骤:以sha3 accelerator为例。... 17
九 .FireMarshal的使用:... 21
十 .3. Included RTL Generators. 22
1.    Rocket Chip:是一个SoC generator,是RISC-V SoC设计的基础。... 22
2.    TLB的原理作用:... 23
3.    BOOM: 24
4.    Hwacha:... 24
5.    Gemmini:... 24
1 . Architecture. 31
2 . programming model 33
6.   makefile变量... 36
十一 .Ubuntu中使用github管理项目... 36
十二 .chisel 高阶用法简介--rocket-chip generator :diplomacy,cake pattern和参数化。... 37
十三 .ROCC 和 MMIO加速器的学习... 37
1.    首先ROCC accelerators 是extend 于lazyRoCC class的lazymodules , RoCC的implementation extends the LazyRoCCModule class。... 38
2.    通过重写configuration中的BuildRoCC parameter,可以将RoCC accelerators加到core上,这需要一系列的functions来产生lazyRoCC objects,每个加速器对应一个。以下例子:... 39
3.    ROCC-coprocessor-construction pdf学习... 40
4.    An Introduction to the Rocket Custom Coprocessor Interface: 40
5.    Cake pattern:... 42
6.    总结一下,如何挂载一个RoCC accelerator到core. 44
7.    document6.5 MMIO peripherals. 48
8.       挂载一个ROCC accelerator实战... 48
9.    LazyRoCC.scala 文件详细阅读和解释... 50
十四:Rocc-coprocessor-construction.pdf学习... 51
1.    ISA.. 52
2.    The RoCC coprocessor interface. 54
3.    Custom instructions. 60
4.    通用的ROCC框架:Architecture overview.. 62
十五:rocket-chip generator仿真c程序... 62
十六. 对gemmini ROCC进行功能测试:... 64
十七. 基于TileLink的DMA设计... 67
1     .关于DMA的简单介绍... 67
2     . 存储映射寄存器控制DMA运行... 68
3     . DMA的读取和写入内存... 68
4     .基于TileLink的DMA设计——节点互联... 69
5     .基于TileLink的DMA设计——cake pattern设计模式... 69
6     .对DMA进行测试... 71
7     .目前地址映射产生的address map: 72
8     .另一种cake pattern的DMA实现方式。(这里还有个待解决的问题:已解决) 72
9     . makefile variables shared across multiple makefiles. 74
十八.ROCC的访存方法学习... 74
1 . ROCC两种基本的访存方式以及拓展方式(待解决问题)... 74
2 .icenet的了解学习... 76
3 .分别使用DMA和Cache控制读写ROCC.. 76
十九.FireSim simulation学习... 76
1 . Introduction. 77
2 . set up environment 77
二十. Chipyard的几种仿真方式... 78
1 . basics. 78
2 . Verilator: 79
3. Mapping to an FPGA:... 79
4. toolchains. 79
5 . Sims. 80
6 . Rocket的调试模块... 80
7 . 蜂鸟E200的调试机制概述和仿真... 81
二十一.chipyard document第八章学习advanced concepts. 83
1 . Tops, Test-Harnesses, and the Test-Driver 84
2 . Communicating with the DUT. 84
3 . Debugging RTL. 84
二十二: DigitalTop顶层class的分析... 85
1 . DigitalTop class 默认的内容... 85
2 . TutorialConfigs.scala 配置默认的内容... 85

一 . 进入chipyard后的环境变量设置
source ./env.sh
每一次进入cd chipyard文件后设置环境变量要记住。
二 . 6. Customization 自定义SoC学习:
1.   Chipyard document 6.1 :
异构SoC可以有多个rocket/boom核,自己配置config文件,有教程配置config文件如下路径:

2.   Chipyard document 6.2:
将定制chisel项目集成到generators的开发系统中,在Ubuntu系统中下载了idea和相关配置成功完成了helloworld project的实验。
3.   Chipyard document 6.3 :
加速器和定制IO设备添加到SoC中的两种方式:MMIO和RoCC。

4.   Chipyard document 6.4 :
添加一个RoCC accelerator的方法教程,不同的各种IOs可以看如下路径教程:

再将该accelerator的config添加到SoC中

Note that communication through a RoCCinterface requires a custom software toolchain, whereas MMIO peripherals canuse that standard toolchain with appropriate driver support.

5.   Chipyard document 6.5 :
添加MMIO外设的相关教学
完成最后gcd仿真测试。
6.   Chipyard document 6.6 :
Dsptools blocks : dsptools是一个用来写定制信号处理加速器的chisel library.

展示了一个 使用 Dsptools 作为 MMIO 外设创建的简单 FIR 滤波器的例子。   
这个例子和上面6.5的例子都是用MMIO(tile-link attached accelerator)接口规则,要学会如何使用该接口规则。
7.   Chipyard document 6.7 :
Chisel引用了keys、traits、configs,本节主要阐述这些chisel components之间的交互关系,并提供如何使用这些组件创建参数化设计并对其进行配置的最佳实践。
继续引用了GCD的例子(Grand Central Dispatch)是异步执行任务的技术之一。
                          i.           首先,keys指定了一些自定义widget的参数,通常被实现为一个带默认值None的Option types,None意味着系统没有改变话句话说也就是当用户未显式设置keys时,默认行为应该是 no-op。

                         ii.           通常,大多数自定义blocks需要修改某些预先存在的blocks的行为。例如,GCD widget需要用Digitaltop模块通过Tilelink去实例化和连接widget,产生一个顶层gcd_busy端口,以及把该端口也连接到module。Traits 让我们在不修改Digitaltop现有代码的情况下做到这一点,并实现不同自定义块的代码的隔离。

                       iii.           Config fragments:

8.  Chipyard document 6.8 :adding a DMA Device
DMA设备是作为主设备的 Tilelink 小部件。换句话说,DMA设备可以向芯片的内存系统发送自己的读写请求。

9.  Chipyard document 6.9 :Incorporating Verilog Blocks

10. Chipyard document 6.10 :Memory Hierarchy 内存结构
1)      L1 cache 的配置:

2)      System bus 的配置:

3)      The SiFive L2 Cache:

4)      The Broadcast Hub:

5)      The Outer Memory System:

11. Chipyard documentation 6.11 : Chipyard BootProcess
本节将详细介绍基于chipyard的 SoC 启动 Linux 内核的过程,以及您可以进行自定义此过程的更改。
Chisel 生成器在阐述时将组装的指令编码到 BootROM 硬件中,因此,如果要更改 BootROM 代码,则需要在 bootrom 目录中运行make,然后重新生成 Verilog。如果不想覆盖现有bootrom.S ,也可以通过覆盖配置中的BootROMParams key将生成器指向不同的引导映像。

12. Chipyard documentation 6.12:Adding a FirrtlTransform
13. Chipyard documentation 6.13:IOBinders
在 Chipyard 中,我们使用特殊parameters key,IObinders来实例化chiptop图层中的 IO cells,并确定要绑定到TestHarness中的chiptop 的 IO 的模块。

三 .Ubuntu终端命令学习:四 .如何自己写一个 makefile: 五 .Chipyard 项目里各个文件的内容以及作用:
1        Bootrom文件夹:有三个 不同的bootrom image文件

BootROM 包含打开 SoC 时要运行的第一个指令,以及详细说明系统组件的设备树二进制(dtb)。BootROM 代码的程序集位于
generators/testchipip/src/main/resources/testchipip/bootrom/bootrom.S

想要改变bootrom代码可以通过在bootrom文件路径中执行make指令或者将generator指向不同的bootrom image文件通过覆盖配置中的BootROMParams key。
2        docs文件夹
文件夹里是一系列由.rst文件构成的文件夹,暂时不清楚有什么用
未完待续
3        generator文件夹
3.1        rocket-chip/src/main/scala文件夹
3.2         
六 .tmux命令:七 .可执行的软件代码:


# 先选择RocketConfig进行编译
make CONFIG=RocketConfig
# 然后运行dhrystone程序
./simulator-chipyard-RocketConfig$RISCV/riscv64-unknown-elf/share/riscv-tests/xxxx/xxxxx
在这里面。
2020.1.18目前为止有两个不同的toolchain可以生成可执行文件,一个在test里面,一个用于ROCC 自定义拓展指令集里,gemmini文件夹里。
八 .怎么给chipyard添加一个accelerator,有如下三个步骤:以sha3 accelerator为例。
1.     Add the source code to`generators`


2.     Add the accelerator project tothe build system in `chipyard/build.sbt`
• Need to tell the build system it exists

• Need to add it to a top-level project (in our case èxample`)

3.     Create a new configuration thatadds it!


注意“WithSha3Accel”mixin,它插入rocket chip config system
`Sha3AccelImp`实现基于chisel的accelerator






后续还有一部分生成 没有完成,由于提示

还有用firemarshal implement sha3 software(BuildingSHA3 Software)

再在verilator中仿真查看results。
九 .FireMarshal的使用:
FireMarshal is a workload generation tool for RISC-V based systems.It currently only supports the FireSim FPGA-accelerated simulation platform.
a)      首先更新子模块:./init-submodules.sh
b)      用 sudo -s命令进入root模式。
c)       然后出现no module 问题,在运行 ./marshal build br-base.json构建workload的时候,查询发现有如下必须module

通过pip install psutil时又出现install后不匹配的问题,重新查询问题得到解决方案:

d)      Ubuntu 16.04 各种python版本的查看和切换:
e)      Linux下如何退出vim的一些常用命令总结:

十 .3. Included RTL Generators1.   Rocket Chip:是一个SoC generator,是RISC-V SoC设计的基础。
Rocket chip与rocketcore不同,后者是一个有序RISC-V CPU generator,而rocket chip包括了除CPU外的很多部分。理解这个概念,rocket chip默认是由rocket core这个CPU构成的,但是也可能由BOOM或者其它cores配置而来。
下图是一个典型Rocket chip系统图:

TileTW:page-table walker。一个Tile还有L1 instruction cache, and L1 datacache,一个core(可以是rocket core,或者boom或者其他),还可以配置一个ROCC accelerator连接到core作为一个coprocessor。
2.   TLB的原理作用:
MMU: MMU是MemoryManagement Unit的缩写,中文名是内存管理单元,有时称作分页内存管理单元(英语:pagedmemory management unit,缩写为PMMU)。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换(bank switching,尤其是在8位的系统上)。
3.   BOOM:
BOOM 是一个统一的物理寄存器文件设计(也称为"显式寄存器重命名")。从概念上讲,BOOM 分为 10 个阶段:Fetch,Decode, Register Rename, Dispatch, Issue, Register Read, Execute, Memory,Writeback and Commit。但是,其中许多阶段在当前实现中结合在一起,产生七个阶段:Fetch,Decode/Rename, Rename/Dispatch, Issue/ RegisterRead, Execute, Memory andWriteback (Commit occurs asynchronously, so it is not counted as part of the“pipeline”).
4.   Hwacha:
Hwacha 项目正在开发一种新的矢量架构,用于未来计算机系统,这些系统在功耗和能耗方面受到限制。
在定制SoC中加一个Hwacha,需要将 hwacha.DefaultHwachaConfig配置文件加到SoC的配置中去。Hwacha vectorunit 用RoCC端口连接到Tile(rocket or boom),默认通过systembus连接到memory system。还可以自定义改变Hwachavector unit的配置,通过查看generators/hwacha/src/main/scala/configs.scala文件里的可能配置参数。 最后,需要安装toolchain。

5.   Gemmini:
基于脉动阵列的矩阵乘法generator。作为一个带有非标准RISC-V定制指令的RoCC accelerator实现。同样用了RoCC端口协议默认通过system bus连接到memory system或者直接连接到L2 cache。
添加一个gemmini到SoC,需要添加gemmini.DefaultGemminiConfig默认gemmini配置到SOC的配置中,或者自定义修改
generators/gemmini/src/main/scala/configs.scala里面的相关参数替换上述默认配置。
Gemmini generator的主要参数:
1.     脉动阵列的维度参数tileRows,tileColumns, meshRows, meshColumns。两层结构组成。
2.     流水线参数dataflow,决定了脉动阵列是输出固定还是权重固定。或者同时支持两种数据流供选择。
3.     Scratchpad and accumulatormemory参数(sp_banks, sp_capacity, acc_capacity)。OutputType决定在两个processing elements之间传递的type
4.     Type参数inputType,outputType, accType:分别决定输入输出和部分累加和的datatype。Pe_latency参数决定了在Pes里加的移位寄存器数量,单周期内无法完成乘积操作时就需要移位操作。
5.     Access-execute queue parameters访问执行队列参数ld_queue_length, st_queue_length, ex_queue_length, rob_entries:。这些队列的相对大小决定了访问-执行分离级别。Gemmini 还实现了reorderbuffer (ROB) - ROB 中的entries数决定了可能的依赖项管理限制。
6.     DMA参数:dma_maxbytes,dma_buswidth, mem_pipeline。决定了DMA的大小,这些DMA的参数与rocket chip soc的参数有很大关联。



Gemmini非标准ISA拓展在(ISA包括configuration instructions, datamovement instructions (from main memory to the Gemmini scratchpad, and from theGemmini accumulators to main memory), and matrix multiplication executioninstructions.)  https://github.com/ucb-bar/gemmini/blob/master/README.md 被指定。上述网站中可以查看ISA的具体格式。
由于 Gemmini 指令不会通过 GNU binutils 汇编器公开,因此提供了几个 C micros来构造指令编码来调用这些指令。

Gemmini can alsobe used to run ONNX-specified neural-networks through a port of Microsoft’sONNX-Runtime framework. The port is included as the onnxruntime-riscvrepository submoduled in the software directory. The port is under development,and usage documentation can be found within its repository.
构建环境并且run gemmini tests:
首先,build gemmini tests:
cd generators/gemmini/software/gemmini-rocc-tests/./build.sh
Gemmini 生成器包括其他替代 SoC 配置(不在 Chipyard 示例项目中的配置)。如果要构建 Gemmini 项目存储库中定义的这些替代 SoC 配置之一,可以运行以下命令。这些命令与从示例项目构建模拟时所需的命令类似,但它们指定配置的位置位于Gemmini 子项目中,而不是 Chipyard 示例项目:
cd sims/verilator # or "cd sims/vcs"make CONFIG=GemminiAcceleratorConfig CONFIG_PACKAGE=gemmini MODEL_PACKAGE=freechips.rocketchip.system GENERATOR_PACKAGE=freechips.rocketchip.system TOP=ExampleRocketSystem出现如下错误,尚未解决: 分析一下以上代码:1.CONFIG   是用于参数配置的类的名称2.CONFIG_PACKAGE   是CONFIG所在的 Scala package3.MODEL_PACKAGE   is the Scala package (in the Scala code that says package ...) that holds the MODEL class.4. GENERATOR_PACKAGE  is the Scala package that holds the Generator class that elaborates the design.5. TOP 该变量用于区分设计的顶层和系统中的TestHarness make CONFIG=RocketConfig CONFIG_PACKAGE=RocketConfig MODEL_PACKAGE=chipyard GENERATOR_PACKAGE=chipyard          可以和make CONFIG=RocketConfig一样的作用
默认的gemmini 参数如下所示,在configs.scala中设置:

l  自定义一个Gemmini test:

Done!
l  ISA:
本节介绍Gemmini的汇编级ISA,它由自定义RISC-V指令组成。
以下指令是在Gemmini的角度来看的:

l  Configuration:

1 . Architecture
   脉动阵列的inputs和outputs存储在显性托管的scratchpad中,scratchpad由存储SRAMs组成。Scratchpad和主存之间的数据传输由DMA engine实现。


   C = A ∗ B + D 其中A和B是相乘矩阵,C是结果,D是偏差矩阵。该阵列由一个由SRAM制成的scratchpad存储,并通过控制器中的直接内存访问(DMA)引擎处理对主系统的访问。对于非线性激活功能,有专用的组件,例如ReLU和ReLU6,还有在量化后保持网络准确性所必需的组件[18],例如舍入和饱和位移。加速器还包括一个累加器,其累加器的位宽比脉动阵列本身宽,以累加部分结果。
  脉动阵列的µArch如图1。脉动阵列的基本元素是一个完全组合的处理元素(PE),它可以执行MAC和四舍五入的移位。 PE可以支持各种数据流,这些数据流可以在设计时固定,也可以在运行时配置。 PE可以在制定时确定其输入,输出和内部缓冲区的不同位宽。为了充分利用MAC单元,每个PE都进行了双缓冲,从而可以在当前计算周期运行时加载权重/偏差以用于将来的计算。 PE排列在组合网格中以形成图块,而图块排列在流水线网格中以形成脉动阵列本身。
对于对精度和舍入敏感的工作负载,矩阵乘法的结果通常必须具有比输入矩阵更大的位宽。为了支持这种模式,Gemmini体系结构还包括一个在脉动阵列外部的更高位宽的累加器,该累加器被实现为在其输入端带有加法器的双端口SRAM。
Transposer: 该外围电路中的一些还预处理数据。例如,我们的体系结构包括专用的Transposer,该Transposer本身实现为较小的脉动阵列。对于OS数据流,PE必须使用A的行,同时使用B的列。但是,通常所有矩阵都以行为主的形式存储在主存储器中。换位器允许A和B都存储为行优先的,并使矩阵转换对程序员透明。
RoCC接口使加速器可以集成到处理器的缓存一致的TileLink[19]内存系统中,并提供有关主机处理器的执行顺序语义。
Bitwidth:可以在elaboration时将生成器配置为在任意位宽矩阵上运行。矩阵乘法的最终累加结果还可以具有与输入矩阵不同的位宽。先前的工作表明,DNN compression和quantization可以节省大量能量,而潜在的代价是降低accuracy。我们的位宽参数化使设计师能够探索精度-效率之间的权衡,并为相应的应用选择合适的设计点。
Pipeline Depth: 传统上,脉动阵列在每个PE之间放置寄存器。但是,我们的生成器允许降低这些寄存器的密度,甚至可以阵列由完全组合的逻辑组成。更少的流水线寄存器减少了对我们的加速器的面积要求,但可能会降低可达到的最大时钟频率。最佳的管道深度受物理设计和制造工艺技术选择的影响。
Memory Capacity:scratchpad和accumulator memory(使用SRAM实现)都可以配置为具有任意容量。先前的工作发现,main memory和accelerators’ private memory之间的数据移动和一致性管理最多可消耗加速工作负载的总运行时间的40%[22]。由于mainmemory和专用scratchpad/accumulator memory之间的数据传输非常昂贵,因此拥有较大的scratchpad以最大程度地重复使用数据是有益的。但是,过度配置的私有内存可能导致功耗和区域效率低下。因此,存储器容量应与驱动存储器的系统总线和DMA带宽以及加速工作负载的数据重用潜力保持平衡。

Memory Banks: 专用memory scratchpad分为多个banks,以最大化读取/写入吞吐量。大量的memory banks可实现更高的吞吐量,但会导致额外的布线和物理设计约束。
System Parameters:另一个例子是SoC system-bus width,它影响加速器可以在主内存和专用暂存器之间进行通信和移动数据的bandwidth。
2 . programming model
   OS dataflow compute:将bias D矩阵存储到PE的internal accumulators中。
在OS情况下,为D和C矩阵提供地址是可选的。

   WS dataflow compute:

     为了使程序员更轻松地使用Gemmini加速器,我们提供了一个软件库,该库实现了手动调整的,平铺的GEMM函数(支持两个数据流):任意大小的矩阵乘法,多级感知器(MLP),卷积神经网络(CNN),非线性激活和量化。沿着脉动阵列和加速器暂存器的参数化大小执行平铺。切片参数由Chisel生成器生成,并作为头文件包含在软件库中。这种方法有助于快速进行软件-硬件协同设计。
3 . Gemmini文件夹中各文件的作用
PE(process element)是阵列最小单元,实现一维乘加计算。然后PEs规律地按照行列排列成二维的Tile,需要注意Tile里每一个PE是纯组合地连接,PE之间并无寄存器存储中间结果。Tiles流水地排列起来组成整个脉动阵列,Tile之间插入了寄存器。这一点从后面的代码分析可以了解得更清楚。需要计算的数据则被提前按照一定规律或是存入脉动阵列或是排列在脉动阵列周围的存储器(bank)里。
1.  PE.scala
首先自定义了一个IO 端口模块PEControl。

PE模块,PE模块的参数如下:

T <: Data表示,T类型可以是Data的任何子类。其中inputType, outputType, accType三个变量指定加速器数据类型位宽,分别代表输入数据、输出数据和加速器中间变量,默认值是:
在Configs.scala里定义了这些参数

df定义了数据流类型Dataflow在Dataflow.scala里。
latency参数指定要在PEs中添加多少个移位寄存器,因为有些数据类型的乘加操作无法在一个周期完成,如浮点数等。
   IO端口定义

     
2.  Tile.scala
PE构成的2D阵列
/**
  * A Tile is a purely combinational 2D arrayof passThrough PEs.
  * a, b, s, and in_propag are broadcast acrossthe entire array and are passed through to the Tile's outputs
  * @param width The data width of each PE inbits
  * @param rows Number of PEs on each row
  * @param columns Number of PEs on each column
  */
3.  Mesh.scala
/**
  * A Grid is a 2D array of Tile modules withregisters in between each tile and
  * registers from the bottom row and rightmostcolumn of tiles to the Grid outputs.
  * @param width
  * @param tileRows
  * @param tileColumns
  * @param meshRows
  * @param meshColumns
  */
4.  Dataflow.scala
  一个枚举的object
5.  Arithmetic.scala
// A simple typeclass for Chisel datatypes that can add and multiply. To add your own type,simply create your own:
//     implicit MyTypeArithmetic extendsArithmetic[MyType] { ... }
用于gemmini的一些type 组成的class。
比如定义mac做def mac(m1: T, m2: T): T // Returns (m1* m2 + self)
6.   makefile变量
Makefile : chipyard/variables.mkat 64632c8aeef5386b4840e324be4429c0ceaac635 · ucb-bar/chipyard (github.com)  verilator仿真时 这里面有些默认的makefile 变量设置。

十一 .Ubuntu中使用github管理项目十二 .chisel 高阶用法简介--rocket-chip generator :diplomacy,cakepattern和参数化。十三 .ROCC 和 MMIO加速器的学习
1.   首先ROCC accelerators 是extend 于lazyRoCC class的lazymodules , RoCC的implementation extends the LazyRoCCModule class。

generators/rocket-chip/src/main/scala/tile/LazyRoCC.scala注意这里面有各种ROCC accelerator 和 tile communicate的IOs的规范和定义。里面有好几个example可以阅读。
2.   通过重写configuration中的BuildRoCC parameter,可以将RoCC accelerators加到core上,这需要一系列的functions来产生lazyRoCC objects,每个加速器对应一个。以下例子:
一般在下图所示位置:会出现



3.   ROCC-coprocessor-construction pdf学习
SHA3 Software Workloads:

4.   An Introduction to the Rocket Custom Coprocessor Interface:
RoCC接口支持将custom coprocessor或accelerator集成到RISC-V core。
有一些必需接口default RoCC interface,也有一些可添加可配置的接口extended RoCC interface供功能选择。


对于信号的directions和descriptions都是从accelerator的角度来进行的:

5.   Cake pattern:
l  rocket-tile是最好的cake pattern的例子
Lazymodule和mixins是cake pattern的基础,cake pattern是做outer twin 和 inner twin,bundle?是什么。
Twins用继承图inheritance graph被连接到一起,In the case of RocketTile, the way that circuit elements get pulledinto the tile is by inheriting the circuit code . inheritance 方法是cake pattern的本质。
l   
一步步extend with,最后将cache included inside RocketTile:

l  此外,included inside的cache必须在rocketTile内wiredup:

l  Twins之间是通过如下方式连接:outer twin总是会包括inner twin的instance,给outer twin传递 a reference。RocketTile是outer twin,RocketTileModle是inner twin。

l  Cake pattern构建需要的三种classes :


6.   总结一下,如何挂载一个RoCC accelerator到core
需要编写一个RoCC custom accelerator挂载到rocket总线上
首先明确accelerator的功能,编写一个module,假设我们要实现一个PWM外设:

以上没有展示class PWMModule,这个没有展示的模块

Creating an Accelerator
假定我想要做一个custom accelerator 名叫MyAccelerator,首先我要为我接下来的scala文件创建一个目录文件夹

流程看以上网站
然后Creating Chisel Tests forAccelerator
再Checking build.sbt beforeRunning Chisel Tests
接下来是一些测试教学

Done!

Testing your accelerator usingthe Verilator
7)     


这个里面WithRoccExample 是RoCC顶层配置示例,里面还有很多要用到的config。
可以看出,在rocket system和system两个文件夹里分别有配置文件configs,里面分别是  withxxx 和 xxxconfig如上两图所示。
7.   document6.5 MMIO peripherals
To create a RegisterRouter-basedperipheral, you will need to specify a parameter caseclass for the configuration settings, a bundle trait with the extra top-levelports, and a module implementation containing the actual RTL.
8. 挂载一个ROCC accelerator实战
ROCC可以通过RISC-V  自定义扩展指令集 作为命令控制RoCC 执行。Rocket Chip主要为RoCC设计提供了完整的接口,主要包括访存接口、指令接口(包括cmd和resp)。访存接口包括L1DCache、L2DCache、CMD Rocket寄存器等。除了访存接口、指令接口外,RoCC 还具有中断、异常、浮点运算单元接口,这些接口都定义在chipyard/generators/rocket-chip/src/main/scala/tile/LazyRoCC.scala 文件中。
l   
l  求最小公倍数加速器设计:
l   

这一步目前还不知道TOP-Level project的在哪里设置。????已经解决
l  最后还是用了文件分开的格式来构建ROCC,详情见上一个标题2.
l  接下来进行测试:
将测试.c文件写好放入tests文件夹中,然后makefile文件中加上该执行文件,执行make命令生成.riscv可执行文件,即可生成测试可执行文件。
l  RISC-V定义了3个64位计数器,分别为:cycle、time、instret,这三个寄存器可以用来评估硬件性能,还可以产生嘀嗒定时中断。https://blog.csdn.net/zoomdy/article/details/79443472
9.   LazyRoCC.scala 文件详细阅读和解释
Rocket Chip主要为RoCC设计提供了完整的接口,主要包括访存接口、指令接口(包括cmd和resp)。访存接口包括L1DCache、L2DCache、CMD Rocket寄存器等。除了访存接口、指令接口外,RoCC 还具有中断、异常、浮点运算单元接口,这些接口都定义在chipyard/generators/rocket-chip/src/main/scala/tile/LazyRoCC.scala 文件中。
l  LazyROCC.scala在tile文件夹中,里面还有FPU浮点运算单元等等。

l  里面还有好几个ROCC accelerator例子,实现一个ROCC accelerator需要extend LazyRoCC
如下所示,LazyRoCC的参数只有一个给定,其他都是默认定义值;
还有其实现class AccumulatorExampleModuleImp,这里面一般是实现了ROCC和CORE的接口功能的连接,成功实现ROCC和Core的通信。
加速模块通过继承LazyRoCC 模块获得了 RoCC 的所有接口,根据指令译码的结果加速模块可以控制数据通路的执行:取数、计算、回写等,最终实现了对任务的加速。因此,加速器设计的任务主要是协调好 RoCC 接口进行存储访问和加速逻辑的编写。

l  看懂里面的几个ROCC并且模仿着,写大多数功能的ROCC没有问题。

十四:Rocc-coprocessor-construction.pdf学习
the term coprocessor, also calledaccelerator, is often used to indicate any kind of special purpose circuitcoupled to a processing unit. 它们通常用于帮助通用处理器处理一组受限的任务,其中专用于协处理器。
多年来,通常使用协处理器一词来指代各种各样的数字电路,从嵌入在处理器流水线中的专用算术单元(Floating Point Units(FPU)的情况)到外围核或图形处理器等外部设备。过去,某些此类设备(例如算术内核甚至FPU)曾经是用于扩展系统功能的外部芯片。如今,这些功能中的许多功能都集成在指令集中,并且通常嵌入到处理器的流水线中,此外,在现代片上系统(SoC)中,一些常用的计算核心通常集成在处理器的同一芯片中。
Rocket core 这个CPU实现了RISC-V指令集体系结构(ISA),并通过使用名为RoCC的专用接口来实现协处理器的存在。

1.   ISA
这些标准拓展之外,RISCV还支持很多非标准拓展。
在所有可能性中,这项工作最简单也是最有趣的一种,是在32位指令格式中的四个操作码的使用,他们被保留下来用于自定义拓展for custom extensions。这些自定义操作码的前两个,分别表示为custom-0和custom-1,将来的标准扩展将不再使用,而标记为custom-2和custom-3的操作码则保留以供将来的128位ISA扩展使用。


2.   The RoCC coprocessor interface


如前所述,RoCC接口定义了两个子接口,用于加速器和内核之间的数据交换。命令接口用于将指令和相应的数据发送到协处理器,而响应接口用于协处理器将结果发送到整数寄存器文件。
命令端口和响应端口均基于Chisel中可用的Decoupled接口。这种类型的连接基于FIFO(如就绪/有效协议),在该协议中,发送方驱动有效信号和数据,

l  Command port:

以上说明command接口的数据总线可能传输inst指令,也可能是rs1,rs2等信号保存了指令rs字段寻址的整数寄存器的值。

这些位假定的值会严重影响流水线的行为,尤其是在设置这些位时经常导致停顿,这尤其适用于inst_xd。
l  Response接口的data bus:


l  为了允许加速器直接访问一级数据高速缓存,RoCC接口为内存请求mem_req和响应mem_resp指定了两个通道。

mem_req sub-interface:
当加速器要向内存发出加载或存储操作时,可以使用mem_req子接口。mem_req链接也基于Decoupled接口。




mem_resp sub-interface:
该链接相对于先前讨论的链接存在实质性差异,实际上,它不是基于Decoupled接口的。这是因为协处理器无法使缓存保持等待状态,因此协处理器必须接受响应而不能延迟事务。实际上,mem_resp子接口不提供就绪信号,而是基于更简单的“有效”接口。这意味着只要有效线为高,协处理器就必须接受每个内存响应。使用此接口,发送方(缓存)驱动数据和有效信号,而接收方(加速器)只需要检查有效线是否高并接受传入的数据即可。


3.   Custom instructions

从该结果可以得出两种寄存器寻址模式。使用指令中的寄存器字段的寄存器,只能访问前32个寄存器。第二种使用rs1和rs2数据总线内容进行内部寻址,这基本上允许了无限的寄存器地址空间,并且可以使用高级代码中的变量进行寻址。这两种寻址模式将分别称为基于指令的寻址和基于数据的寻址。
l  Instruction:
考虑到读/写-加载/存储模型和两种寻址模式,可以定义我们的基本指令。
由于每个RoCC协处理器都映射到不同的自定义操作码,因此操作码字段不携带有关指令的信息。因此,funct7字段用于指定操作操作码,而xd,xs1和xs2位的不同配置用于确定寻址模式。表2.2列出了采用这种方法定义的指令。

l  RoCC command router是一个可配置的组件,用于缓冲自定义指令并将其根据操作码转发给正确的协处理器。

4.   通用的ROCC框架:Architecture overview
十五:rocket-chip generator仿真c程序
1.在 中新建测试文件夹xxxx,在文件夹里新建一个测试程序xxxx.c
2.修改以上路径文件夹里面的makefile:

3.执行make指令得到.riscv可执行文件
4.将.riscv放到你想要执行的位置
5.执行命令

十六. 对gemminiROCC进行功能测试:
1.        
这里面保存了测试的源代码。
然后可以生成可执行文件,根据以下操作:



2.       .riscv执行文件的生成

Benchmark文件夹内是源文件的文件夹其中是.C文件。Makefile可生成.riscv文件
l  写了一个C源文件my_conv_test,生成了可执行文件,随机生成输入矩阵完成conv卷积操作,验证CPU计算和用gemmini加速器计算的结果是否相同。成功验证了gemmini的功能。

l  使用verilator的一些列help:
Usage:
./simulator-chipyard-GemminiRocketConfig
[EMULATOR OPTION] ... [VERILOGPLUSARG] ... [HOST OPTION] ... BINARY [TARGET OPTION] ...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-6 10:50 , Processed in 0.017735 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表