超大规模集成电路设计笔记:第三篇
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)。 |
x6 –x7 |
t1 , t2 |
额外的临时寄存器。 |
x8 |
s0 / fp |
保存寄存器 / 帧指针:被调用者保存(callee-saved)。也可用作帧指针。 |
x9 |
s1 |
保存寄存器。 |
x10 –x17 |
a0 –a7 |
函数参数和返回值:传递前 8 个参数;a0 /a1 也用于返回值。 |
x18 –x27 |
s2 –s11 |
保存寄存器:被调用者保存,适合存放局部变量。 |
x28 –x31 |
t3 –t6 |
临时寄存器。 |
指令组成
也可以看一下 从零开始学RISCV:序篇
单周期RISC-V处理器
先从单周期的数据通路来看。
I-Type
lw
的指令格式为I-Type:
1 | [31:20] [19:15] [14:12] [11:7] [6:0] |
首先从指令内存中取指,根据op
决定是lw
指令,随后从指令中拆分出寄存器地址rs1
并读取对应地址的值,再将操作数imm
从12位补全到32位,接着将两个值送进ALU进行运算,运算完后将结果输入数据内存进行读取,并写入目标寄存器rd
,最后决定下一个指令的地址,为PC+4,送回PC寄存器。
S-Type
sw
的指令格式为S-Type:
1 | [31:25] [24:20] [19:15] [14:12] [11:7] [6:0] |
首先从指令内存中取指,根据op
决定是sw
指令,随后取出 rs1
的源地址并在寄存器中读取,再将立即数imm
拼接并拓展到32位,然后在ALU中计算出地址,并输入数据内存,将对应地址数据写入rs2
,最后决定下一个指令的地址,为PC+4,送回PC寄存器。
R-Type
or
的指令格式为R-Type:
1 | [31:25] [24:20] [19:15] [14:12] [11:7] [6:0] |
首先从指令内存中取指,根据op
只能决定是R-Type指令,具体为什么指令还需要读取funct7
和funct3
。判断为or
后, 从rs1
与rs2
两个地址读取目标数据,不经过拓展,直接送入ALU进行比较,随后将结果写入到rd
寄存器地址。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Esing的小站!
评论
WalineGitalk