导言
作为 RISC-V 国际批准过程的一部分,此版本 1.0 被视为已冻结以供公众审查。 1.0 版被认为足够稳定,可以开始开发工具链以及功能模拟器和实现,包括在上游软件项目中,并且预计不会有不兼容的更改,除非在批准期间发现严重问题。一旦获得批准,该规范将获得 2.0 版。
该规范包括完整的当前冻结向量指令集。其他在开发过程中考虑过但未出现在本文档中的说明不包括在审查和批准过程中,可能会被完全修改或放弃。标准向量扩展部分列出了标准向量扩展以及每个扩展支持哪些指令和元素宽度。
实现定义的常量参数
每个支持向量扩展的 hart 定义了两个参数:
● 任何操作可以产生或消耗的向量元素的最大比特大小,ELEN ≥ 8,必须是 2 的幂。
● 单个向量寄存器的位数,VLEN≥ELEN,必须是2的幂,不能大于2^16。
标准向量扩展(Section Standard Vector Extensions)和架构配置文件可能会对 ELEN 和 VLEN 设置进一步的限制:
● 未来的扩展可能允许 ELEN > VLEN 通过使用来自多个向量寄存器的位来保存一个元素,但当前的提议不包括此选项。
● VLEN 的上限允许软件知道索引将变为 16 位(65,536 的最大 VLMAX 出现在 LMUL=8 和 SEW=8 且 VLEN=65,536 时)。每个向量寄存器超过 64Kib 的任何未来扩展都将需要新的配置指令,这样使用旧配置指令的软件就不会看到更大的向量长度。
向量扩展支持编写二进制代码,该代码在某些约束下将在具有不同 VLEN 参数值的 harts 上可移植地执行,前提是 harts 支持所需的元素类型和指令。
可以编写代码来暴露实现参数的差异。通常,在 VLEN 或 ELEN 参数有任何差异的 hart 之间执行期间,无法迁移具有活动向量状态的线程上下文。
矢量扩展编程模型
向量扩展将 32 个向量寄存器和 7 个非特权 CSR(vstart、vxsat、vxrm、vcsr、vtype、vl、vlenb)添加到基本标量 RISC-V ISA。
4 个 CSR 编号 0x00B-0x00E 暂时保留给未来的向量 CSR,其中一些可能会镜像到 vcsr。
向量寄存器( Vector Registers)
向量扩展将 32 个架构向量寄存器 v0-v31 添加到基本标量 RISC-V ISA。每个向量寄存器都有一个固定的 VLEN 位状态。
mstatus 中的向量上下文状态
向量上下文状态字段 VS 被添加到 mstatus[10:9] 并在 sstatus[10:9] 中隐藏。它的定义类似于浮点上下文状态字段 FS。
当 mstatus.VS 设置为 Off 时,尝试执行任何向量指令或访问向量 CSR,会引发非法指令异常。当 mstatus.VS 设置为 Initial 或 Clean 时,执行任何更改向量状态的指令,包括向量 CSR,都会将 mstatus.VS 更改为 Dirty。实现也可以随时将 mstatus.VS 从 Initial 或 Clean 更改为 Dirty,即使向量状态没有变化。
mstatus.VS 的精确设置是一种优化。软件通常会使用 VS 来减少上下文交换开销。
如果 mstatus.VS 为 Dirty,则 mstatus.SD 为 1;否则,根据现有规范设置 mstatus.SD。实现可能有一个可写的 misa.V 字段。类似于处理浮点单元的方式,即使 misa.V 是明确的,mstatus.VS 字段也可能存在。
当 misa.V 被清除时允许 mstatus.VS 存在,启用矢量仿真并简化在具有可写 misa.V 的系统中对 mstatus.VS 的处理。
vsstatus 中的向量上下文状态
当存在管理程序扩展时,向量上下文状态字段 VS 被添加到 vsstatus[10:9]。它的定义类似于浮点上下文状态字段 FS。
当 V=1 时,vsstatus.VS 和 mstatus.VS 都有效:尝试执行任何向量指令,或访问向量 CSR,当任一字段设置为 Off 时引发非法指令异常。
当 V=1 且 vsstatus.VS 和 mstatus.VS 均未设置为 Off 时,执行任何更改向量状态的指令,包括向量 CSR,都会将 mstatus.VS 和 vsstatus.VS 更改为 Dirty。实现也可以随时将 mstatus.VS 或 vsstatus.VS 从 Initial 或 Clean 更改为 Dirty,即使向量状态没有变化。
如果 vsstatus.VS 为 Dirty,则 vsstatus.SD 为 1;否则,根据现有规范设置 vsstatus.SD。 如果 mstatus.VS 为 Dirty,则 mstatus.SD 为 1;否则,根据现有规范设置 mstatus.SD。 对于具有可写 misa.V 字段的实现,即使 misa.V 被清除,vsstatus.VS 字段也可能存在。