伟明部落格

RISC Tutorial

发布于 2026-04-18 18:30:03

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.addic.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)。
  • 别名与约定用途:为提高可读性,寄存器有标准别名(如 rasp等),编译器/汇编器通常遵循这些约定(非强制,但推荐):
编号 别名 约定用途 说明
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 决定向量化或直接跳转)。
  • stvecutvec:对应 S/U 模式的陷阱向量基地址。
4. 中断控制寄存器(Interrupt Control)
  • mie(机器模式中断使能):控制机器模式下各类中断(外部、定时器、软件)的使能位(如 MEIE:外部中断使能)。
  • mip(机器模式中断挂起):标记当前挂起的中断(如 MEIP:外部中断挂起)。
  • siesipuieuip:对应 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)按需启用,保持基础架构简洁。

这种设计兼顾了性能、灵活性和可扩展性,适配从嵌入式到高性能计算的多种场景。

更新于 2026-04-18 18:30:03