1. V扩展简介
- rvv spec中规定所有基本向量的运算均为一维向量
- RVV可以在编译时动态调整向量类型参数以应对不同的数据类型和数据大小的输入
- EPI、SiPearl和SiFive联合发布了一份RISC-V “V”(向量)扩展的Intrinsics的规范,并且已经被RISC-V采纳为标准规范。GCC工具链已经较完整支持了RISC-V “V”向量扩展的汇编,并且持续在跟进向量扩展的最新版本
2. V扩展中的寄存器
riscv-v-spec规定在基本spec增加了32个向量寄存器(记为v0-v31,位宽均为VLEN)和7个非特权CSRs(分别为vstart, vxsat, vxrm, vcsr, vl, vtype, vlenb,位宽均为XLEN)
1.普通向量寄存器
- v0寄存器作为掩码寄存器
2.特殊向量寄存器
- 向量上下文状态字段VS:与特权指令集的寄存器相关,为mstatus[10:9]和sstatus[10:9]。当 VS 字段被设置为 Off ,试图执行任何向量指令,或访问向量CSRs时,会引发非法指令异常;当被设置为 Initial 或 Clean ,执行更改向量状态的指令,包括向量 CSRs 指令
,该字段会变为 Dirty 。
VS的定义类似于浮点上下文状态FS - vtype
用于解释向量寄存器文件内容的默认类型,并且只能通过vsetvl指令进行更新。向量类型还决定了每个向量寄存器中元素的排布,以及如何对多个向量寄存器进行分组。
其中包含:
vsew[2:0]:设置向量寄存器中每个元素宽度SEW,向量寄存器被视为分成 VLEN / SEW 个标准宽度元素。
vlmul[2:0]:向量寄存器分组,多个向量寄存器可以分成一组,以便单个向量指令可以对多个向量寄存器进行操作。LMUL = 2^(vlmul[2:0]) VLMAX=LMUL*VLEN/SEW
掩码寄存器总是包含在单个向量寄存器中,与LMUL无关。
LMUL、SEM、VLEN三者之间的关系
vill: 向量类型非法,若vill置1,则依赖于vtype的指令会引发非法指令异常,且其余的XLEN-1的所有值均被强制置0
- vl: 向量长度寄存器,该寄存器的值是通过 vsetvli / vsetvl 两个指令自动设置的,
即选取VLMAX= VLEN/SEM*LMUL和AVL(需要被应用的向量寄存器长度,通常通过一个GPR传递)中的较小值,给vl寄存器,并将该值通过一个GPR保存起来
vl=min(VLMAX, AVL)
通常用指令vsetvli设置vtype值,用vsetvl作为上下文保存
3. 指令编码格式
整数指令的编码格式
4. 指令功能
5. RVV软硬件生态
- 相关工具链
卡姆派勒开源32bit LLVM向量编译器:https://www.sohu.com/a/415960738_120163133
卡姆派乐信息科技有限公司此次开源的RISC-V向量编译器符合riscv-v-spec-0.8规范,支持的指令集架构为isa=rv32imafcv,向量长度vlen=128,共提供6000多个intrinsic函数接口。用户可以访问https://github.com/compiler-dev/llvm-rv.git下载源码,并根据README.md说明,选择从源码编译运行环境所需要的ld、newlib和libgcc等工具集,也可以直接下载我们编译好的二进制包。二进制包下载地址:https://github.com/compiler-dev/rvvtool-chain-binaries,用户将编译好的开源llvm代码安装到这个路径即可使用。
开源代码中提供了每条intrinsic的接口说明,用户可以访问帮助文件查看每个接口的功能及参数。在目录rvv-test/intrinsic提供了1500多个测试文件(只包含m1)。同时rvv-test目录下还提供了多个可以在spike模拟器上运行的测试用例。
LLVM编译器github链接:https://github.com/compiler-dev/llvm-rv
编译后的可执行文件:https://github.com/compiler-dev/rvvtool-chain-binaries - 目前实现rvv扩展的CPU
玄铁C910: rvv-0.7.1
晶心科技NX27V:http://m.elecfans.com/article/1149316.html