RISC-V-数字设计与集成电路(上)

发布时间 2023-12-29 05:20:51作者: 吴建明wujianming

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位立即数的两个位置之间进行选择

•立即数中的其他位连接到指令中的固定位置