首页/指令库/寄存器设置向量长度
VSETVL

RISC-V VSETVL 指令详解

指令手册OP-V vector configuration (register vtype)

按 rs1/rd 的 AVL 规则和 rs2 中的完整 vtype 值配置 vl/vtype,并写回新 vl

指令语法

vsetvl rd, rs1, rs2
操作数说明
rd、rs1、rs2 均为整数寄存器。rs2 的全部 XLEN 位提供 vtype;x0 提供 0(e8,m1,tu,mu)。同名源必须读取同一旧值。
32 位 OP-V:bits[31:25]=1000000,随后是 rs2、rs1、funct3=111、rd、opcode=1010111;没有 rs3 或 v0.t。rs1≠x0 时 AVL=x[rs1];rs1=x0 且 rd≠x0 请求 VLMAX。
VLMAX=LMUL×VLEN/SEW。AVL≤VLMAX 时 vl=AVL;VLMAX<AVL<2×VLMAX 时 ceil(AVL/2)≤vl≤VLMAX;AVL≥2×VLMAX 时 vl=VLMAX。同一实现对相同 AVL/VLMAX 确定。
rd=rs1=x0 使用当前 vl 作 AVL,仅在 VLMAX 不变且原 vill=0 时可用,否则保留,实现可设置 vill。rd=x0 只丢弃 GPR 写回。
要求 V 1.0 和所需向量状态已启用;vset 不依赖旧 vtype。成功完成更新 vl/vtype 并清 vstart。不支持的 vtype 设置 vill、其他 vtype 位及 vl 为 0;实现也可选择陷入以模拟非法配置。
V向量配置vset指令

指令行为说明

VSETVL 是寄存器 vtype 形式的 RVV 配置指令。它与 VSETVLI 一样按 rs1/rd 组合确定 AVL。普通 AVL 形式:rs1 非零,AVL=x[rs1]。VLMAX 请求形式:rs1=x0,rd 必须非零。保留当前 vl 形式:rd=x0,rs1=x0,并且只在 VLMAX 不变和原 vtype.vill=0 时有效。rs2 提供完整 vtype 值,而不是 e32/m1/ta/ma 这类汇编文本字段。指令按官方规则检查 vtype、选择新 vl、更新 vl/vtype,并把新 vl 写入 rd;成功执行会把 vstart 归零。

VSETVL 指令解析与执行动画

从 vset 编码字段解析 AVL 来源和 vtype 设置,再展示 vl/vtype/rd 的架构可见更新。

步骤 1 / 6

编码

VSETVL 属于 OP-V 配置指令。本步先看 opcode、funct3 以及承载 AVL/vtype 的字段。

输入的指令
vsetvl
执行环境
范围提示:此动画只展示 V 扩展定义的 ISA 可见 vl/vtype 选择关系。示例 VLMAX 与中间区间 vl 选择都是教学输入,不代表具体处理器的 VLEN、ELEN、支持矩阵或操作系统处理。
编码字段vsetvl / OP-V
31..25
funct7
1000000
24..20
rs2
01011
19..15
rs1
01010
14..12
funct3
111
11..7
rd
00101
6..0
opcode
1010111
asm
form
VSETVL
配置数据路径
AVL source
x10
AVL
40
VLMAX
16
selected vl
16
vtype
e32, m1, ta, ma
x5
尚未写回
vstart
3
当前配置摘要
vl result
16
policy
ta/ma
vl 选择结果
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
示例按 AVL=40 和 VLMAX=16 得到 vl=16。绿色格表示本次配置后 body 元素范围。

假定 V 和所需向量状态已启用。本动画只演示成功完成路径(不支持配置采用 vill 路径);实现也可对非法 vtype 选择陷入以支持模拟。AVL 数值输入限于可精确表示的非负安全整数,按 RV64 教学环境解释。各步骤用于讲解,不代表硬件周期。

快速理解与检索要点

VSETVL 用寄存器而不是 vtypei 立即数字段提供 vtype。它仍然按 rs1/rd 组合确定 AVL。普通 AVL 形式从 rs1 读取元素请求数。VLMAX 请求形式:rs1=x0,rd 必须非零。保留当前 vl 形式:rd=x0,rs1=x0。该形式适合从整数寄存器中的完整 vtype 值恢复向量状态。

OP-V opcode 为 1010111,funct3=111;rs2 提供完整 vtype 值。
AVL 仍由 rs1/rd 组合确定。普通 AVL 形式:rs1 非零,使用 x[rs1]。VLMAX 请求形式:rs1=x0,rd 必须非零。保留当前 vl 形式:rd=x0,rs1=x0。
官方规则要求检查 rs2 中作为 vtype 的所有 XLEN 位,不能只解释低位字段。
rd=x0 且 rs1=x0 的形式要求新旧 VLMAX 相同且原 vill=0;否则保留,实现可设置 vill。
普通不支持配置设置 vill=1、其他 vtype 位及 vl=0;实现也可对非法 vtype 选择陷入以支持模拟。

向量执行上下文

rd、rs1、rs2 均为整数寄存器。rs2 的全部 XLEN 位提供 vtype;x0 提供 0(e8,m1,tu,mu)。同名源必须读取同一旧值。

32 位 OP-V:bits[31:25]=1000000,随后是 rs2、rs1、funct3=111、rd、opcode=1010111;没有 rs3 或 v0.t。rs1≠x0 时 AVL=x[rs1];rs1=x0 且 rd≠x0 请求 VLMAX。

VLMAX=LMUL×VLEN/SEW。AVL≤VLMAX 时 vl=AVL;VLMAX<AVL<2×VLMAX 时 ceil(AVL/2)≤vl≤VLMAX;AVL≥2×VLMAX 时 vl=VLMAX。同一实现对相同 AVL/VLMAX 确定。

rd=rs1=x0 使用当前 vl 作 AVL,仅在 VLMAX 不变且原 vill=0 时可用,否则保留,实现可设置 vill。rd=x0 只丢弃 GPR 写回。

要求 V 1.0 和所需向量状态已启用;vset 不依赖旧 vtype。成功完成更新 vl/vtype 并清 vstart。不支持的 vtype 设置 vill、其他 vtype 位及 vl 为 0;实现也可选择陷入以模拟非法配置。

The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture — Version 20260120, Chapter 31

常见使用场景

上下文切换

假定 RV32/RV64 V、向量状态已启用、e32,m1,ta,ma 可用、VLEN=256,故 VLMAX=8。a0=8、a1=0xD0(完整 vtype,其他位为0):成功执行示例后 vl=t0=8、vstart=0。没有逐元素 mask 操作。

向量状态恢复

假定 RV32/RV64 V、向量状态已启用、e32,m1,ta,ma 可用、VLEN=256,故 VLMAX=8。a0=8、a1=0xD0(完整 vtype,其他位为0):成功执行示例后 vl=t0=8、vstart=0。没有逐元素 mask 操作。

使用前检查清单

语法检查
  • rd、rs1、rs2 均为整数寄存器。rs2 的全部 XLEN 位提供 vtype;x0 提供 0(e8,m1,tu,mu)。同名源必须读取同一旧值。
  • 32 位 OP-V:bits[31:25]=1000000,随后是 rs2、rs1、funct3=111、rd、opcode=1010111;没有 rs3 或 v0.t。rs1≠x0 时 AVL=x[rs1];rs1=x0 且 rd≠x0 请求 VLMAX。
语义检查
  • VLMAX=LMUL×VLEN/SEW。AVL≤VLMAX 时 vl=AVL;VLMAX<AVL<2×VLMAX 时 ceil(AVL/2)≤vl≤VLMAX;AVL≥2×VLMAX 时 vl=VLMAX。同一实现对相同 AVL/VLMAX 确定。
  • rd=rs1=x0 使用当前 vl 作 AVL,仅在 VLMAX 不变且原 vill=0 时可用,否则保留,实现可设置 vill。rd=x0 只丢弃 GPR 写回。
  • 要求 V 1.0 和所需向量状态已启用;vset 不依赖旧 vtype。成功完成更新 vl/vtype 并清 vstart。不支持的 vtype 设置 vill、其他 vtype 位及 vl 为 0;实现也可选择陷入以模拟非法配置。

容易混淆 / 常见误区

rs2 中作为 vtype 的所有 XLEN 位都必须被检查。
保留当前 vl 形式必须同时满足 rd=x0 且 rs1=x0,并且只适用于 VLMAX 不变且原 vill=0 的情况。
vtype 值来自寄存器 rs2,不在汇编中直接写 e32/m1/ta/ma。

常见问题

VSETVL 的 rs2 是普通源操作数吗?

不是。rs2 的值被解释为完整 vtype 配置,用于设置 SEW、LMUL、vta、vma 等状态。

为什么 VSETVL 适合状态恢复?

因为保存/恢复代码可以把之前保存的 vtype 值放入 rs2,再用 VSETVL 重建 vl/vtype 一致状态。

VSETVL 的 AVL 是否总是来自 rs1?

不是。普通 AVL 形式:rs1 非零,AVL=x[rs1]。VLMAX 请求形式:rs1=x0,rd 必须非零。保留当前 vl 形式:rd=x0,rs1=x0。