1.1 RISC-V ISA 概述
RISC-V ISA 是由一个(任何微体系结构都必须能实现的)基本的整型 ISA,加上一些可选的基本 ISA 的拓展集构成的。这个基本 ISA 和早期 RISC 处理器的基本 ISA 非常相似,但是它没有分支延迟槽以及支持可选的变长的指令编码格式。这个基本的 ISA 受限于一个最小的指令集,这个指令集足够用来给编译器,汇编器,链接器,以及(有额外管理员级的操作的)操作系统提供一个合理的目标,同样也提供一个实用的ISA以及软件工具链“skeleton”,有了这些,更多的定制处理器 ISAs 能够被构建。
每一个基本整型指令集以整型寄存器的宽度以及用户地址空间相应的大小为特点。这有两种基本的整型变体 RV32I 和 RV64I ,会被描述在第 2 章和第 3 章,它们分别提供 32-bit 或者 64-bit 的用户级地址空间。硬件实现和操作系统可能只给用户程序提供 RV32I 和 RV64I 其中一种,也可能两种都提供。第 17 章描述基本整型指令集的一个未来变体 RV128I,支持一个二维的(flag) 128-bit 的用户地址空间。
尽管 64-bit 的地址空间对于更大的系统来说是一个必要条件,但是我们相信 32-bit 的地址空间在接下来的数十年对于许多嵌入式的和客户端的设备依然是足够的,并且对于更低的访存流量和能量损耗将是有益的。另外,32-bit 的地址空间针对教学目的来说是足够的。一个更大的二维的(flag)128-bit 的用户地址空间可能最终会被需要,所以我们要确保它在 RISC-V ISA 框架中能够被安置。
基本整型 ISA 可能是一个硬件实现的子集,但是一个管理员层次的操作码自陷以及软件仿真必须被用来实现(硬件不提供的)功能。
基本整型 ISA 的子集可能对于教学目的是有用的,但是基本整型 ISA 已经被定义成这样以致没有什么动力去子集一个(超出省略对未对齐地址的存储器访问的支持以及把所有 SYSTEM 指令看做一个单一的自陷范围的)真正的硬件实现。
RISC-V 已经被设计去支持大量的定制和专用。基本整型 ISA 能够被一个或多个可选的指令集拓展集扩展,但是基本整型指令不能够被重新定义。我们把 RISC-V 指令集拓展分为标准和非标准两种拓展。标准拓展通常应该是有用的,并且应该不会和其他标准拓展冲突。非标准拓展可能是高度专用的,或者可能和其他标准或者非标准的拓展产生冲突。指令集拓展可能根据基本整型指令集的宽度提供稍稍不同的功能。第 9 章描述拓展 RISC-V ISA 的不同方式。我们也已经为 RISC-V 基本指令和指令集拓展指定了一个命名规则,这被详细地描述在第 10 章。
为了支持更多的通用软件开发,一组标准拓展被定义去支持整型乘法、除法,原子操作,以及单双精度的浮点算术。基本整型 ISA 被命名为 "I",包括整型计算指令,整型取数,整型存数,以及控制流指令,它对于所有 RISC-V 实现是强制的。标准整型乘法和除法拓展被命名为 "M",增加了乘法和除法的指令,并把结果保存到整型寄存器。标准原子指令拓展,用 "A" 来表示,为处理器间同步,增加了原子地读,修改,以及写存储器的指令。标准的单精度浮点拓展,用 "F" 来表示,增加了浮点寄存器,单精度计算指令,以及单精度的取数和存数指令。标准的双精度浮点拓展,用 "D" 来表示,同样扩展了浮点寄存器,并且增加了双精度计算指令,以及双精度的取数和存数指令。一个整型基本指令集加上四个标准拓展集("IMAFD")被赋予缩写 "G",并且提供一个通用的标量的指令集。RV32G 和 RV64G 是当前编译工具链默认的目标。后面的章节会描述这些以及其他计划有的标准 RISC-V 拓展。
除了基本整型 ISA 和标准拓展之外的一条新的指令尽管可能对于某一特定领域是很有益的,但是很少能够给所有的应用都提供一个有意义的便利。当能源效率问题迫使更多的专用化时,我们相信简化一个 ISA 专用需要的部分是很重要的。然而其他体系结构通常把他们的 ISA 看做一个单独的实体,随着时间的推移,当指令被添加的时候,他们的 ISA 变成一个新的版本,而 RISC-V 尽力保持基本 指令集和每个标准拓展不随着时间而改变,并且把新的指令作为更深一层的可选拓展。例如,基本整型 ISAs 将会继续作为完全地被支持的单独的 ISAs,不受任何一个随后的拓展影响。
随着用户 ISA 规格 2.0 版本的发布,对于未来的发展,我们决定将 "IMAFD" 基本指令集和标准的拓展(亦称作 "G")保持不变。