指令集草案:https://github.com/riscv/riscv-v-spec/blob/master/v-spec.adoc
关于这篇博客:
1、这是我RISC-V矢量指令集的学习记录,不是翻译,所以有错误的地方请联系我。
2、更新时间不定时,按心情更新,也按我学习进度更新。
3、最近都比较忙,暂时没有时间继续学习。
1、 Introduction
这个文档是RISC-V矢量扩展的草案。文档描述了基础矢量扩展的全部独特的特性。
Note:这是一个草案,对于矢量规范的实施和评估提供稳定建议。一旦草案标签被移除,矢量扩展0.7版本就可以足够稳定地用于开放工具链、功能模拟器和芯片的初始实现,尽管会随着一些微小的变化或更新而不断发展。
基础矢量扩展这个术语非正式地用于描述矢量ISA标准指令集。此草案规范旨在说明某个向量函数是如何通过向量指令来实现的,但对于一个给定的平台,没有强制规定使用哪些矢量指令。
Note:每个实际平台的概述文件将正式指定该平台所采用的任何向量扩展的强制组件。The base vector extension can expected to be close to that which will eventually be used in the standard Unix platform profile that supports vectors. 其他平台,包括嵌入式平台,可以选择实现这些扩展的子集。The exact set of mandatory supported instructions for an implementation to be compliant with a given profile is subject to change until each profile spec is ratified.
基础矢量扩展被设计为各种领域中额外矢量扩展的基础,包括密码学和机器学习。
2、 定义 & 常量参数
支持矢量扩展的每个hart都有三个参数的定义。
Note:平台配置文件可以对这些参数进行进一步的约束,例如,要求ELEN≥max(XLEN,FLEN),或要求最小VLEN值,或固定一个SLEN值。XLEN为系统的操作位数,如32位或64位,FLEN位浮点操作的位数。
在某些约束下,ISA支持编写二进制代码,且这些二进制代码能在具有不同参数的harts上进行移植。
Note:可以编写暴露这些参数差异的代码。
Note:在harts之间如果VLEN、ELEN和SLEN这些参数存在差异,则执行期间无法迁移具有活性向量状态的线程上下文。
3、 矢量扩展编程者模型
矢量扩展增加32个矢量寄存器和5个CSRs(vstart,vxsat,vxrm,xtype,v1)到标准RISC-V ISA。如果标准RISC-V ISA不支持浮点,则额外增加一个fcsr的寄存器,用于保持vxsat和vxrm CSRs的镜像值。
3.1. 矢量寄存器
在标量RISC-V指令集基础上,矢量扩展增加了32个结构向量寄存器,v0-v31。每个矢量寄存器的位宽都是固定的VLEN位。
Note:Zfine是一个正在考虑的ISA新选项,其使用情况是采用浮点指令时,浮点指令的参数可以从整形寄存器中活得。
3.2. 矢量起始索引CSR寄存器(vstart)
vstart是一个可读可写的CSR寄存器,指定矢量指令要执行的第一个元素的索引。
通常,vstart只有在矢量指令陷阱时被硬件写入,同时vstart的值能反应陷阱时的元素(要不是同步异常就是异步中断),并且在处理可恢复陷阱后,应在该元素上恢复执行。
所有向量指令都定义为从vstart CSR中给定的元素号开始执行,使目标向量中的早期元素不受干扰,并在执行结束时将vstart CSR重置为零。
如果vstart寄存器中的值大于或等于向量长度vl,则不执行任何元素操作,虽然目标向量结束时,vl上的元素被归零,而vstart寄存器被重置为零。
vstart CSR被定义为只有足够的可写位来保存最大元素索引(比最大vlmax少一个或是lg2(VLEN)位),vstart CSR的高位硬连线到零(读取零,写入被忽略)。
Note:最大矢量长度通过最大LMUL设置(8)和最小SEW设置(8)获得,所以VLMAX_max=8VLEN/8=VLEN。例如,VLEN=256, vstart将由8位组成代表从0至255之间。*
vstart CSR可由非特权代码写入,但非零的vstart值可能会导致向量指令在某些实现上运行速度大大减慢,因此应用程序员不应该使用vstart。一些向量指令不能用非零的vstart值执行,不然会引发下面定义的非法指令异常。
3.3. 矢量定点舍入模式寄存器(vxrm)
矢量定点舍入模式寄存器保存一个两位可读可写的字段,用于表示舍入模式。矢量定点取整模式被赋予一个单独的CSR地址,以允许独立访问,但也作为fcsr高位字段的一个反映。系统如果没有包含浮点操作,那在使用矢量扩展时必须增加fcsr CSR寄存器。
Note:舍入模式可以通过csrwi指令来完成。
3.4. 矢量定点饱和标志(vxsat)
vxsat CSR寄存器包含一个读写位,该位指示定点指令是否必须使输出值饱和,以此适应目标格式。
3.5. 在fcsr中的矢量定点域
vxrm和vxsat可以通过单独CSR来实现,也能通过浮点CSR寄存器fcsr的字段来访问。系统如果没有包含浮点操作,那在使用矢量扩展时必须增加fcsr CSR寄存器。
Note:字段被打包到fcsr中,以便更快地保存/恢复上下文。
3.6. 矢量型寄存器(vtype)
矢量类型CSR寄存器是一个只读、位宽为XLEN的CSR寄存器,只能被vsetvl{i}指令更新,并提供用于解释向量寄存器文件内容的默认类型。矢量类型决定每个矢量寄存器中元素的安排和多个矢量寄存器的分组方式。
Note:早期的草案允许采用常规CSR写入方式来写入vtype。只允许vsetvl{i}指令进行vtype的更新,简化了vtype CSR寄存器的状态维护。
在矢量基础扩展中,类型寄存器有三个文件内容,vill、vsew[2:0]和vlmul[1:0],它们的说明如下。
Note: vtype最小的基本实现只需要四位存储空间,vsew[1:0]两位,vlmul[1:0]两位。可以使用vsew[1:0]中的非法64位组合对非法值进行编码,而不需要额外的存储位。
Note: vediv[1:0]字段由的EDIV扩展使用,描述如下。
Note: 对向量库的进一步标准和自定义扩展将扩展这些字段,以支持更多的数据类型。
Note: 扩展指令编码长度允许在指令编码中指定这些字段,尽管vlmul可能希望随AVL而变化。
3.6.1. 矢量标准元素宽度(vsew)
vsew中的值设置动态标准元素宽度(SEW)。默认情况下,向量寄存器被划分为VLEN/SEW个标准宽度元素。在基础向量扩展中,SEW只需要支持(XLEN, FLEN)中的最大值。