目录
1.Chipyard Basics 环境构建(done)
2.Chipyard Simulation 仿真
3.Chipyard included RTL Generator 一些生成器组件
4.Chipyard Development Tools
5.VLSI Flow
6.Customization
10. Prototyping Flow
chipyard document 6.9 教程
2.1 Rocket Pipeline
3.1 基本Config top to buttom
3.2 各级cache大小参数及具体实现代码
3.2.1 各级cache大小参数
3.2.2 cache具体实现代码
3.2.3 utilization
4.1 VCU118: Is it possible to use a pre-built Linux Image?
5.1 在zynq上跑rocket chip
5.1.1 RISCV开发流程
5.1.2 generate Verilog source
5.2 在Xilinx Virtex-7 VC707上跑Rocket chip
5.2.1 generate Verilog source
5.3 on Nexys4ddr 上跑Rocket chip
5.3.1 How a Linux gets booted
5.3.2 工程下的文件
5.3.3 generate Verilog source
5.4 freedom/FPGA shell 学习配置
5.4.1 generate Verilog source
5.5 FPGA Development using the Chipyard SoC Design Framework PDF
5.5.1 chipyard/fpga文件夹
5.5.2 USB-JTAG 和 Debugger
5.5.3 fpga/src/main/scala文件夹
5.6 FPGA-Shell custom
5.7 my system
5.7.1 make install Verilog
1.1 riscv toolchain工具链
centos7虚拟机中直接指向
# auto-generated by build-toolchains.sh
export CHIPYARD_TOOLCHAIN_SOURCED=1
export RISCV=/home/ICer/chipyard_prj/chipyard/riscv-tools-install
export PATH=${RISCV}/bin:${PATH}
export LD_LIBRARY_PATH=${RISCV}/lib${LD_LIBRARY_PATH:+":${LD_LIBRARY_PATH}"}
1.2 Configs, Parameters, Mixins, and Everything In Between
这个可执行文件是一个simulator,它是根据构建的设计编译的。然后可以使用此可执行文件运行任何兼容的RV64代码。例如,运行一个riscv工具组件测试。./simulator-chipyard-RocketConfig $RISCV/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple
make run-binary BINARY=$RISCV/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple
make run-asm-tests
make run-bmark-tests
Ⅰ.Rocket Chip
4.3 页表(Page Table) - 知乎 (zhihu.com)
MMU原理 - 知乎 (zhihu.com)
Architectural and OS support for Virtual Memory - 知乎 (zhihu.com)
Ⅱ.Rocket Core
Ⅲ.BOOM Core
Ⅳ.Hwacha
Ⅴ.Gemmini
https://github.com/ucb-bar/gemmini/blob/master/README.md
Ⅵ.IceNet
Ⅶ.Test Chip IP
Chipyard包括一个测试芯片IP库,该库提供了在设计SOC时可能有用的各种硬件小部件。包括Serial Adapter, Block Device Controller, TileLink SERDES, TileLink Switcher, TileLink Ring Network, and UART Adapter, SPI Flash Model。
Ⅷ.SiFive Generator
Ⅸ.SHA3 ROCC Accelerator
Ⅹ.NVDLA
(17条消息) AI芯片:英伟达NVDLA结构分析_evolone的专栏-CSDN博客_nvdla
(17条消息) NVDLA学习笔记(1)_夏风喃喃的博客-CSDN博客_nvdla
神经网络加速器NVDLA顶层接口与工作流程 - 知乎 (zhihu.com)
Ⅰ.Chisel
Ⅱ.FIRRTL
Ⅲ. Treadle and FIRRTL Interpreter
Ⅳ. Chisel Testers
Ⅴ. Dsptools
Ⅵ. Barstools
Ⅶ. Dromajo
Ⅰ.
Ⅱ.
Ⅲ.
Ⅳ.
Ⅴ.
Ⅵ.
Ⅶ.
Ⅷ.
Ⅰ.Heterogeneous SoCs
Ⅱ. Integrating Custom Chisel Projects into the Generator Build System
Ⅲ. Adding a custom core
Ⅳ. RoCC vs MMIO
加速器Accelerator和定制IO设备可以通过以下两种方法加到SoC中:
以上两种方式在core/processor与定制block之间的通信方式上存在区别
MMIO设备通过 存储器映射寄存器 与core通信。
RoCC设备 通过定制协议和定制的非标准ISA指令与core通信。每个core最多有4个accelerators被定制的指令控制且可以与CPU分享resource。
Ⅴ. Adding a RoCC Accelerator
Ⅵ. MMIO Peripherals
Ⅶ. Dsptools Blocks
Ⅷ.. Keys, Traits, and Configs
Ⅸ. Adding a DMA Device
Ⅹ. Incorporating Verilog Blocks
ⅩⅠ. Memory Hierarchy
6.11. Memory Hierarchy — Chipyard main documentation
chipyard存储架构部分:
默认The default RocketConfig uses 16 KiB, 4-way set-associative instruction and data caches.
如果您想进一步减少使用的资源,可以将TileLink broadcast hub配置为使用a bufferless design。freechips.rocketchip.subsystem.WithBufferlessBroadcastHub
外部存储除了连接off-chip DRAM外,可以连接scratchpad并移除off-chip link。
ⅩⅡ. Chipyard Boot Process
12.1 bootrom
1. BootROM包含SoC通电时运行的第一条指令以及 详细说明系统组件的Device Tree Binary(dtb)
2. BootROM代码的程序集位于generators/testchipip/src/main/resources/testchipip/BootROM/BootROM.S 中
3. BootROM address 从0x10000开始(BootROMParams中指定),程序执行从reset vector复位向量0x10040开始(由BootROMParams中的linker script 和 reset vector给出),该地址0x10040由BootROM 汇编中的_hang标签标记
4. The Chisel generator在elaboration的时候将汇编好的指令 编码到 BootROM硬件中。因此如果要更改BootROM代码,则需要在BootROM目录下运行make,然后重新生成Verilog。 如果不想覆盖现有的bootrom.S,还可以通过修改配置中的BootROMParams Key,将生成器指向不同的bootrom image 。
12.2 bootloader
FESVR是一个在host CPU上运行的程序,可以使用Tethered Serial Interface (TSI)读取/写入目标系统存储的任意部分。
可执行文件使用tohost向FESVR发送命令,用于打印到控制台、代理系统调用和关闭SoC。
fromhost寄存器用于发回tohost命令的响应和发送控制台输入。
12.3 second-stage bootloader (Berkeley Boot Loader) BBL
ⅩⅢ. Adding a Firrtl Transform
ⅩⅣ. IOBinders and HarnessBinders
chipyard中使用了parameter key, IOBinders and HarnessBinders来减小在数字系统IOs和TestHarness之间的gap.
对于软件 RTL仿真或GL模拟,默认的HarnessBinder setv实例化各种外部device的软件仿真模型(例如external memory或UART),并将这些模型连接到ChipTop的IOs。
10.1 General Setup and Usage
10.2
下面RoCC协处理器接口的主要细节,并使用read/write操作模型对core和accelerator之间的数据交换的延迟进行了分析。对协处理器和存储器之间的数据传输,引入了一种load/store指令模型。
第一节介绍了组成RoCC接口的主要信号组和sub-interfacts,重点介绍了与core和L1cache缓存的通信。第二部分介绍了指令的格式和使用。第三部分描述了评估core与co-processor之间数据传输的性能和开销的方法和延迟研究。最后一节给出了一个类似的分析,描述了memory-sub-interfact的使用和性能。
除了以下这四个channel之外,RoCC接口还提供了更多的sub-interfact,以实现高级功能,特别是可以将加速器与FPU连接;共享PTW(page table walker),并与外部存储系统直接连接起来。这些额外的子接口是所谓的Extended RoCC接口的一部分。
该接口还提供一些更多的state信号和interrupt 线路,可用于与syncronising with the core or for signalling errors。
Ⅰ.cmd和response接口
cmd channel用来core送指令和相应的数据给co-processor,response接口则用于将结果从co-processor发送到integer register file。
Ⅱ. mem_req(request) mem_resp(response)接口
为了让协处理器可以访问存储而定义的接口。
DMA做为Master可以发送存取命令给存储系统。可以直接通过TileLink总线FrontendBus连接也可以通过TLtoAXI然后连接一个AXI4-DMA。
v
会在生成的SoC system中生成带有mbus-axi4 sbus-axi4 axi4-fpus三个总线转换
在以上文件中有Tile Parameters/Interconnect parameters/Additional device Parameters
withdefaultslaveport ------- AXI4toTL-frontbus
withdefaultmmioport ------- PeripheralBus-TLtoAXI4
https://github.com/ucb-bar/chipyard/issues/590
同样方法可以挂在pbus/cbus/mbus上
Top-level trait from GCD example not being generated · Issue #943 · ucb-bar/chipyard · GitHub
https://github.com/ucb-bar/chipyard/issues/628
Chisel初体验——高级参数化PART1: Site/Here/Up机制(五) - 知乎 (zhihu.com)
Chisel初体验——高级参数化PART2: Dipomacy机制(六) - 知乎 (zhihu.com)
9.1. TileLink Node Types — Chipyard documentation
正在上传…重新上传取消
https://github.com/ucb-bar/chipyard/blob/e3d23f10345cfafd9a2f4f8aacfe07c2746699f9/docs/Customization/MMIO-Peripherals.rst
TLRegisterRouter的参数分为三组参数,第一组参数确定寄存器路由器将放置在全局地址映射中的位置,以及将在其设备树条目中放置哪些信息。第二组参数是IO bundle构造函数,我们通过使用bundle特性扩展TLRegBundle来创建它。最后一组参数是模块构造函数,我们使用模块特性扩展TLRegModule来创建它。请注意,我们如何创建类似于AXI4版本的外围设备。
https://github.com/ucb-bar/chipyard/issues/760
https://github.com/ucb-bar/chipyard/issues/573
https://github.com/ucb-bar/chipyard/blob/e3d23f10345cfafd9a2f4f8aacfe07c2746699f9/generators/chipyard/src/main/scala/example/TutorialTile.scala
chipyard/NodeTypes.scala at e3d23f10345cfafd9a2f4f8aacfe07c2746699f9 · ucb-bar/chipyard · GitHub
https://github.com/ucb-bar/chipyard/pull/341
Remove MasterAXI4MMIOPort and SlaveAXI4Port by abejgonzalez · Pull Request #341 · ucb-bar/chipyard · GitHub
https://github.com/ucb-bar/chipyard/pull/347
顶层axi4 ports /mmio master ports / fbus slave ports
只要配置有memports 默认为AXI4端口:module TLInterconnectCoupler_15 为TL2AXI4
五级流水线基本结构:IF(PCGEN+Fetch) / ID / EX / MEM / WB
v
31个整数register file
2.1.1 IF stage
分为IOcells和Punchthrough ,有些ports只是仿真需要可以直接punchthrough到最外层chiptop。
可以通过AXI4-MEM ports 连接一个 外部Mem模块用于仿真
DigitTop可以选择配置以下外设
以下是L2cache的默认配置大小,可以配置L2cache的banks , ways , capacityKB , outerLatencyCycles , subBankingFactor
override config 在chiptop最外层只有Mem接口,config去掉了MMIO和Slave接口。
smallCore配置cache为4KiB直接映射cache
PgLevels:虚拟地址lookaside page页表的的levels,TLB
XLen:core的数据总线宽度
MaxHartIdBits:cores的数量,根据system配置自动确定
总线interconnect基本配置:
beatBytes总线宽度,一个时钟周期最大能请求的字节数
blockBytes:cache的linesize?
一些基本control bus上device的参数config
https://github.com/ucb-bar/chipyard/issues/957
https://github.com/ucb-bar/fpga-zynq#overview
1 Target Application (RISC-V binary)
will run on top of whatever kernel the rocket chip is running. Compiled by riscv-gcc or riscv-llvm.
https://github.com/riscv-collab/riscv-gcc
https://github.com/ucb-bar/esp-llvm
2 RISC-V Kernel (proxy kernel or RISC-V Linux)
runs on top of the rocket chip. The proxy kernel is extremely lightweight and designed to be used with a single binary linked against Newlib while RISC-V Linux is appropriate for everything else.
https://github.com/riscv-software-src/riscv-pk
3 Rocket Chip (rocket core with L1 instruction and data caches)
is instantiated on the FPGA. Many of its structures will typically map to various hard blocks including BRAMs and DSP slices. It communicates to the host ARM core on the Zynq via AXI.
4 Front-end Server (riscv-fesvr)
runs on the host ARM core and provides an interface to the rocket chip running on the FPGA (connected via AXI).
https://github.com/riscvarchive/riscv-fesvr
5 Zynq ARM Core (actually dual Cortex A9)
runs Linux and simplifies interfacing with the FPGA.
6 FPGA Board (Zybo, Zedboard, or ZC706)
contains the Zynq FPGA and several I/O devices. At power on, the contents of the SD card are used to configure the FPGA and boot Linux on the ARM core.
7 External Communication (TTY over serial on USB or telnet/ssh over ethernet)
allows the development system to communicate with the FPGA board.
8 Development System (PC with SD card reader)
generates the images to configure the FPGA.
make rocket
https://github.com/riscv-zju/riscv-starship
make bitstream :
生成verilog一般需要一个 StarshipFPGATop extends StarshipSystem extends RocketSubsystem 然后TestHarness
在rocket-chip默认配置中:
然后需要config文件 ,在此项目中:
class StarshipBaseConfig extends Config ++ BaseConfig
class StarshipFPGAConfig extends Config ++ StarshipBaseConfig
顶层CONFIG和顶层MODEL需要指明。
https://github.com/cnrv/fpga-rocket-chip
li s0, BRAM_BASE, jr s0 ( /rocket-chip/bootrom.S )
li s0, DDR_BASE, jr s0 ( /firmware/head.S )
enter_supervisor_mode(entry, hartid, dtb_output()) ( /riscv-pk/bbl/bbl.c )
make vivado_source
变量名 : MODEL顶层模块
CONFIG顶层配置
使用了默认变量生成configfreechips.rocketchip.system.DefaultConfig.v,需要其中ExampleRocketSystem模块。
https://github.com/Phantom1003/fpga-shells
make verilog
每个shell由Overlays组成,Overlays使用dependency injection来创建peripheral device interfaces,并将FPGADesign中的peripheral device interfaces连接到top-level shell模块。
大多数设备已经在 fpga-shell/src/main/scala/shell[/xilinx]中为它们定义了一个overlay。如果使用的是Xilinx设备,可能想使用Xilinx专用的overlay,因为它定义了一些你必须自己指定的东西。
一般需要创建一个扩展了Series7Shell或UltraScaleShell的device shell。如果你需要不同的功能(或者你不使用Xilinx设备),你可以扩展Shell并implement abstract members。
riscv-software-src/riscv-tools: RISC-V Tools (ISA Simulator and Tests) (github.com)
D:\桌面\2021学习记录\chipyard项目\riscv-software-toolchain-workshop-jan2015.pdf
riscv-software-src/riscv-isa-sim: Spike, a RISC-V ISA Simulator (github.com)
Spike, the RISC-V ISA Simulator。实现了一个或多个RISC-V harts的功能模型。riscv-isa-sim是一个RISC-V指令的仿真器,riscv-isa-sim的正常运行需要依赖riscv-pk和riscv-fesvr工具。
新的指令仿真
(12条消息) riscv-isa-sim的使用_a_weiming的博客-CSDN博客_riscv-isa-sim
(12条消息) Rocket之加速器_qihao-CSDN博客_rocket加速器
(12条消息) 如何建立自己的RISC-V编译环境--汇编?_a_weiming的博客-CSDN博客_riscv32 汇编
(12条消息) 如何建立自己的RISC-V编译环境--C_Code?_a_weiming的博客-CSDN博客_risc-v编译器
修改默认common.mk文件中 mcs文件生成的方式
在Makefile中,将FLASHED_PROGRAM设置为.bin文件路径。freedom-e-sdk生成的程序是.ihex格式。
riscv64-unknown-elf-objcopy -O binary ~/freedom-e-sdk/software/hello/debug/hello.elf ~/freedom-e-sdk/software/hello/debug/hello.bin
(6条消息) Rocket-Chip-Rom_a_weiming的博客-CSDN博客
Tiny Config benchmark problem · Issue #1011 · chipsalliance/rocket-chip (github.com)
All Aboard, Part 1: The -march, -mabi, and -mtune arguments to RISC-V Compilers - SiFive
Failed to compile c program in tests directory with 32bit configuration · Issue #23 · ucb-bar/chipyard (github.com)
All Aboard, Part 1: The -march, -mabi, and -mtune arguments to RISC-V Compilers - SiFive
Is it possible to use a 32bit address peripheral with a 64-bit core? · Issue #987 · ucb-bar/chipyard (github.com)
RISC-V GNU工具链的编译与安装 - 知乎 (zhihu.com)
学习第一步:RISC-V GCC工具链编译安装~_riscv
编译了riscv32 和 riscv64两个版本的工具链,可以根据chipyard/scripts/build-toolchains.sh里面的具体步骤看riscv32和riscv64的编译过程区别。 好像可以直接编译cross compile同时支持两者,暂时没有试。
Chipyard/tests/Makefile 里面修改编译器riscv32 or riscv64
需要修改DTIM大小,default scratchpad 太小导致仿真出问题。
Tiny Config benchmark problem · Issue #1011 · chipsalliance/rocket-chip (github.com)
修改后暂时helloworld.riscv仿真没问题。
???但是为什么将tiny core改为RV64不会需要修改DTIM大小,可以直接跑完仿真?
这个问题是因为我之前测的是DMA内存DMEM的原因,DMEM在rocket chip里面是直接写了一个scratchpad dram,仿真的时候不是single-cycle的, 然后我换成读写single-cycle SRAM的话,DMA几乎能跑满bandwidth, 每次读写是1cycle。
TileLink: Increase max burst size · Issue #1618 · chipsalliance/rocket-chip (github.com)
暂时SRAM没有burst, DMEM burst size 最大只能64Bytes .
怎么修改rocket chip的burst size大小
Rocket - tilelink - Fragmenter - wjcdx - 博客园 (cnblogs.com)
通过 TLFragmenter
实现burst大小调整:
Burst size : 2^8 Bytes = 256Bytes
Burst size : 2^10 Bytes = 1024Bytes
Max Burst size : 2^12 Bytes = 4096Bytes
default max burst size=4096B , 可以调整参数继续调大burst size?
现在例化一个DMA需要两个参数 ,address是DMA control的regmap基地址,以及DMA beatBytes等于总线data beatBytes宽度。
The DMA device can act as a bus master and can read and write physical memory. 理论上DMA应该支持contiguous transfer and scatter-gather lists两种模式。先设计contiguous transfer mode,但是为scatter-gather lists mode预留了config regmap bits。
Rocket chip目前a channel address bit length = 32bits,因为max physical address is 80040000
目前设计DMA 有三个control regmap寄存器如下表
base address:0x10016000, size 0x1000 bits
Offset |
Register(32bits) |
Documentation |
0x00 |
DMA control |
Control register |
0x04 |
DMA source |
Source Address |
0x08 |
DMA destination |
Destination Address |
EN[31] |
DMA 使能位 |
SWT[30] |
Software Transfer Trigger |
ECI[29] |
Enable Completion Interrupt |
TC[28] |
Transfer Complete. |
SG[27] |
Scatter-Gather List Input. |
ERR[26] |
DMA Transfer Error. |
TS[15:0] |
Transfer Size. |
由于TL总线只有a和d两个channel,所以暂时不能做到pipeline read+write操作,先研究TL-AXI4,再把DMA读写模块挂到AXI4总线上,AXI4总线有5个channel可以同时读写。
目前只能仿真先读一个Burst size,再写一个Burst size。
【原创】ZYNQ AXIDMA详解(一) - 霸天虎1108 - 博客园 (cnblogs.com)
AXI Central DMA - 云+社区 - 腾讯云 (tencent.com)
TL2AXI.pdf (sifive.com)
An introduction to AMBA AXI (arm.com)
Master ----- Interconnect(crossbar:arbiter+decoder) ----- slave
TLBuffer
TL2AXI4
(AXI4-Crossbar-input-slave-ports
:= AXI4Buffer() --->FIFO(width: 2) in each channel
:= AXI4UserYanker() --->将带有user字段的AXI4总线转换成没有user字段的AXI4总线
:= AXI4Deinterleaver(sbus.blockBytes)---> 用于处理AXI4总线不同id的交错响应,对响应进行重排序,以使得每个id的响应都是连续的
:= AXI4IdIndexer(params.idBits)---> 用于限制输出AXI4总线的id位宽
:= TLToAXI4()
:= TLWidthWidget(sbus.beatBytes)
:= TL-Crossbar-output-master-ports)
AXI42TL
TL-Crossbar-input-slave-ports
:= TLBuffer(BufferParams.default)
:= TLFIFOFixer(TLFIFOFixer.all)--->
:= TLWidthWidget(params.beatBytes)---> Width Converter
:= AXI4ToTL()
:= AXI4UserYanker(Some(1 << (params.sourceBits - fifoBits - 1)))
:= AXI4Fragmenter()--->将较大的事务切分成多个较小的事务,以缩小TileLink的最大逻辑传输
:= AXI4IdIndexer(fifoBits)
:*= AXI4-Crossbar-output-master-ports
在系统system构建完成之后,通过SIMAXIMEM和TestHarness添加了一条axi4总线,并且挂载了AXI-MEM作为slave.
深入 AXI4 总线(C0)旧版存档:突发传输机制 - 知乎 (zhihu.com)
LEN是指一个burst里transfer的个数为2^LEN,只有8bits,所以最大传输256*2^size bits。
SIZE指一个transfer的bit数为2^size bits
AWBURST代表三种不同的burst type:分别为 FIXED,INCR 以及 WRAP。使用 2 位二进制表示。
AXI4 burst最大256*XLENbits, Tilelink burst最大4096Bytes,所以将修改测试了一下外挂SIMAXIMem的读写没问题。
Mmio-port的burst size修改
这样修改后可以支持AXI4协议支持的最大burst大小,但是会有相应的buffer生成,有面积消耗。