vsetvli

Vector Set Vector Type and Vector Length Immediate

This instruction is defined by:

Encoding

svg

Synopsis

Set the vtype and vl CSRs, and write the new value of vl into rd.

Access

M HS U VS VU

Always

Always

Always

Always

Always

Decode Variables

Bits<11> vtypei = $encoding[30:20];
Bits<5> xs1 = $encoding[19:15];
Bits<5> xd = $encoding[11:7];

Execution

  • Pruned, XLEN == 64

  • Original

XReg new_vtype = vtypei;
if ((new_vtype[63] == 1'b1) || (new_vtype[5] == 1) || (new_vtype[2:0] == 3'b100)) {
  CSR[vtype].VILL = 1;
  CSR[vtype].VMA = 0;
  CSR[vtype].VTA = 0;
  CSR[vtype].VSEW = 0;
  CSR[vtype].VLMUL = 0;
  CSR[vl].VALUE = 0;
} else {
  CSR[vtype].VILL = 0;
  CSR[vtype].VMA = new_vtype[7];
  CSR[vtype].VTA = new_vtype[6];
  CSR[vtype].VSEW = new_vtype[5:3];
  CSR[vtype].VLMUL = new_vtype[2:0];
  VectorState state = vector_state();
  XReg vlen = VLEN;
  XReg vlmax = (vlen << state.log2_lmul) >> state.log2_sew;
  XReg avl = X[xs1];
  XReg ceil_avl_over_two = (avl + 1) / 2;
  if (xs1 == 0) {
    CSR[vl].VALUE = vlmax;
  } else {
    if (avl <= vlmax) {
      CSR[vl].VALUE = avl;
    } else if (avl < 2 * vlmax) {
      if (RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX == "ceil(AVL/2)") {
        CSR[vl].VALUE = ceil_avl_over_two;
      } else if (RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX == "VLMAX") {
        CSR[vl].VALUE = vlmax;
      } else {
        unpredictable("Implementations may choose a custom value for vl in the case AVL < (2*VLMAX), so long as ceil(AVL/2) <= vl <= VLMAX");
      }
    } else {
      CSR[vl].VALUE = vlmax;
    }
  }
}
X[xd] = CSR[vl].VALUE;
CSR[vstart].VALUE = 0;
XReg new_vtype = vtypei;
if ((new_vtype[xlen() - 1] == 1'b1) || new_vtype & 8'd0) != 0) || (new_vtype[5] == 1) || (new_vtype[2:0] == 3'b100 {
  CSR[vtype].VILL = 1;
  CSR[vtype].VMA = 0;
  CSR[vtype].VTA = 0;
  CSR[vtype].VSEW = 0;
  CSR[vtype].VLMUL = 0;
  CSR[vl].VALUE = 0;
} else {
  CSR[vtype].VILL = 0;
  CSR[vtype].VMA = new_vtype[7];
  CSR[vtype].VTA = new_vtype[6];
  CSR[vtype].VSEW = new_vtype[5:3];
  CSR[vtype].VLMUL = new_vtype[2:0];
  VectorState state = vector_state();
  XReg vlen = VLEN;
  XReg vlmax = (vlen << state.log2_lmul) >> state.log2_sew;
  XReg avl = X[xs1];
  XReg ceil_avl_over_two = (avl + 1) / 2;
  if (xs1 == 0) {
    CSR[vl].VALUE = vlmax;
  } else {
    if (avl <= vlmax) {
      CSR[vl].VALUE = avl;
    } else if (avl < 2 * vlmax) {
      if (RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX == "ceil(AVL/2)") {
        CSR[vl].VALUE = ceil_avl_over_two;
      } else if (RVV_VL_WHEN_AVL_LT_DOUBLE_VLMAX == "VLMAX") {
        CSR[vl].VALUE = vlmax;
      } else {
        unpredictable("Implementations may choose a custom value for vl in the case AVL < (2*VLMAX), so long as ceil(AVL/2) <= vl <= VLMAX");
      }
    } else {
      CSR[vl].VALUE = vlmax;
    }
  }
}
X[xd] = CSR[vl].VALUE;
CSR[vstart].VALUE = 0;