本文用于记录与学习,参考
1.《手把手教你设计CPU.RISC-V处理器》(胡振波)
2. b站up主“芯来科技”相关教程
3. b站up主“Rong晔”相关教程
如有侵权,联系删除
一、RISC-V
1.1 特权模式
RISC-V 架构定义了 3 种工作模式,又称为特权模式(Privileged Mode)
- Machine Mode:机器模式,简称 M Mode
- Supervisor Mode:监督模式,简称 S Mode
- User Mode:用户模式,简称 U Mode
1.2 模块化指令子集
RISC-V 的指令集使用模块化的方式进行组织,每一个模块使用一个英文字母来表示。RISC-V 最基本也是唯一强制要求实现的指令集部分是由 I 字母表示的基本整数指令子集。使用该整数指令子集,便能够实现完整的软件编译器。
其他的指令子集部分均为可选的模块,具有代表性的模块包括M/A/F/D/C
- 以上模块的一个特定组合“IMAFD”,也被称为“通用”组合,用英文字母 G 表示。因此 RV32G 表示 RV32IMAFD,同理 RV64G 表示 RV64IMAFD
- 为了提高代码密度,RISC-V 架构也提供可选的“压缩”指令子集,用英文字母 C 表示。压缩指令的指令编码长度为 16 比特,而普通的非压缩指令的长度为 32 比特
- 为了进一步减少面积,RISC-V 架构还提供一种“嵌入式”架构,用英文字母 E 表示。该架构主要用于追求极低面积与功耗的深嵌入式场景。该架构仅需要支持 16 个通用整数寄存器,而非嵌入式的普通架构则需要支持 32 个通用整数寄存器。
- 通过以上的模块化指令集,能够选择不同的组合来满足不同的应用。例如,追求小面积、低功耗的嵌入式场景可以选择使用 RV32EC 架构;而大型的 64 位架构则可以选择 RV64G。
二、蜂鸟E200
RISC-V是哈佛结构,即指令存储和数据存储是分开的
2.1 简单的RISC-V处理器结构
- pc(program counter)寄存器:将指令从指令存储器读出来,决定读取哪条指令
- ctrl模块:译码,确定取出的这个32位指令蕴含什么信息,为其他模块提供控制信号,地址信号和立即数值。如add指令被译码后得到操作数存放的寄存器地址,去取出相应位置的寄存器值
- reg_file寄存器堆:存放寄存器值得地方
- imm_gen立即数扩展模块:若ctrl译码得到的是addi指令,因为不能直接使用立即数,要进行立即数扩展,从指令中取出的立即数需要根据指令的结构进行扩展,将其扩展为32位后,才能进行运算
- alu(arithmetic&logical unit)算数/逻辑运算单元
2.2 经典MIPS五级流水线
流水线本质上可以理解为一种以面积换性能(Trade Area for Performance)、以空间换时间(Trade Space for Timing)的手段。与其相对应的是状态机:状态机本质上可以理解为是一种以性能换面积(Trade Performance for Area)、以时间换空间(Trade Timing for Space)的手段
通过使用状态机,可以省掉上述流水线中的寄存器开销,还可以复用组合逻辑数据通路,因此面积开销比较小。但是每条指令都需要 5 个周期才能完成,吞吐率和性能很差。8051内核就没有流水线
- 取指(IF):指令取指(Instruction Fetch)是指将指令从存储器中读取出来的过程
- 译码(ID):指令译码(Instruction Decode)是指将从存储器中取出的指令进行翻译的过程。经过译码之后得到指令需要的操作数寄存器索引,可以使用此索引从通用寄存器组(Register File)中将操作数读出
- 执行(EX):指令执行(Instruction Execute)是指对指令进行真正运算的过程。在“执行”阶段的最常见部件为算术逻辑部件运算器(Arithmetic Logical Unit,ALU),作为实施具体运算的硬件功能单元
- 访存(MEM):访存(Memory Access)是指存储器访问指令将数据从存储器中读出,或者写入存储器的过程
- 写回(WB):写回(Write-Back)是指将指令执行的结果写回通用寄存器组的过程。如果是普通运
算指令,该结果值来自于“执行”阶段计算的结果;如果是存储器读指令,该结果来自于“访存”阶段从存储器中读取出来的数据
上图为经典MIPS五级流水线运行图,如果流水线没有停顿,理论上可以取得每个时钟周期都完成一条指令的性能
2.3 蜂鸟E200流水线总体结构
- 流水线的第一级为“取指(由 IFU 完成)”
- 蜂鸟 E200 处理器核很难严谨界定它的完整流水线级数为几级,原因如下:
- 译码(由 EXU 中完成)执行(由 EXU中完成)和写回(由 WB 完成)均处于同一个时钟周期,位于流水线的第二级
- 访存(由 LSU 完成)阶段处于 EXU之后的第三级流水线,但是 LSU 写回的结果仍然需要通 过 WB 模块写回通用寄存器组(Register File,Regfile)
- 由于蜂鸟 E200 处理器核的流水线的按序主体是位于第一级的“取指”和位于第二级的“执行”和“写回”,因此非严谨地定义蜂鸟 E200 处理器核的流水线深度为二级
2.4 蜂鸟E200系列处理器特性
2.5 蜂鸟E203处理器内核
- e203_cpu_top为整个系统的顶层,例化了2个模块,分别为e203_cpu,e203_srams,前者为处理器内核所有逻辑部分,后者为处理器内核所有sram部分,将两者分离,主要是方便asic的实现
- e203_clk_ctrl 用于控制处理器各个主要组件的自动时钟门控
e203_irq_sync 用于将外界的异步中断信号进行同步
e203_reset_ctrl 用于将外界的异步 reset 信号进行同步使之变成“异步置位同步释放”的复位信号
e203_itcm_ctrl 和 e203_dtcm_ctrl 用于控制 ITCM和 DTCM 的访问
e203_core 则是处理器核的主体部分,其中实现了处理器核的主要功能(取指令单元 e203_ifu,执行单元e203_exu,存储器访问单元 e203_lsu,总线接口单元 e203_biu)
2.6 蜂鸟E203配置
通过修改目录下的config.v文件中的宏定义便可实现不同的配置,配置选项参照在《手把手教你设计CPU.RISV-V处理器》4.6节。详细配置见github上e200_opensource项目doc目录下《蜂鸟E203开源内核简介.pdf》