RISCV ISA被定义为基础整数指令集架构(包含在任何实现中)和可选扩展指令集架构。
基础整数ISA和早期的RISCV处理器非常类似,除了没有分支延时槽和可变长指令编码。
分支延时槽:紧随分支指令后的一个指令位置,槽中指令总会被执行。目的是为了提高流水线效率,有效利用1个时间片,消除了一个“气泡”。这种技术存在于分支预测技术前,新架构都不用了。
基础指令集被小心地限制在一个最小指令集,并足以为编译器,汇编器和操作系统提供合理目标。如此,其提供了一个简介的ISA和软件工具链,类似于骨架,可以围绕它构建出更多定制的处理器ISA。
RISC-V指令集架构实际上是一个家族集合的简称(其包括RV32I,RV32E,RV64I,RV128I),目前包含4种基础ISA。
每个整数指令集有自己的整数寄存器位宽、寻址空间和整数寄存器数量。两个主要的基础整数ISA变体,RV32I和RV64I,在第2和5章有描述,相应地提供了32位和64位地址空间。我们用XLEN来代表整数寄存器位宽(32或64)。第4章描述了RV32E子集,属于RV32I变体,被用来支持小的微处理器,其只有RV32I整数寄存器的一半。第6章描述了未来的RV128I变体,用于支持128位地址空间(XLEN=128),所有基础整数指令集是用二进制补码表示有符号整数。
尽管64位地址空间相对于更大的系统是必须的,我们仍然相信32位地址空间在未来数十年仍足以满足许多嵌入式和客户端设备的需求,并且保证更低的功耗和内存阻塞。
分立的ISA的主要优势是每种基础ISA可根据自己的需求进行优化,而不需要支持其他指令集操作。主要缺点是当需要在一种ISA上模拟另一种ISA时,例如在RV64I上模拟RV32I环境,硬件设计上更加复杂,但是寻址和异常trap的差异意味着模式切换,对于任何架构都是不可避免的,但不同的RISCV子集是类似的,所以对多个版本的支持成本很低。
尽管有人提出严格的超集设计将允许遗留的32位版本库与64代码链接,但由于软件调用约定和系统接口的差异,即使使用相同的编码,这在实践中也是不切实际的。
RISCV特权级架构在misa中提供字段用来控制每个级别的非特权ISA,以支持在同一个硬件上模拟不同的基础ISA。我们也注意到,新的SPARC和MIPS版本已经不支持在64位系统上不加更改的运行32位代码。
RISC-V意在支持更广泛的定制和专用,每种基本整数ISA都可以用一个或者多个指令集扩展进行扩展。我们将每种指令集编码空间划分为三类:标准、预留和定制。
标准是由基金会定义,不得与同一基础ISA的其他标准扩展冲突;
预留是目前仍未定义但为将来标准扩展预留的;
定制永远不会用于标准扩展,而只能用于供应商特定的非标扩展;
我们使用术语non-standard来表示不是由基金会定义的扩展。
我们是用术语non-conforming来描述一个是用标准或预留编码的非标准扩展(即,自定义扩展不兼容);
指令集通常是共享的,但根据基础ISA提供略有不同的功能。
第26章描述了各种扩展RISC-V ISA的方法,
第27章描述了我们开发的RISC-V基础指令和指令集扩展的命名规范。
为了支持更通用的软件开发,标准扩展提供了整数乘除、原子操作、单精度和双精度浮点运算。
基础整数被命名为“I”,包括整数计算指令、整数加载、整数存储和流程控制指令。
整数乘除扩展被命名为“M”,包含整数乘法和除法
原子指令扩展被命名为“A”,包括原子读、修改和写内存,用于处理器间的同步;
单精度浮点运算扩展被命名为“F”,包括单精度浮点寄存器,单精度计算指令和单精度存储加载指令。
双精度浮点扩展被命名为“D”,扩展了浮点寄存器,双精度计算指令和双精度存储加载指令;
压缩指令扩展被命名为"C", 提供了16位宽的通用指令;
尽管基础ISA和GC扩展不能为所有应用提供巨大的帮助,但处于节能考虑,催生了更大的专业化,我们坚信简化ISA的必要性,虽然别的架构会更新它们的规范,但我们尽量不修改标准扩展规范。例如,基础整数ISA永远作为完全独立支持的ISA,而不考虑后续扩展。