# 基于RocketChip的CPU设计实验 **Repository Path**: foxtrot024/rocketchip_lab ## Basic Information - **Project Name**: 基于RocketChip的CPU设计实验 - **Description**: 将由Chisel语言生成的rocketchip_system Verilog语言源代码作为基础,根据要求对相应的模块进行重新设计,从而达到进行RISC-V CPU设计实验的目的。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-06-20 - **Last Updated**: 2024-03-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于RocketChip的CPU设计实验 ## 1. 前言 将由Chisel语言生成的RocketChip嵌入式处理器系统(rocketchip_system.v)的Verilog语言源代码作为基础,根据要求对相应的模块进行重新设计,并使用emulator仿真框架(基于Verilator开源工具)进行测试,从而达到进行RISC-V CPU设计实验的目的。 ## 2. 实验环境安装指南 ### 2.1 RISC-V交叉编译器 RISC-V交叉编译器是与Linux自带的GCC编译器类似的一套工具软件集合,不同的是,x86_64平台上Linux自带的GCC编译器会将源代码编译、链接成为适合在x86_64平台上运行的二进制代码(称为native code),而RISC-V交叉编译器则会将源代码编译、链接成为在RISC-V平台上运行的代码。 #### 2.1.1 安装依赖库 RISC-V交叉编译器的构建需要一些本地支撑软件包,可使用以下命令安装: `$ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev device-tree-compiler` #### 2.1.2 获取RISC-V交叉编译器的源代码 有两种方式获得RISC-V交叉编译器的源代码:一种是通过源代码仓库获取,使用以下命令: `$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain.git` 但由于RISC-V交叉编译器的仓库包含了Qemu模拟器的代码,下载后的目录占用的磁盘空间大小约为4.8GB,(从国内下载)整体下载所需的时间较长。为了方便国内用户,我们提供了另一种方式就是通过百度云盘获取源代码压缩包,链接和提取码如下: `链接: https://pan.baidu.com/s/1cMGt0zWhRidnw7vNUGcZhg 提取码: qbjh` 从百度云盘下载RISCV-packages/riscv-gnu-toolchain-clean.tar.gz文件(大小为2.7GB),再在Ubuntu环境下解压这个.tar.gz文件,采用如下命令行: `$ tar xf riscv-gnu-toolchain-clean.tar.gz` 之后就能够看到和进入当前目录下的riscv-gnu-toolchain文件夹了。 #### 2.1.3 构建(build)RISC-V交叉编译器 `$ cd riscv-gnu-toolchain` `$ ./configure --prefix=[your.RISCV.install.path]` `$ make` 以上命令中,[your.RISCV.install.path]指向的是你的RISC-V交叉编译器安装目录。如果安装是你home目录下的一个子目录(如~/riscv-install-dir),则最后的make install无需sudoer权限。但如果安装目录是系统目录(如/opt/riscv-install-dir),则需要sudoer权限(即在make install命令前加上sudo)。 #### 2.1.4 设置环境变量 `$ export RISCV=[your.RISCV.install.path]` `$ export PATH=$PATH:$RISCV/bin` 以上命令设置了RISCV环境变量,指向在第三步中的安装目录,并且将交叉编译器的可执行文件所在的目录加入到了系统路径中。 **建议将以上两个export命令,加入到`~/.bashrc`,`~/.profile`或 `/etc/profile`文件的末尾**。这样,每次重新启动(并打开终端程序)后,系统会自动设置这两个环境变量,而不用每次都要手动输入以上命令。 ### 2.2 Verilator仿真器 Verilator是一种Verilog/SystemVerilog仿真器,可用于编译代码以及代码在线检查。 #### 2.2.1 包管理器快速安装 使用Ubuntu的包管理器是最简单的安装方式,但是该方法不可能保证安装的Verilator是最新的,因此使用Git快速安装可能是一个更好的选择。 包管理器快速安装在命令行中输入下面的命令: `apt-get install verilator # On Ubuntu` #### 2.2.2 Git快速安装 从Git安装Verilator的灵活性最大。具体操作如下: `# Prerequisites:` `#sudo apt-get install git perl python3 make autoconf g++ flex bison ccache` `#sudo apt-get install libgoogle-perftools-dev numactl perl-doc` `#sudo apt-get install libfl2 # Ubuntu only (ignore if gives error)` `#sudo apt-get install libfl-dev # Ubuntu only (ignore if gives error)` `#sudo apt-get install zlibc zlib1g zlib1g-dev # Ubuntu only (ignore if gives error)` `git clone https://github.com/verilator/verilator # Only first time` `# Every time you need to build:` `unsetenv VERILATOR_ROOT # For csh; ignore error if on bash` `unset VERILATOR_ROOT # For bash` `cd verilator` `git pull # Make sure git repository is up-to-date` `git tag # See what versions exist` `#git checkout master # Use development branch (e.g. recent bug fixes)` `#git checkout stable # Use most recent stable release` `#git checkout v{version} # Switch to specified release version` `autoconf # Create ./configure script` `./configure # Configure and create Makefile` `make -j `nproc` # Build Verilator itself (if error, try just 'make')` `sudo make install` ### 2.3 RocketChip实验环境 下载lab_src目录中的rocketchip_lab压缩包,解压后rocketchip_lab的目录结构如下图所示: ![输入图片说明](image_20220620.png) 图中,generatated-src是存放Chisel生成的rocketchip_system Verilog源代码的地方,也是将来实验需要我们重新设计模块所在的目录;tests.mk文件是测试集的定义文件,需要使用什么测试程序来对RocketChip进行仿真测试,由该文件进行配置。 RocketChip实验环境的具体使用步骤如下: 生成RocketChip仿真模型 `make emulator` 使用指令集对RocketChip进行测试 `make run-asm-tests` 使用测试程序集对RocketChip进行测试 `make run-bmarks-test` 清理整个测试环境 `make clean` ## 3. RocketChip 简介 ### 3.1 Rocket-chip SoC生成器 通常Rocket指代Rocket“处理器”,而实际上Rocket-chip是一个SoC生成器(Generator),它用来根据不同的配置参数产生不同处理器的RTL代码,而后者才是一个真正的“处理器”。 下图为Rocket-chip的一种示例: ![输入图片说明](image_2022062101.png) 从图中可以看出,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系统的典型示例(我们的实验就采用了这种架构)。 ![输入图片说明](images/image_20220729.png) ### 3.2 Rocket的微架构 Rocket-core是一个标准的五级流水处理器(下图所示为其流水线示意图),它支持开源RV64GC RISC-V指令集,并使用Chisel硬件构造语言编写。 Rocket-core具有一个MMU,该MMU支持基于页面的虚拟内存,无阻塞数据缓存,同时支持分支预测功能。分支预测是可配置的,并由分支目标缓冲区(BTB),分支历史表(BHT)和返回地址堆栈(RAS)提供。 对于浮点运算,Rocket利用Berkeley的Chisel浮点运算单元实现。Rocket还支持RISC-V的内核、管理员和用户三种特权等级,可以启动Linux操作系统。 ![输入图片说明](image_2022062102.png) Rocket-core的数据通路和流水线结构可参看下面的二张图。 ![输入图片说明](images/image_2022082501.png) ![输入图片说明](images/image_2022062401.png) ## 4. RocketChip 设计实验 RocketChip 设计实验将涉及以下一些模块或部件的设计与实现: + [ALU:运算器](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab01) + [RRArbiter:Round-Robin仲裁器](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab02) + [HellaCacheArbiter:固定优先级的仲裁器](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab06) + [RVCExpander:16位RISC-V压缩指令扩展模块](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab03) + [IBuf:指令的预译码与缓存](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab04) + [BTB:动态分支预测模块,其中包含BTB(Branch Target Buffer)、BHT(Branch History Table),还实现了RAS(Return Address Stack)](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab05) + [TLB_1:虚拟地址到物理地址的转换,并对所有的存储空间访问进行合法性检查](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab13) + [ICache:指令一级缓存,其中就使用了BTB中定义的分支预测技术](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab07) + [MulDiv:乘法、除法运算,其中乘法采用的是迭代法,除法采用的是试商法](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab08) + [CSRFile:RISC-V指令集中定义的Control Status Registers模块](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab09) + [CLINT:局部中断模块(Core Local Interruptor,CLINT)](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab10) + [PLIC:全局中断控制器(Platform-Level Interrupt Controller,PLIC)](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab11) + [PTW:Page Table Walk,也就是硬件页表查找模块](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab12) + [DCache:数据一级缓存,采用MSHR技术实现了无阻塞缓存](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab14) + [Rocket:处理器核](https://gitee.com/foxtrot024/rocketchip_lab/tree/lab15)