目录
一 . 进入chipyard后的环境变量设置 3
二 . 6. Customization 自定义SoC学习: 3
一 . 进入chipyard后的环境变量设置
source ./env.sh
每一次进入cd chipyard文件后设置环境变量要记住。
二 . 6. Customization 自定义SoC学习:
Chipyard document 6.1 :
异构SoC可以有多个rocket/boom核,自己配置config文件,有教程配置config文件如下路径:
Chipyard document 6.2:
将定制chisel项目集成到generators的开发系统中,在Ubuntu系统中下载了idea和相关配置成功完成了helloworld project的实验。
Chipyard document 6.3 :
加速器和定制IO设备添加到SoC中的两种方式:MMIO和RoCC。
Chipyard document 6.4 :
添加一个RoCC accelerator的方法教程,不同的各种IOs可以看如下路径教程:
再将该accelerator的config添加到SoC中
Note that communication through a RoCC interface requires a custom software toolchain, whereas MMIO peripherals can use that standard toolchain with appropriate driver support.
展示了一个 使用 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)是异步执行任务的技术之一。
https://blog.csdn.net/qq_34003239/article/details/81231444 GCD是什么?
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:
Chipyard document 6.8 :adding a DMA Device
DMA 设备是作为主设备的 Tilelink 小部件。换句话说,DMA 设备可以向芯片的内存系统发送自己的读写请求。
Chipyard document 6.9 :Incorporating Verilog Blocks
Chipyard document 6.10 :Memory Hierarchy 内存结构
Scratchpad memory: https://blog.csdn.net/dark5669/article/details/56013548
L1 cache 的配置:
System bus 的配置:
The SiFive L2 Cache:
The Broadcast Hub:
The Outer Memory System:
Chipyard documentation 6.11 : Chipyard Boot Process
本节将详细介绍基于chipyard的 SoC 启动 Linux 内核的过程,以及您可以进行自定义此过程的更改。
Chisel 生成器在阐述时将组装的指令编码到 BootROM 硬件中,因此,如果要更改 BootROM 代码,则需要在 bootrom 目录中运行make,然后重新生成 Verilog。如果不想覆盖现有bootrom.S ,也可以通过覆盖配置中的BootROMParams key将生成器指向不同的引导映像。
Chipyard documentation 6.12:Adding a Firrtl Transform
Chipyard documentation 6.13:IOBinders
在 Chipyard 中,我们使用特殊parameters key,IObinders来实例化chiptop图层中的 IO cells,并确定要绑定到TestHarness中的chiptop 的 IO 的模块。
三 .Ubuntu终端命令学习:
https://www.cnblogs.com/z1141000271/p/13068022.html
四 .如何自己写一个 makefile :
https://www.cnblogs.com/luchen927/archive/2012/02/05/2339002.html
https://www.cnblogs.com/luchen927/archive/2012/02/06/2339083.html
https://blog.csdn.net/haoel/article/details/2886
五 .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文件构成的文件夹,暂时不清楚有什么用
https://zhuanlan.zhihu.com/p/148823761
未完待续
3 generator文件夹
3.1 rocket-chip/src/main/scala文件夹
https://blog.csdn.net/a_weiming/article/details/87738287
3.2
六 .tmux命令:
http://www.ruanyifeng.com/blog/2019/10/tmux.html
七 .可执行的软件代码:
make CONFIG=RocketConfig
./simulator-chipyard-RocketConfig $RISCV/riscv64-unknown-elf/share/riscv-tests/xxxx/xxxxx
在这里面。
2020.1.18目前为止有两个不同的toolchain可以生成可执行文件,一个在test里面,一个用于ROCC 自定义拓展指令集里,gemmini文件夹里。
八 .怎么给chipyard添加一个accelerator,有如下三个步骤:以sha3 accelerator为例。
Add the source code to generators
Add the accelerator project to the 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`)
注意“WithSha3Accel”mixin,它插入rocket chip config system
Sha3AccelImp
实现基于chisel的accelerator
后续还有一部分生成 没有完成,由于提示
还有用firemarshal implement sha3 software(Building SHA3 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版本的查看和切换:
https://www.cnblogs.com/yinyoupoet/p/13287407.html
https://blog.csdn.net/beijiu5854/article/details/77897767
e) Linux下如何退出vim的一些常用命令总结:
https://www.cnblogs.com/chen-nn/p/11531932.html
十 .3. Included RTL Generators
Tile:PTW:page-table walker。一个Tile还有L1 instruction cache, and L1 data cache,一个core(可以是rocket core,或者boom或者其他),还可以配置一个ROCC accelerator连接到core作为一个coprocessor。
2. TLB的原理作用:
https://zhuanlan.zhihu.com/p/108425561?utm_source=wechat_timeline
MMU: MMU是Memory Management Unit的缩写,中文名是内存管理单元,有时称作分页内存管理单元(英语:paged memory 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 and Writeback (Commit occurs asynchronously, so it is not counted as part of the “pipeline”).
4. Hwacha:
Hwacha 项目正在开发一种新的矢量架构,用于未来计算机系统,这些系统在功耗和能耗方面受到限制。
在定制SoC中加一个Hwacha,需要将 hwacha.DefaultHwachaConfig 配置文件加到SoC的配置中去。Hwacha vector unit 用RoCC端口连接到Tile(rocket or boom),默认通过system bus连接到memory system。还可以自定义改变Hwacha vector unit的配置,通过查看generators/hwacha/src/main/scala/configs.scala文件里的可能配置参数。 最后,需要安装toolchain。
https://blog.csdn.net/dark5669/article/details/56013548 scratchpad memory介绍
Gemmini非标准ISA拓展在(ISA包括configuration instructions, data movement instructions (from main memory to the Gemmini scratchpad, and from the Gemmini accumulators to main memory), and matrix multiplication execution instructions.) https://github.com/ucb-bar/gemmini/blob/master/README.md 被指定。上述网站中可以查看ISA的具体格式。
由于 Gemmini 指令不会通过 GNU binutils 汇编器公开,因此提供了几个 C micros来构造指令编码来调用这些指令。
Gemmini can also be used to run ONNX-specified neural-networks through a port of Microsoft’s ONNX-Runtime framework. The port is included as the onnxruntime-riscv repository 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 package
3.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中设置:
自定义一个Gemmini test:
Done!
ISA:
本节介绍Gemmini的汇编级ISA,它由自定义RISC-V指令组成。
以下指令是在Gemmini的角度来看的:
Configuration:
https://github.com/ucb-bar/gemmini/blob/master/README.md
1 . Architecture
https://github.com/ucb-bar/gemmini/tree/caaf781ec9d69e45443e496046bc6ab439e3e54f
脉动阵列的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]。由于main memory和专用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文件夹中各文件的作用
https://www.freesion.com/article/71301285507/
PE(process element)是阵列最小单元,实现一维乘加计算。然后PEs规律地按照行列排列成二维的Tile,需要注意Tile里每一个PE是纯组合地连接,PE之间并无寄存器存储中间结果。Tiles流水地排列起来组成整个脉动阵列,Tile之间插入了寄存器。这一点从后面的代码分析可以了解得更清楚。需要计算的数据则被提前按照一定规律或是存入脉动阵列或是排列在脉动阵列周围的存储器(bank)里。
PE模块,PE模块的参数如下:
T <: Data表示,T类型可以是Data的任何子类。其中inputType, outputType, accType三个变量指定加速器数据类型位宽,分别代表输入数据、输出数据和加速器中间变量,默认值是:
在Configs.scala里定义了这些参数
df定义了数据流类型Dataflow在Dataflow.scala里。
latency参数指定要在PEs中添加多少个移位寄存器,因为有些数据类型的乘加操作无法在一个周期完成,如浮点数等。
IO端口定义
2. Tile.scala
PE构成的2D阵列
/**
十一 .Ubuntu中使用github管理项目
https://blog.csdn.net/xyh930929/article/details/80422481
十二 .chisel 高阶用法简介–rocket-chip generator :diplomacy,cake pattern和参数化。
https://zhuanlan.zhihu.com/p/87450946
十三 .ROCC 和 MMIO加速器的学习
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,每个加速器对应一个。以下例子:
一般在下图所示位置:会出现
ROCC-coprocessor-construction pdf学习
SHA3 Software Workloads:
https://github.com/ucb-bar/sha3/blob/master/software/README.md
An Introduction to the Rocket Custom Coprocessor Interface:
https://docs.google.com/document/d/1CH2ep4YcL_ojsa3BVHEW-uwcKh1FlFTjH_kg5v8bxVw/edit#
RoCC接口支持将custom coprocessor或accelerator集成到RISC-V core。
有一些必需接口default RoCC interface,也有一些可添加可配置的接口extended RoCC interface供功能选择。
对于信号的directions和descriptions都是从accelerator的角度来进行的:
此外,included inside的cache必须在rocketTile内wired up:
Twins之间是通过如下方式连接:outer twin总是会包括inner twin的instance,给outer twin传递 a reference。RocketTile是outer twin,RocketTileModle是inner twin。
rocket-chip-read/cake_pattern.md at master · cnrv/rocket-chip-read (github.com)
Cake pattern构建需要的三种classes :
以上没有展示class PWMModule,这个没有展示的模块
流程看以上网站
然后Creating Chisel Tests for Accelerator
再Checking build.sbt before Running Chisel Tests
接下来是一些测试教学
Done!
2) https://github.com/meton-robean/Vector_MulAdd_Accelerator/tree/master/rocc/accelerators RoCC Accelerators config
3) Vector_MulAdd_Accelerator/rocc/zynq at master · meton-robean/Vector_MulAdd_Accelerator (github.com)
这个里面WithRoccExample 是RoCC顶层配置示例,里面还有很多要用到的config。
可以看出,在rocket system和system两个文件夹里分别有配置文件configs,里面分别是 withxxx 和 xxxconfig如上两图所示。
7. document6.5 MMIO peripherals
To create a RegisterRouter-based peripheral, you will need to specify a parameter case class for the configuration settings, a bundle trait with the extra top-level ports, and a module implementation containing the actual RTL.
https://chipyard.readthedocs.io/en/latest/Customization/MMIO-Peripherals.html
8. 挂载一个ROCC accelerator实战
https://www.chiselchina.com/forum/topic/16/rocc-%E5%8A%A0%E9%80%9F%E5%99%A8%E8%AE%BE%E8%AE%A10-%E7%AE%80%E4%BB%8B
ROCC可以通过RISC-V 自定义扩展指令集 作为命令控制RoCC 执行。Rocket Chip主要为RoCC设计提供了完整的接口,主要包括访存接口、指令接口(包括cmd和resp)。访存接口包括L1DCache、L2DCache、CMD Rocket寄存器等。除了访存接口、指令接口外,RoCC 还具有中断、异常、浮点运算单元接口,这些接口都定义在 chipyard/generators/rocket-chip/src/main/scala/tile/LazyRoCC.scala 文件中。
求最小公倍数加速器设计:
https://www.chiselchina.com/forum/topic/17/rocc-%E5%8A%A0%E9%80%9F%E5%99%A8%E8%AE%BE%E8%AE%A11-rocket-%E5%AF%84%E5%AD%98%E5%99%A8%E8%AE%BF%E5%AD%98%E4%B9%8B%E6%B1%82%E6%9C%80%E5%B0%8F%E5%85%AC%E5%80%8D%E6%95%B0/2
这一步目前还不知道TOP-Level project的在哪里设置。????已经解决
https://github.com/ucb-bar/chipyard/blob/64632c8aeef5386b4840e324be4429c0ceaac635/variables.mk
最后还是用了文件分开的格式来构建ROCC,详情见上一个标题2.
接下来进行测试:
将测试.c文件写好放入tests文件夹中,然后makefile文件中加上该执行文件,执行make命令生成.riscv可执行文件,即可生成测试可执行文件。
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 文件中。
LazyROCC.scala在tile文件夹中,里面还有FPU浮点运算单元等等。
里面还有好几个ROCC accelerator例子,实现一个ROCC accelerator需要extend LazyRoCC
如下所示,LazyRoCC的参数只有一个给定,其他都是默认定义值;
还有其实现class AccumulatorExampleModuleImp,这里面一般是实现了ROCC和CORE的接口功能的连接,成功实现ROCC和Core的通信。
加速模块通过继承 LazyRoCC 模块获得了 RoCC 的所有接口,根据指令译码的结果加速模块可以控制数据通路的执行:取数、计算、回写等,最终实现了对任务的加速。因此,加速器设计的任务主要是协调好 RoCC 接口进行存储访问和加速逻辑的编写。
看懂里面的几个ROCC并且模仿着,写大多数功能的ROCC没有问题。
十四:Rocc-coprocessor-construction.pdf学习
the term coprocessor, also called accelerator, is often used to indicate any kind of special purpose circuit coupled to a processing unit. 它们通常用于帮助通用处理器处理一组受限的任务,其中专用于协处理器。
多年来,通常使用协处理器一词来指代各种各样的数字电路,从嵌入在处理器流水线中的专用算术单元(Floating Point Units(FPU)的情况)到外围核或图形处理器等外部设备。过去,某些此类设备(例如算术内核甚至FPU)曾经是用于扩展系统功能的外部芯片。如今,这些功能中的许多功能都集成在指令集中,并且通常嵌入到处理器的流水线中,此外,在现代片上系统(SoC)中,一些常用的计算核心通常集成在处理器的同一芯片中。
Rocket core 这个CPU实现了RISC-V指令集体系结构(ISA),并通过使用名为RoCC的专用接口来实现协处理器的存在。
这些标准拓展之外,RISCV还支持很多非标准拓展。
在所有可能性中,这项工作最简单也是最有趣的一种,是在32位指令格式中的四个操作码的使用,他们被保留下来用于自定义拓展for custom extensions。这些自定义操作码的前两个,分别表示为custom-0和custom-1,将来的标准扩展将不再使用,而标记为custom-2和custom-3的操作码则保留以供将来的128位ISA扩展使用。
如前所述,RoCC接口定义了两个子接口,用于加速器和内核之间的数据交换。命令接口用于将指令和相应的数据发送到协处理器,而响应接口用于协处理器将结果发送到整数寄存器文件。
命令端口和响应端口均基于Chisel中可用的Decoupled接口。这种类型的连接基于FIFO(如就绪/有效协议),在该协议中,发送方驱动有效信号和数据,
Command port:
以上说明command接口的数据总线可能传输inst指令,也可能是rs1,rs2等信号保存了指令rs字段寻址的整数寄存器的值。
这些位假定的值会严重影响流水线的行为,尤其是在设置这些位时经常导致停顿,这尤其适用于inst_xd。
Response接口的data bus:
为了允许加速器直接访问一级数据高速缓存,RoCC接口为内存请求mem_req和响应mem_resp指定了两个通道。
mem_req sub-interface:
当加速器要向内存发出加载或存储操作时,可以使用mem_req子接口。mem_req链接也基于Decoupled接口。
mem_resp sub-interface:
该链接相对于先前讨论的链接存在实质性差异,实际上,它不是基于Decoupled接口的。这是因为协处理器无法使缓存保持等待状态,因此协处理器必须接受响应而不能延迟事务。实际上,mem_resp子接口不提供就绪信号,而是基于更简单的“有效”接口。这意味着只要有效线为高,协处理器就必须接受每个内存响应。使用此接口,发送方(缓存)驱动数据和有效信号,而接收方(加速器)只需要检查有效线是否高并接受传入的数据即可。
从该结果可以得出两种寄存器寻址模式。使用指令中的寄存器字段的寄存器,只能访问前32个寄存器。第二种使用rs1和rs2数据总线内容进行内部寻址,这基本上允许了无限的寄存器地址空间,并且可以使用高级代码中的变量进行寻址。这两种寻址模式将分别称为基于指令的寻址和基于数据的寻址。
Instruction:
考虑到读/写-加载/存储模型和两种寻址模式,可以定义我们的基本指令。
由于每个RoCC协处理器都映射到不同的自定义操作码,因此操作码字段不携带有关指令的信息。因此,funct7字段用于指定操作操作码,而xd,xs1和xs2位的不同配置用于确定寻址模式。表2.2列出了采用这种方法定义的指令。
RoCC command router是一个可配置的组件,用于缓冲自定义指令并将其根据操作码转发给正确的协处理器。
十五:rocket-chip generator仿真c程序
(1条消息) RISC-V --rocket-chip generator介绍及其仿真使用_Guardian_Bud-CSDN博客
1.在 中新建测试文件夹xxxx,在文件夹里新建一个测试程序xxxx.c
2.修改以上路径文件夹里面的makefile:
3.执行make指令得到.riscv可执行文件
4.将.riscv放到你想要执行的位置
5.执行命令
十六. 对gemmini ROCC进行功能测试:
1.
这里面保存了测试的源代码。
然后可以生成可执行文件,根据以下操作:
Benchmark文件夹内是源文件的文件夹其中是.C文件。Makefile可生成.riscv文件
(1条消息) RISC-V --rocket-chip generator介绍及其仿真使用_Guardian_Bud-CSDN博客
写了一个C源文件my_conv_test,生成了可执行文件,随机生成输入矩阵完成conv卷积操作,验证CPU计算和用gemmini加速器计算的结果是否相同。成功验证了gemmini的功能。
使用verilator的一些列help:
Usage:
./simulator-chipyard-GemminiRocketConfig
[EMULATOR OPTION] … [VERILOG PLUSARG] … [HOST OPTION] … BINARY [TARGET OPTION] …
Run a BINARY on the Rocket Chip emulator.
Mandatory arguments to long options are mandatory for short options too.
EMULATOR OPTIONS
-c, --cycle-count Print the cycle count before exiting
+cycle-count
-h, --help Display this help and exit
-m, --max-cycles=CYCLES Kill the emulation after CYCLES
+max-cycles=CYCLES
-s, --seed=SEED Use random number seed SEED
-r, --rbb-port=PORT Use PORT for remote bit bang (with OpenOCD and GDB)
If not specified, a random port will be chosen
automatically.
-V, --verbose Enable all Chisel printfs (cycle-by-cycle info)
+verbose
EMULATOR DEBUG OPTIONS (only supported in debug build – try make debug
)
-v, --vcd=FILE, Write vcd trace to FILE (or ‘-’ for stdout)
-x, --dump-start=CYCLE Start VCD tracing at CYCLE
+dump-start
EMULATOR VERILOG PLUSARGS
+tilelink_timeout=INT
Kill emulation after INT waiting TileLink cycles. Off if 0.
(default=0)
+max_core_cycles=INT
Kill the emulation after INT rdtime cycles. Off if 0.
(default=0)
+uart_tx=INT
Enable/disable the TX to speed up simulation
(default=1)
HOST OPTIONS
-h, --help Display this help and exit
+permissive The host will ignore any unparsed options up until
+permissive-off (Only needed for VCS)
+permissive-off Stop ignoring options. This is mandatory if using
+permissive (Only needed for VCS)
–rfb=DISPLAY Add new remote frame buffer on display DISPLAY
+rfb=DISPLAY to be accessible on 5900 + DISPLAY (default = 0)
–signature=FILE Write torture test signature to FILE
+signature=FILE
–chroot=PATH Use PATH as location of syscall-servicing binaries
+chroot=PATH
HOST OPTIONS (currently unsupported)
–disk=DISK Add DISK device. Use a ramdisk since this isn’t
+disk=DISK supported
TARGET (RISC-V BINARY) OPTIONS
These are the options passed to the program executing on the emulated RISC-V
microprocessor.
EXAMPLES
3 . DMA的读取和写入内存
DMA读取节点目的是将内存中的数据读取到Buffer,因此DMA读取节点需要将基地址和读取字节大小发送到内存模块,根据内存模块的反馈信号决定多拍的发送时机和DMA读取完成与否。
本设计将控制DMA运行节点挂在到PeripheryBus,DMA读取节点和DMA写节点挂在到FrontBus。这两种总线使用的都是TileLink总线协议,因此可以调用chipyard提供的TileLink总线访问API对内存进行读写。
4 .基于TileLink的DMA设计——节点互联
5 .基于TileLink的DMA设计——cake pattern设计模式
cake pattern 是chipyard生成器设计的模式,这个蛋糕的设计一般有三层:TestHarness、Top和自定义硬件特质,这里的自定义硬件就是DMA。
这一部分代码放在DigitalTop.scala中
这一部分放在ConfigFragments.scala
下面这部分是chipyard芯片默认的一些配置信息,所以新建的MMIO接口的DMA需要添加进去,分为两部分:
6 .对DMA进行测试
用测试代码进行测试,起初一直出错,后来发现是因为和GCD 这个MMIO有存储器映射的地址冲突导致的。
目前的状态测试完成,DMA读写内存功能均正确。
7 .目前地址映射产生的address map:
现在如上,gcd和dma的adress map不重叠了。把GCD的基地址改成了1000
环境编译过程中出现warning:
这个好像影响不大。
最后完成了DMA的软硬件测试!
以上这种改动方式,是把DMA 这个实现的部分放到了digital top 以及chiptop等chipyard的顶层模块中去,导致每次构建新的make 仿真环境都会进行以上两个顶层模块的加载,所以DMA总是会存在在加了之后的每次模拟环境中。
8 .另一种cake pattern的DMA实现方式。(这里还有个待解决的问题:已解决)
以下方式只对原始代码进行了以下两处修改:
如果不想让DMA出现在你的chipyard构造中,可以把图的黄色部分改为下面一行注释的部分。
还有一个问题没有解决?为什么digitaltop和chiptop中的那些实现成分一定会在每次make config=xxx时都加载?这是在代码的哪一部分实现的?
找到原因了,因为maikefile里面的变量默认设置。
https://github.com/ucb-bar/chipyard/blob/64632c8aeef5386b4840e324be4429c0ceaac635/variables.mk
以上网址的文件里还规定了仿真生成文件的命名方式。各种默认的配置等。
9 . makefile variables shared across multiple makefiles
https://github.com/ucb-bar/chipyard/blob/64632c8aeef5386b4840e324be4429c0ceaac635/variables.mk
十八.ROCC的访存方法学习
访存带宽远远跟不上加速器数据吞吐量,这是数据密集型加速器设计或对单层循环进行加速的诟病。另外,Rocket core 总线带宽是固定的,假设总线宽度为64bits,那么取数最大的速率是 64bits/Hz。尽管可以使用片上缓存或乒乓缓存作预取或数据重用,但是幻想循环完全展开在一个周期内完成变的不太现实。因此,为减少加速器等待访存时间提高整体加速速率,对 RoCC 访存模式性能分析是很有必要的。
1 . ROCC两种基本的访存方式以及拓展方式(待解决问题)
rocket 寄存器访存
L1 Dcache访存
除此之外 RoCC 提供总线访问机制,可以单独写访存控制器挂在 RoCC 总线上,也就是说 RoCC 可扩展 DMA 访存模式。
实现如下:
修改 chipyard/generators/rocket-chip/src/main/scala/tile/LazyRoCC.scala
首先在 LazyRoCC 中生成 一个 TLNode ,然后在 HasLazyRoCC 特质中将 tldmaNode 挂载到 BaseTile 的 tlMasterXbar 总线上。因此,所有混入 HasLazyRoCC 生成 RoCC 的 SOC 就具有 tldmaNode 节点。在继承 LazyRoCC 生成自定义 RoCC时,将 DMA client node 连接到 tldmaNode,通过 tlMasterXbar 总线最终现访存功能。
然后在相应的ROCC实现模块
但是仿真的时候检测不到MyDMA这个class,所以需要把myDMA放到LCM的构造目录中,package LCMRoCC。
但是MyDMA 这个class的参数调用时出现了一点问题,待解决。之前实现的MyDMA class应该有两个参数在实现时需要被set。解决这个问题后新出现的问题是 control.node。现在知道contol.node本来是挂载pbus上,现在由于不能ROCC class没有 所以用不了fpus和pbus。
2 .icenet的了解学习
https://chipyard.readthedocs.io/en/latest/Generators/IceNet.html
icenet 是 chipyard 生成器中的一个子工程,实现了网卡的功能。icenet 利用 DMA 实现数据网卡和内存间的传输,相比与之前设计的DMA,icenet 的 DMA 具有如下优点。
可设置 DMA 通道数
解决了地址对齐问题
具有读内存缓存区
读写掩码设置
3 .分别使用DMA和Cache控制读写ROCC
RoCC 译码后的结果,指明由谁控制访存、基地址、长度和读写方向。
代码如RoCCIceDMA中所示。
十九.FireSim simulation学习
2.2. FPGA-Accelerated Simulation — Chipyard documentation
FireSim
2.3. Setting up your Manager Instance — FireSim documentation
1 . Introduction
FireSim是一个open source-accurate FPGA 加速全系统硬件仿真平台,在cloud FPGA (Amazon EC2 F1) 上运行。FireSim 允许 RTL 级仿真,速度比软件 RTL 模拟器快。FireSim 还提供了额外的设备模型来允许进行全系统仿真,包括内存模型和网络模型。
FireSim 目前仅支持在启用 Amazon EC2 F1 FPGA 的虚拟实例上运行。
2 . set up environment
注册AWS账号
https://us-east-2.console.aws.amazon.com/console/home?region=us-east-2#
在run ssh -i firesim.pem ec2-user@INSTANCE_PUBLIC_IP 这个命令时,出现如下错误已解决。
Permissions for ‘.ssh/id_rsa’ are too open报警解决办法 - 德全个人网站 (findme.wang)
到这一步进行不下去了,SSH一直连接不上,AWS中也没有找到对应版本的AMI.
二十. Chipyard的几种仿真方式
1 . basics
Chipyard支持两种仿真种类:
会生成log .vcd波形文件 .out文件等
3. Mapping to an FPGA:
4. toolchains
5 . Sims
所以,基于FPGA的仿真只有firesim和FPGA prototyping两种。
6 . Rocket的调试模块
Debug with GDB:
https://github.com/chipsalliance/rocket-chip#-debugging-with-gdb
DUT代表Device under Test,测试中设备。
Emulator指的是make config = xxx,生成的仿真环境
Emulator和simulator的定义和区别联系:
http://renyan.spaces.eepw.com.cn/articles/article/item/88170
Spike:https://github.com/riscv/riscv-isa-sim#debugging-with-gdb
Spike有interactive debug model
GDB:GNU project debugger。是GNU工具链中的调试软件,可以用于在主机PC的Linux资源中调试运行的程序,同时也能用于调试嵌入式硬件。
Hart(hardware thread):
7 . 蜂鸟E200的调试机制概述和仿真
常用的调试机制有:交互式调制和追踪调试。
Riscv调试模式,调试指令以及调试机制CSR和调试中断:
二十一.chipyard document第八章学习advanced concepts
8. Advanced Concepts — Chipyard documentation
1 . Tops, Test-Harnesses, and the Test-Driver
在chipyard SoC中,三种最高级别的hierarchy是:ChipTop (DUT), TestHarness, and the TestDriver。Chiptop和Test Harness都是由chisel generators生成。而TestDriver作为testbench,是rocket chip 中的Verilog 文件。
Chiptop是是实例化了system submodules的顶层模块,通常是一个concrete class DigitalTop的例化。
System extends subsystem extends basesubsystem 。
Basesubsystem例化了顶层总线frontbus,systembus,peripherybus等等,但是没有指定拓扑结构。
2 . Communicating with the DUT
Debugging With Gdb/JTAG
3 . Debugging RTL
8.3. Debugging RTL — Chipyard documentation 一些waves 和 printf 的仿真方法。
二十二: DigitalTop顶层class的分析
1 . DigitalTop class 默认的内容
2 . TutorialConfigs.scala 配置默认的内容