VLE16.V

RISC-V VLE16.V 指令详解

指令手册V-type

从 x[rs1] 开始按单位步长装入 16 位元素到 vd。

指令语法

vle16.v vd, (rs1), vm
操作数说明
vd 接收 EEW=16 位内存 bit pattern;EMUL=(EEW/SEW)×LMUL,必须在 1/8..8 内且寄存器组起点合法。它不把元素扩展为 XLEN 宽标量。
rs1 是整数基址寄存器;元素 i 地址为 x[rs1]+i×2 字节,rs1=x0 时基址为 0。v0.t 表示 vm=0;省略为 vm=1。
需要启用 V、合法 vtype。活动 body 为 vstart≤i<vl 且掩码开启;masked vd 不能覆盖 v0。关闭元素不访问内存;inactive/tail 按 vma/vta,prestart 保持不变。VL=0 或 vstart≥vl 时目标不更新。
本指令按当前 vl 执行,不修改 vl;正常完成后 vstart=0。非自然对齐可成功或触发未对齐异常;单位步长不保证各元素访问顺序。
V向量内存向量装载

指令行为说明

VLE16.V 是 RISC-V V 扩展的 16 位单位步长向量装载指令。活动 body 元素从 x[rs1] + i * 2 字节的连续地址读取内存元素并写入 vd;vm=0 时由 v0.t 选择元素,掩码关闭元素不访问内存。

VLE16.V 指令解析与执行动画

从编码字段解析 16 位单位步长装载,再逐元素计算 x[rs1] + i * 2。

输入的指令
vle16.v
执行环境:EEW=16,单位步长=2 字节,示例 SEW=16,LMUL=m1,vstart=0(非零时从该元素开始);这些不属于汇编语法操作数。

教学环境:VLEN=4096,SEW=EEW=16,LMUL=EMUL=m1,VLMAX=256,vstart=0,合法 vtype,VS 已启用,ta/ma。基址选项自然对齐;rs1=x0 时基址固定为 0。仅演示所选同步异常场景,假定其余所选内存可读;不保证实际系统地址可访问。横向逐元素步骤只说明地址与结果,不表示实际访问顺序或处理器周期。inactive/tail 可保留旧值或写全 1,未显示确定结果;正常完成后 vstart=0。

编码字段vle16.v / LOAD-FP
31..29
nf
000
28
mew
0
27..26
mop
00
25
vm
0
24..20
lumop
00000
19..15
rs1
01010
14..12
width
101
11..7
vd/vs3
01000
6..0
opcode
0000111
地址与数据路径addr[i] = 0x8000 + i * 2
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10
i=11
i=12
i=13
i=14
i=15
addr
0x8000
0x8002
0x8004
0x8006
0x8008
0x800a
0x800c
0x800e
0x8010
0x8012
0x8014
0x8016
0x8018
0x801a
0x801c
0x801e
mem
0x0011
0x0022
0x0033
0x0044
0x0055
0x0066
0x0077
0x0088
0x0099
0x00aa
0x00bb
0x00cc
0x00dd
0x00ee
0x00ff
0x0110
active
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
v8
...
...
-
...
...
...
...
-
...
...
...
...
-
...
...
...
步骤 1 / 22

显示向量内存指令编码

动画从 32 位向量内存指令编码开始,按官方位段显示 nf、mew、mop、vm、rs2/vs2 或 lumop/sumop、width、寄存器字段和 opcode。

快速理解与检索要点

VLE16.V 是 RVV 16 位单位步长向量装载:每个活动元素使用地址 x[rs1] + i * 2 字节从内存读取,元素数据写入目标向量寄存器组 vd。vl 和 v0.t 掩码决定哪些 body 元素真正访问内存。

指令名固定内存元素宽度 EEW=16;单位步长地址按 EEW/8 字节递增,而不是按当前 SEW 文本或数组索引任意缩放。
单位步长形式从 x[rs1] 开始访问连续元素地址;stride 和 indexed/gather/scatter 访问属于 vlse/vsse、vluxei/vloxei、vsuxei/vsoxei 等其他指令族。
vm=0 时 v0.t 选择参与的 body 元素,vm=1 时所有 body 元素参与;被掩码关闭的元素不发起内存访问。
活动元素接收内存 bit pattern,不做标量式符号扩展;inactive/tail 按 vma/vta 保留旧值或允许写全 1,prestart 元素保持不变。
数据 EEW=16,EMUL=(EEW/SEW)×LMUL;EMUL 必须在 1/8 到 8 内,且 vd 必须是该组的合法起始寄存器。masked load 的目标组不能与 v0 重叠。
非自然对齐元素可以成功传输,也可以触发地址未对齐异常;标量支持非对齐不保证向量也支持。单位步长各元素访问之间不保证顺序。
body 范围是 vstart≤i<vl;prestart 元素不更新,VL=0 或 vstart≥vl 时任何目标元素(含 tail)都不更新。正常完成后 vstart=0;需启用 V 且当前 vtype 合法。

向量执行上下文

vd 接收 EEW=16 位内存 bit pattern;EMUL=(EEW/SEW)×LMUL,必须在 1/8..8 内且寄存器组起点合法。它不把元素扩展为 XLEN 宽标量。

rs1 是整数基址寄存器;元素 i 地址为 x[rs1]+i×2 字节,rs1=x0 时基址为 0。v0.t 表示 vm=0;省略为 vm=1。

需要启用 V、合法 vtype。活动 body 为 vstart≤i<vl 且掩码开启;masked vd 不能覆盖 v0。关闭元素不访问内存;inactive/tail 按 vma/vta,prestart 保持不变。VL=0 或 vstart≥vl 时目标不更新。

本指令按当前 vl 执行,不修改 vl;正常完成后 vstart=0。非自然对齐可成功或触发未对齐异常;单位步长不保证各元素访问顺序。

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

常见使用场景

连续数组读取

假定 V/VS 已启用、合法 e16,m1、VLMAX≥4、AVL=4,vsetvli 后 vl=4、vstart=0、ta/ma,目标不与源掩码重叠。除所选故障外内存均可读,地址步长=2 字节:a0=0x8000, v0=[1,0,1,1], mem=[10,20,30,40] → vd=[10,agnostic,30,40]。agnostic 可保留旧值或写全 1;不保证清零。

向量化内存访问

假定 V/VS 已启用、合法 e16,m1、VLMAX≥4、AVL=4,vsetvli 后 vl=4、vstart=0、ta/ma,目标不与源掩码重叠。除所选故障外内存均可读,地址步长=2 字节:a0=0x8000, v0=[1,0,1,1], mem=[10,20,30,40] → vd=[10,agnostic,30,40]。agnostic 可保留旧值或写全 1;不保证清零。

使用前检查清单

语法检查
  • vd 接收 EEW=16 位内存 bit pattern;EMUL=(EEW/SEW)×LMUL,必须在 1/8..8 内且寄存器组起点合法。它不把元素扩展为 XLEN 宽标量。
  • rs1 是整数基址寄存器;元素 i 地址为 x[rs1]+i×2 字节,rs1=x0 时基址为 0。v0.t 表示 vm=0;省略为 vm=1。
语义检查
  • 需要启用 V、合法 vtype。活动 body 为 vstart≤i<vl 且掩码开启;masked vd 不能覆盖 v0。关闭元素不访问内存;inactive/tail 按 vma/vta,prestart 保持不变。VL=0 或 vstart≥vl 时目标不更新。
  • 本指令按当前 vl 执行,不修改 vl;正常完成后 vstart=0。非自然对齐可成功或触发未对齐异常;单位步长不保证各元素访问顺序。

容易混淆 / 常见误区

指令名中的 16 是内存元素宽度 EEW;地址步长是 2 字节。
单位步长访问连续地址;不要把它当作 indexed gather/scatter。
被掩码关闭的元素不发起内存读取,目标元素按当前 mask policy 处理。

常见问题

VLE16.V 会自动设置 vl 吗?

不会。vl/vtype 由此前的 vsetvli、vsetivli 或 vsetvl 设置;向量加载/存储按当前配置执行。

单位步长装载的地址如何计算?

第 i 个活动元素使用 x[rs1] + i * 2 字节;这是连续内存访问,不是任意 gather/scatter。

被 v0.t 关闭的元素会访问内存吗?

不会。vm=0 且对应 v0.t 位为 0 的 body 元素不会执行该元素的装载内存访问。