RISC-V 指令集的模块化和寄存器结构
0 前言
RISC-V 指令集架构是加州大学伯克利分校研发的第五代精简指令集架构,先后经历了四代精简指令集的发展,旨在设计一个完全开放、免费的和性能强大的指令集架构。它和X86/ARM相比,一大优势就是支持模块化,下面我们就来介绍一下RISC-V指令集的模块化结构,顺便再介绍下其寄存器结构。
一、模块化结构
RISC-V 指令集架构一改传统增量 ISA 模式,采用模块化 ISA 模式,它被定义为基本的整数指令集架构,以及几个标准的扩展子集,可以自定义指令扩展,如下表所示。
它的核心为RV32I
的基础整数指令集,RV32I
是固定的,并保持永远不变,而其扩展是可选择进行实现的。这为编译器、汇编器和操作系统开发人员提供了稳定的研发目标。其扩展包括 M、F、D、A、G、C、V
等,开发人员根据实际的应用程序,硬件设计可以选择是否实现这些扩展。这种模块化特性解决了以往指令集增量 ISA 模式和兼容性带来的弊端,并且使得 RISC-V 具有了小型化、低功耗的特点,这对于嵌入式应用至关重要的。
RISC-V 指令集架构的标准扩展指令的具体介绍如下:
-
I 扩展
:整数扩展(I 扩展)表示 RISC-V 的基础整数指令集,是任何一个实现中都必须存在的模块。根据地址空间可分为RV32I、RV64I、RV128I
三类。RV32I 非常精简,只有 47 条指令,但它具有齐全的功能,可以形成编译器目标,满足现代操作系统和运行时的基本要求。它包括整数计算指令、控制转移指令、加载-存储指令以及系统调用等指令。 -
M 扩展
:M 扩展即乘除扩展,是 RISC-V 整数乘除标准扩展指令集,包含了有符号和无符号的整数乘除法指令。 -
F 扩展/D 扩展
:F 扩展和 D 扩展两者是分开的,可单独进行选择实现。F 表示单精度浮点标准扩展指令集,D表示双精度浮点标准扩展指令集。它们使用的是 32 个独立的浮点寄存器而不是基本整数寄存器,除了具有加载-存储和算术指令外,还包括一些加减乘除指令在内的分别进行融合计算的指令,让计算过程变得更快速、简洁和准确。另外为了保证数学库代码的编写,还必须包括符号注入指令以及分类指令等。 F 和 D 两个标准扩展没有提供浮点分支指令,其主要功能被浮点比较指令所替代,也就是说可以依据两个浮点数的比较结果信息将寄存器中的值设置为 0 或者 1,从而用于分支跳转。 -
A 扩展
:A 扩展表示标准原子扩展,是 RISC-V 的原子操作指令集,为实现多个RISC-V 线程之间的进行同步操作提供了技术支持。RV32A 标准扩展指令集为两种不同的使用场景分别提供了加载保留/条件存储指令和获取和操作存储器指令两种原子性操作指令,其中加载保留和条件存储指令确保了原子的比较-交换操作。即比较 A寄存器的值和 B 寄存器的内存地址指向的值,如果两者相等,交换 C 寄存器中的值和内存中的值 -
G 扩展
:通用扩展 G 是基本整数指令集和四个标准扩展指令集(即“IMAFD”)的总称。 -
C 扩展
:C 扩展表示压缩扩展,是 RISC-V 的标准压缩指令集。每条 16 位压缩指 令一般情况必有一条标准的 32 位指令与之对应,并且仅仅对于汇编器和链接器是可见的。汇编器和链接器决定了是使用 16 位指令还是使用 32 指令,因此编译器和汇编语言开发人员可以完全忽略压缩指令及其格式。上述设计方案避免了在重新设计 ISA短指令集时,给处理器和编译器的设计增加负担的问题。 -
Q 扩展
:Q 扩展是一个 128 位的四精度浮点指令集扩展。四精度浮点指令扩展的浮点寄存器可以用来存储一个单精度、双精度或者四精度的浮点数。四精度浮点扩展要求实现RV64IFD。 -
V 扩展
:向量扩展是 RISC-V 向量指令集,与单指令多数据流(SIMD)指令的区别是,RV32V 采用了向量架构,实现了内部向量寄存器的宽度与指令集的分离,不会像 SIMD 那样加宽了寄存器就会同时扩展了指令集,解决了 SIMD 指令集每次增加宽度,所导致的上层软件适配问题。RISC-V 向量指令集包括向量计算指令、load-store指令、向量条件运算等指令。
除以上 RISC-V 标准指令集扩展外,RISC-V 还有多个标准指令集扩展,例如十进制浮点(L)、位操作(B)、封装的单指令多数据(P)等。目前这些标准扩展大多数仍在不断完善和设计中。
二、寄存器结构
RISC-V 指令集架构具有 32 位和 64 位的,其寄存器宽度也分别是 32 位和 64 位 的。RISC-V 的基本整数指令集中包含 32 个整数寄存器 x0~x31 以及一个程序计数器(pc)保存当前指令的地址。具体结构如下图所示,其中 x1~x31 表示整数通用寄存器,其功能是保存程序运行的中间结果,存储的是整数类型,寄存器 x0 代表常数0,可以使用 x0 实现一些指令功能。
另外在浮点指令集中,则需要 32 个独立的浮点寄存器 f0~f31 和一个浮点控制和状态寄存器 fcsr,结构如下图所示: