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。
x86架构和arm架构区别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,结构如下图所⽰: