RISC Tutorial
RISC Tutorial
指令
在 RISC-V 架构中,32位(RV32)和64位(RV64)处理器的核心指令长度默认是相同的,但具体细节需结合指令集扩展来理解:
1. 基础指令集的固定长度
RISC-V 的基础整数指令集(如 RV32I 或 RV64I)采用32位定长指令(部分特殊场景除外)。无论处理器是32位(支持32位地址空间和寄存器)还是64位(支持64位地址空间和寄存器),其核心指令(如算术运算、访存、分支等)的长度均为32位。
2. 可选的压缩指令扩展(RVC)
RISC-V 提供了可选的压缩指令扩展(Compressed Instructions, RVC),引入了16位的短指令(例如 c.addi、c.lw等)。这些16位指令是对32位指令的子集压缩,目的是减少代码体积。
关键特点:
- 压缩指令(16位)可与32位指令混合使用;
- RV32 和 RV64 架构均可独立选择是否支持 RVC 扩展(即32位或64位处理器都可能支持或不支持16位指令);
- 压缩指令的存在不依赖于处理器的字长(32位或64位),仅取决于是否启用了 RVC 扩展。
3. 总结
- 基础指令长度一致:RV32(32位)和 RV64(64位)的核心指令默认均为32位定长;
- 压缩指令可选:若启用 RVC 扩展,两者均可支持16位短指令(与字长无关);
- 因此,32位和64位 RISC-V CPU 的指令长度在基础层面是相同的(32位为主),仅在是否启用压缩扩展时可能增加16位指令选项(但这与字长无必然联系)。
简言之:RISC-V 的32位和64位架构在基础指令长度上一致(32位),可选的压缩扩展(16位)是独立于字长的特性。
寄存器
RISC-V 架构的寄存器设计遵循精简原则,按功能和用途可分为 通用寄存器、控制状态寄存器(CSR)、浮点与向量寄存器 三大类,且不同扩展(如 RV32/RV64、F/D/V 扩展)会影响寄存器的宽度或数量。以下是详细总结:
一、通用寄存器(General-Purpose Registers, GPR)
通用寄存器是 CPU 最核心的寄存器,用于临时存储数据和地址,32 位(RV32)和 64 位(RV64)架构均默认包含 32 个 32 位/64 位通用寄存器,编号为 x0~x31(或 r0~r31)。
核心特性:
- 零寄存器(x0):硬编码为 0,任何写入操作无效,读取始终返回 0(用于简化指令逻辑,如
add x1, x0, x2等价于mov x1, x2)。 - 别名与约定用途:为提高可读性,寄存器有标准别名(如
ra、sp等),编译器/汇编器通常遵循这些约定(非强制,但推荐):
| 编号 | 别名 | 约定用途 | 说明 |
|---|---|---|---|
| x0 | zero | 恒为 0(零寄存器) | 只读,写入无效 |
| x1 | ra | 返回地址(Return Address) | 函数调用时保存返回地址 |
| x2 | sp | 栈指针(Stack Pointer) | 指向当前栈顶 |
| x3 | gp | 全局指针(Global Pointer) | 指向静态数据区起始地址 |
| x4 | tp | 线程指针(Thread Pointer) | 多线程环境下指向线程数据 |
| x5 | t0 | 临时寄存器 0(Temporary 0) | 函数内临时存储 |
| x6 | t1 | 临时寄存器 1 | ... |
| x7 | t2 | 临时寄存器 2 | ... |
| x8 | s0/fp | 保存寄存器 0 / 帧指针(Frame Pointer) | 保存跨函数调用的变量 |
| x9 | s1 | 保存寄存器 1 | ... |
| x10 | a0 | 参数寄存器 0 / 返回值寄存器 0 | 函数参数/返回值传递 |
| x11 | a1 | 参数寄存器 1 / 返回值寄存器 1 | ...(a0~a7 共 8 个参数寄存器) |
| x12 | a2 | 参数寄存器 2 | ... |
| ... | ... | ... | (a0~a7:x10~x17) |
| x18 | s2 | 保存寄存器 2 | (s0~s11 共 12 个保存寄存器) |
| ... | ... | ... | (s2~s11:x18~x27) |
| x28 | t3 | 临时寄存器 3 | (t3~t6:x28~x31) |
| x29 | t4 | 临时寄存器 4 | ... |
| x30 | t5 | 临时寄存器 5 | ... |
| x31 | t6 | 临时寄存器 6 | ... |
RV32 vs RV64 差异:
- 宽度:RV32 的通用寄存器为 32 位(
x0~x31是 32 位),RV64 为 64 位(x0~x31是 64 位)。 - 扩展支持:RV64 新增了 64 位指令(如
ld/sd访存),但寄存器数量不变。
二、控制状态寄存器(Control and Status Registers, CSR)
CSR 用于控制 CPU 运行状态(如特权级、中断、异常处理),按特权级划分(机器模式 M > 监督模式 S > 用户模式 U),不同模式可访问的 CSR 不同(低特权级不可访问高特权级的 CSR)。
核心 CSR(按功能分类):
1. 状态寄存器(Status Registers)
mstatus(机器模式状态):保存机器模式的核心状态,如当前特权级(MPP)、中断使能(MIE)、异常原因(MEPC 相关)等。sstatus(监督模式状态):监督模式下的状态子集(仅保留 S 模式相关位)。ustatus(用户模式状态):用户模式下的状态子集(仅保留 U 模式相关位)。
2. 异常程序计数器(Exception Program Counter, EPC)
mepc(机器模式 EPC):发生异常/中断时,保存触发异常的指令地址(用于异常返回时恢复执行)。sepc(监督模式 EPC)、uepc(用户模式 EPC):对应 S/U 模式的异常地址保存寄存器。
3. 陷阱向量基地址(Trap Vector Base Address, TVEC)
mtvec(机器模式 TVEC):指定机器模式下异常/中断的处理程序入口地址(格式:base + mode,mode 决定向量化或直接跳转)。stvec、utvec:对应 S/U 模式的陷阱向量基地址。
4. 中断控制寄存器(Interrupt Control)
mie(机器模式中断使能):控制机器模式下各类中断(外部、定时器、软件)的使能位(如 MEIE:外部中断使能)。mip(机器模式中断挂起):标记当前挂起的中断(如 MEIP:外部中断挂起)。sie、sip、uie、uip:对应 S/U 模式的中断控制寄存器。
5. 其他关键 CSR
mcause(机器模式原因):记录异常/中断的原因(如0表示中断,1表示非法指令)。medeleg/mideleg(机器模式委托):将部分异常/中断委托给 S/U 模式处理(减少 M 模式负载)。pmpcfg/pmpaddr(物理内存保护):配置内存区域的访问权限(如只读、可执行)。
三、浮点与向量寄存器
需通过扩展启用(基础指令集 RV32I/RV64I 不含浮点/向量寄存器)。
1. 浮点寄存器(Floating-Point Registers, FPR)
- 启用条件:支持 F 扩展(单精度浮点)或 D 扩展(双精度浮点)时,提供 32 个浮点寄存器
f0~f31。 - 宽度: F 扩展:32 位单精度浮点数(与 RV32 通用寄存器同宽); D 扩展:64 位双精度浮点数(与 RV64 通用寄存器同宽); Q 扩展(四精度):128 位浮点数(可选)。
- 别名:与通用寄存器类似(如
fa0~fa7对应参数/返回值,fs0~fs11对应保存寄存器)。
2. 向量寄存器(Vector Registers, VR)
- 启用条件:支持 V 扩展(向量扩展)时,提供 32 个向量寄存器
v0~v31。 - 特性: 长度可变(VLEN):由硬件实现定义(如 128 位、256 位、512 位),支持单指令多数据(SIMD)操作; 元素类型灵活:可按字节、半字、字、双字等拆分处理。
四、其他特殊寄存器
- 程序计数器(Program Counter, PC):存储下一条待执行指令的地址(32 位 RV32 中 PC 为 32 位,RV64 中为 64 位)。
- 页表基址寄存器(SATP):监督模式下用于虚拟地址转换(保存页表基地址)。
总结
RISC-V 寄存器设计的核心是 精简与模块化:
- 通用寄存器:32 个定长(32/64 位)+ 零寄存器,通过别名规范用途;
- CSR:按特权级隔离,控制状态与异常管理;
- 扩展寄存器:浮点(F/D/Q)、向量(V)按需启用,保持基础架构简洁。
这种设计兼顾了性能、灵活性和可扩展性,适配从嵌入式到高性能计算的多种场景。