RISC-V-数字设计与集成电路(上)
RISC-V-数字设计与集成电路(上)
项目简介
将设计和优化RISC-V处理器
阶段1:设计和演示处理器
第2阶段:
▪ ASIC实验室-实现高速缓存并生成完整的芯片布局
▪ FPGA实验室-添加视频显示和图形加速器
讨论如何设计处理器
什么是RISC-V?
•加州大学伯克利分校第五代RISC设计
•高质量、免许可、免版税的RISC ISA规范
•在工业界和学术界都经历了快速发展
•受不断增长的共享软件生态系统的支持
•适用于从微控制器到超级计算机的所有级别的计算系统
–32位、64位和128位变体(在课堂上使用32位,教科书使用64位)
•非营利RISC-V基金会维护的标准
基金会成员(60以上)
指令集体系结构(ISA)
•CPU(中央处理器,又称核心)的工作:
执行指令
•指令:CPU的基元操作
–依次执行的指令
–每条指令只做少量的工作(较大程序的一小部分)。
–每条指令都有一个应用于操作数的运算,
–并且可能用于更改指令序列。
•CPU属于“系列”,每个都实现自己的指令集
•CPU的特定指令集实现指令集体系结构(ISA)
–示例:ARM、Intel x86、MIPS、RISC-V、IBM/摩托罗拉PowerPC(旧Mac)、Intel IA64…
RISC处理器指令简介
编译器生成机器指令,以以下方式执行程序:
•加载/存储指令在主存储器(缓存层次结构)和核心寄存器文件之间移动操作数。
•寄存器/寄存器指令对作为操作数的寄存器文件值执行算术和逻辑运算,结果返回寄存器文件。
•寄存器/立即指令对寄存器文件值和常量执行算术和逻辑运算。
•分支指令用于循环和if-then-else(数据相关操作)。
•跳转用于函数调用和返回。
完整的RV32I ISA指令集
*在ASIC项目中实施
RISC-V指令格式综述
机器指令的二进制编码。注意常见字段。
RV32I ISA要求的“状态”
每条指令在执行过程中读取并更新此状态:
•寄存器(x0..x31)
−寄存器文件(或regfile)Reg包含32个寄存器x 32位/寄存器:Reg[0]…Reg[31]
−指令中rs1字段指定的第一个寄存器读取
−指令中rs2字段指定的第二个寄存器读取
−写入指令中rd字段指定的寄存器(目标)
−x0始终为0(忽略对Reg[0]的写入)
•程序计数器(PC)−保存当前指令的地址
•内存(MEM)—在一个32位字节寻址的内存空间中同时保存指令和数据
−将对指令(IMEM)和数据(DMEM)使用单独的存储器
▪ 稍后我们将用指令和数据缓存替换这些
−从指令存储器读取(提取)指令(假设IMEM为只读)
−加载/存储指令访问数据存储器
RISC-V状态元素
State对处理器执行状态的所有信息进行编码:
–PC寄存器
–32个寄存器
–内存
注意:对于这些状态元素,时钟用于写入,但不用于读取(异步读取、同步写入)
RISC-V微体系结构组织化
数据路径+控制器+外部存储器
微体系结构
单个指令集体系结构的多个实现:
–单循环
–每条指令在一个时钟周期内执行。
–多周期
–每条指令被分解为一系列较短的步骤,每个时钟周期一步。
–管道化(“多循环”上的变体)
–每条指令被分解为一系列步骤,每个时钟周期一个步骤
–多条指令通过时间重叠同时执行。
–超标量
–多个功能单元同时执行多个指令
–出现故障…
–指令由硬件重新排序
第一个设计:每循环一条指令RISC-V机器
在时钟的每一刻,计算机都执行一条指令
1.当前状态输出驱动组合逻辑的输入,其输出稳定在下一个时钟沿之前的状态值
2.在上升时钟沿,所有状态元素都用组合逻辑输出更新,并且执行移动到下一个时钟周期(下一条指令)
指令执行的基本阶段
实现添加指令
add rd, rs1, rs2
指令对机器状态进行两次更改:
Reg[rd] = Reg[rs1] + Reg[rs2]
PC = PC + 4
用于添加的数据路径
添加的时序图
执行子指令
sub rd, rs1, rs2
Reg[rd] = Reg[rs1] - Reg[rs2]
与加法几乎相同,只是现在必须减去操作数而不是相加
•inst[30]在加法和减法之间进行选择
add/sub的数据路径
执行其他R格式指令
所有这些都是通过解码funct3和funct7字段并选择适当的ALU函数来实现的
实现addi指令
•RISC-V汇编指令:使用“I型”指令格式
addi rd, rs1, integer
Reg[rd] = Reg[rs1] + sign_extend(immediate)
示例:
addi x15, x1, -50
审查:添加/子的数据路径
将addi加载项添加到数据路径
I-type直接格式
imm[31:0]
•指令的高12位(inst[31:20])复制到立即数的低12位(imm[11:0])
•立即数通过复制inst[31]的值来进行符号扩展,以填充立即数值的高20位(imm[31:12])
将addi加载项添加到数据路径
也适用于所有其他I格式算术指令
实现Load Word指令
•RISC-V汇编指令:也使用“I型”指令格式
lw rd, integer(rs1)
Reg[rd] = DMEM[Reg[rs1] + sign_extend(immediate)]
示例:
addi x14,8(x2)
审查:将addi加载项添加到数据路径
将lw添加到数据路径
将lw添加到数据路径
所有RV32装载说明
funct3字段编码加载数据的大小和有符号性
支持较窄的负载需要额外的电路,从存储器加载的值中提取正确的字节/半字,并在写回寄存器堆之前将结果进行符号或零扩展到32位。
实现Store Word指令
•RISC-V汇编指令:使用“S型”指令格式
sw rs2, integer(rs1)
DMEM[Reg[rs1] + sign_extend(immediate)] = Reg[rs2]
示例:
sw x14, 8(x2)
审查:将lw添加到数据路径
将sw添加到数据路径
将sw添加到数据路径
评论:I-Format即时
imm[31:0]
•指令的高12位(inst[31:20])复制到立即数的低12位(imm[11:0])
•立即数通过复制inst[31]的值来进行符号扩展,以填充立即数值的高20位(imm[31:12])
I&S型立即数发生器
•只需要一个5位多路复用器,就可以在指令中低位5位立即数的两个位置之间进行选择
•立即数中的其他位连接到指令中的固定位置