VSETIVLI 和 VSETVLI 的区别是什么?
VSETIVLI 的 AVL 来自 5 位 uimm;VSETVLI 的 AVL 通常来自 rs1,并有 rs1=x0 的特殊形式。二者都用 vtypei 配置 vtype。
使用 5 位立即数 AVL 和 vtypei 配置 vl/vtype,并把新 vl 写入 rd
VSETIVLI 是 VSETVLI 的立即数 AVL 形式。它使用 5 位零扩展 uimm 作为 AVL,并用 vtypei 编码 SEW、LMUL、vta 和 vma。硬件按 AVL 与 VLMAX 选择新 vl,更新 vl/vtype,并把新 vl 写入 rd;rd=x0 时只丢弃整数寄存器写回。成功执行会把 vstart 归零。
从 vset 编码字段解析 AVL 来源和 vtype 设置,再展示 vl/vtype/rd 的架构可见更新。
VSETIVLI 属于 OP-V 配置指令。本步先看 opcode、funct3 以及承载 AVL/vtype 的字段。
假定 V 和所需向量状态已启用。本动画只演示成功完成路径(不支持配置采用 vill 路径);实现也可对非法 vtype 选择陷入以支持模拟。AVL 数值输入限于可精确表示的非负安全整数,按 RV64 教学环境解释。各步骤用于讲解,不代表硬件周期。
VSETIVLI 把 AVL 直接放在指令的 5 位立即数字段中,适合小常量元素数。它仍然通过 vtypei 配置 SEW、LMUL、vta 和 vma,最终更新 vl/vtype 并可把新 vl 保存到 rd。
rd 为整数寄存器;uimm 是零扩展 5 位 AVL(0–31),包括合法的 0;vtypei 指定 SEW、LMUL、ta/tu 和 ma/mu。
32 位 OP-V:bits[31:30]=11,bits[29:20]=vtypei[9:0]、bits[19:15]=uimm,funct3=111、opcode=1010111;无符号立即数不能按普通 I 型符号扩展。
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=x0 只丢弃 GPR 写回;uimm 仍提供 AVL,不存在 rs1=x0 特殊形式。
要求 V 1.0 和所需向量状态已启用;vset 不依赖旧 vtype。成功完成更新 vl/vtype 并清 vstart。不支持的 vtype 设置 vill、其他 vtype 位及 vl 为 0;实现也可选择陷入以模拟非法配置。
假定 RV32/RV64 V、向量状态已启用、e32,m1,ta,ma 可用、VLEN=256,故 VLMAX=8。uimm=8:成功执行示例后 vl=t0=8、vstart=0。没有逐元素 mask 操作。
假定 RV32/RV64 V、向量状态已启用、e32,m1,ta,ma 可用、VLEN=256,故 VLMAX=8。uimm=8:成功执行示例后 vl=t0=8、vstart=0。没有逐元素 mask 操作。
VSETIVLI 的 AVL 来自 5 位 uimm;VSETVLI 的 AVL 通常来自 rs1,并有 rs1=x0 的特殊形式。二者都用 vtypei 配置 vtype。
不是。uimm=0 表示 AVL=0,按官方向量长度选择规则得到 vl=0。