首页/指令库/设置向量长度立即数
VSETVLI

RISC-V VSETVLI 指令详解

指令手册I-type

按 rs1/rd 的 AVL 规则和 vtypei 配置 vl/vtype,并把新 vl 写入 rd

指令语法

vsetvli rd, rs1, vtypei
操作数说明
rd:接收硬件选择后的新 vl;rd=x0 时不保存到整数寄存器。
rs1:提供 AVL,特殊 rs1=x0 形式用于请求 VLMAX 或保留当前 vl。
vtypei:编码 SEW、LMUL、tail policy 和 mask policy。
V向量运算向量配置

指令行为说明

VSETVLI 是 RVV 的向量配置指令。它使用 OP-V 编码空间和 funct3=111,根据 rs1/rd 组合确定 AVL。普通 AVL 形式:rs1 非零,AVL=x[rs1]。VLMAX 请求形式:rs1=x0,rd 必须非零。保留当前 vl 形式:rd=x0,rs1=x0,且只在新 SEW/LMUL 比例不改变 VLMAX 并且原 vtype.vill=0 时有效。vtypei 编码 SEW、LMUL、vta 和 vma;新 vl 写入 rd,rd=x0 时不保存到整数寄存器。若 vtype 不受支持,官方规则设置 vill 且 vl=0。

VSETVLI 指令解析与执行动画

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

步骤 1 / 6

编码

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

输入的指令
vsetvli
范围提示:此动画只展示 V 扩展定义的 ISA 可见 vl/vtype 选择关系。示例 VLMAX 与中间区间 vl 选择都是教学输入,不代表具体处理器的 VLEN、ELEN、支持矩阵或操作系统处理。
编码字段vsetvli / OP-V
31
fixed
0
30..20
vtypei
00011010000
19..15
rs1
01010
14..12
funct3
111
11..7
rd
00101
6..0
opcode
1010111
asm
form
VSETVLI
配置数据路径
AVL source
x10
AVL
40
VLMAX
16
selected vl
16
vtype
e32, m1, ta, ma
x5
16
当前配置摘要
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 元素范围。

快速理解与检索要点

VSETVLI 是最常见的 RVV 配置入口。先从 rs1/rd 组合得到 AVL,再从 vtypei 得到 SEW、LMUL、vta、vma,最后按实现的 VLMAX 选择 vl,并把 vl 写入 rd。后续向量指令按这个 vl/vtype 解释活动元素、尾部和掩码关闭元素。

OP-V opcode 为 1010111,funct3=111;vtypei 位段编码 vma、vta、vsew 和 vlmul。
普通 AVL 形式:rs1 非零,AVL=x[rs1]。VLMAX 请求形式:rs1=x0,rd 必须非零。保留当前 vl 形式:rd=x0,rs1=x0。
新 vl 写入 rd;rd=x0 只丢弃整数寄存器写回,不阻止 vl/vtype 更新。
不支持的 vtype 按官方规则设置 vill 且 vl=0;页面动画不模拟具体实现的支持矩阵。

向量执行上下文

阅读 VSETVLI 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。后缀和操作数形式决定源操作数来自向量、标量还是立即数。

先看 vl

当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。

再看 vtype

当前 vtype 提供 SEW、LMUL、tail policy 和 mask policy;这些规则影响元素宽度、寄存器组大小以及非活动/尾部目标元素。

最后看 vm/v0

带 vm 的普通向量指令在 vm=0 时用 v0 作为执行掩码,vm=1 表示未掩码。VMERGE 等少数形式会把 v0 当作数据选择输入。

官方来源:RISC-V V Standard Extension for Vector Operations

常见使用场景

位操作与掩码

结合 «vsetvli t0, a0, e32, m1, ta, ma # configure SEW=32, LMUL=1, write vl to t0» 等实际代码理解该场景。

向量运算

结合 «vsetvli t0, a0, e32, m1, ta, ma # configure SEW=32, LMUL=1, write vl to t0» 等实际代码理解该场景。

循环与迭代

结合 «vsetvli t0, a0, e32, m1, ta, ma # configure SEW=32, LMUL=1, write vl to t0» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 I-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

rs1=x0 且 rd!=x0 才是请求 VLMAX;rd=x0,rs1=x0 是保留现有 vl 的特殊形式。
V 1.0 汇编应显式写 ta/tu 和 ma/mu。
不支持的 vtype 按官方规则设置 vill 并使 vl=0。

常见问题

vsetvli x0, x0, ... 是请求 VLMAX 吗?

不是。保留当前 vl 形式:rd=x0,rs1=x0。VLMAX 请求形式:rs1=x0,rd 必须非零。

vsetvli 会按 vtypei 直接固定 vl 吗?

不会。vtypei 选择 SEW/LMUL 和策略位;vl 由 AVL、VLMAX 和官方向量长度选择规则决定。