RISC-V简介

也可以看一下数字系统设计复习笔记:第十二篇

寄存器

RV32/64I指令集定义了32个32/64位的通用整数寄存器x0~x31,其中x0固定用于存放数据0;寄存器位数决定了其可以访问的地址空间大小。

寄存器 别名 常见用途
x1 ra 返回地址 (Return Address)jal 指令自动将返回地址存入此处。
x2 sp 栈指针 (Stack Pointer):指向当前栈顶。
x3 gp 全局指针 (Global Pointer):指向 2048 字节的小数据区(.sdata),用于高效访问小全局变量。
x4 tp 线程指针 (Thread Pointer):用于线程本地存储(TLS)。
x5 t0 临时寄存器 (Temporary):调用者保存(caller-saved)。
x6x7 t1, t2 额外的临时寄存器。
x8 s0 / fp 保存寄存器 / 帧指针:被调用者保存(callee-saved)。也可用作帧指针。
x9 s1 保存寄存器。
x10x17 a0a7 函数参数和返回值:传递前 8 个参数;a0/a1 也用于返回值。
x18x27 s2s11 保存寄存器:被调用者保存,适合存放局部变量。
x28x31 t3t6 临时寄存器。

指令组成

也可以看一下 从零开始学RISCV:序篇

单周期RISC-V处理器

先从单周期的数据通路来看。

I-Type

lw的指令格式为I-Type:

1
2
3
[31:20]    [19:15]    [14:12]    [11:7]    [6:0]
imm rs1 funct3 rd op
12bits 5bits 3bits 5bits 7bits

首先从指令内存中取指,根据op决定是lw指令,随后从指令中拆分出寄存器地址rs1并读取对应地址的值,再将操作数imm从12位补全到32位,接着将两个值送进ALU进行运算,运算完后将结果输入数据内存进行读取,并写入目标寄存器rd,最后决定下一个指令的地址,为PC+4,送回PC寄存器。

lw单周期数据通路

S-Type

sw的指令格式为S-Type:

1
2
3
[31:25]    [24:20]    [19:15]    [14:12]    [11:7]    [6:0]
imm[11:5] rs2 rs1 funct3 imm[4:0] op
6bits 5bits 5bits 3bits 5bits 7bits

首先从指令内存中取指,根据op决定是sw指令,随后取出 rs1的源地址并在寄存器中读取,再将立即数imm拼接并拓展到32位,然后在ALU中计算出地址,并输入数据内存,将对应地址数据写入rs2,最后决定下一个指令的地址,为PC+4,送回PC寄存器。

sw单周期数据通路

R-Type

or的指令格式为R-Type:

1
2
3
[31:25]    [24:20]    [19:15]    [14:12]    [11:7]    [6:0]
imm[11:5] rs2 rs1 funct3 rd op
6bits 5bits 5bits 3bits 5bits 7bits

首先从指令内存中取指,根据op只能决定是R-Type指令,具体为什么指令还需要读取funct7funct3。判断为or后, 从rs1rs2两个地址读取目标数据,不经过拓展,直接送入ALU进行比较,随后将结果写入到rd寄存器地址。

or单周期数据通路