RISC-V模块化指令集简介 RISC-V 的指令集使用模块化的方式进行组织,每一个模块使用一个英文字母来表示。
RISC-V 最基本也是唯一强制要求实现的指令集部分是由 I 字母表示的基本整数指令子集。使用该整数指令子集,便能够实现完整的软件编译器。其他的指令子集部分均为可选的模块,具有代表性的模块包括 M/A/F/D/C/P。
此外“IMAFD”,也被称为“通用”组合,用英文字母 G 表示。因此 RV32G 表示 RV32IMAFD,同理 RV64G 表示 RV64IMAFD。为了提高代码密度,RISC-V 架构也提供可选的“压缩”指令子集,用英文字母 C 表示。压缩指令的指令编码长度为 16 比特,而普通的非压缩指令的长度为 32 比特。
RISC-V的不同寻常之处,除了在于它是最近诞生的和开源的以外,还在于和几乎所有以往的ISA不同,它是模块化的。它的核心是一个名为RV32I的基础ISA,运行一个完整的软件栈。RV32I是固定的,永远不会改变。这为编译器编写者,操作系统开发人员和汇编语言程序员提供了稳定的目标。模块化来源于可选的标准扩展,根据应用程序的需要,硬件可以包含或不包含这些扩展。这种模块化特性使得RISC-V具有了袖珍化、低能耗的特点,而这对于嵌入式应用可能至关重要。RISC-V编译器得知当前硬件包含哪些扩展后,便可以生成当前硬件条件下的最佳代码。惯例是把代表扩展的字母附加到指令集名称之后作为指示。例如,RV32IMFD将乘法(RV32M),单精度浮点(RV32F)和双精度浮点(RV32D)的扩展添加到了基础指令集(RV32I)中。它们仍是可选的,不会像在增量ISA中那样成为未来所有实现的必要组成部分。 计算机体系结构的传统方法是增量ISA,新处理器不仅必须实现新的ISA扩展,还必须实现过去的所有扩展。感兴趣的查找相关资料。
即使是指令格式也能从一些方面说明 RISC-V 更简洁的 ISA 设计能提高性能功耗比。首先,指令只有六种格式,并且所有的指令都是 32 位长,这简化了指令解码。用于寄存器-寄存器操作的 R 型指令,用于短立即数和访存 load 操作的I型指令,用于访存 store 操作的S型指令,用于条件跳转操作的B 型指令,用于长立即数的U 型指令和用于无条件跳转的J型指令。 为了进一步减少面积,RISC-V 架构还提供一种“嵌入式”架构,用英文字母 E 表示。该架构主要用于追求极低面积与功耗的深嵌入式场景。该架构仅需要支持 16 个通用整数寄存器,而非嵌入式的普通架构则需要支持 32 个通用整数寄存器。
• 嵌入式架构仅支持 32 位架构,在 64 或 128 位架构中不支持该嵌入式架构。即只有RV32E,而没有 RV64E。
• 在嵌入式架构中推荐使用压缩指令子集(由字母 C 表示),即 RV32EC,以增加嵌入式系统中关注的代码密度。
• 在嵌入式架构中不支持浮点指令子集。如果需要选择支持浮点指令子集(F 或者 D),则必须使用非嵌入式架构(RV32I 而非 RV32E)。
• 嵌入式架构仅支持机器模式(Machine Mode)与用户模式(User Mode),不支持其他的特权模式。
• 嵌入式架构仅支持直接的物理地址管理,而不支持虚拟地址。
除了上述模块,还有若干的模块如 L、B、P、V 和 T 等。目前这些扩展大多数还在不断完善和定义中,尚未最终确定,因此不做详细论述。
通用的RV32G 和 RV64G指令集列表
链接:https://juejin.cn/post/7049170072522194974
|