xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnitComp.scala (revision d33dbc9eb694669d71efef48f03ba09bc334ecab)
1d91483a6Sfdy/***************************************************************************************
2e3da8badSTang Haojin * Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC)
3e3da8badSTang Haojin * Copyright (c) 2020-2024 Institute of Computing Technology, Chinese Academy of Sciences
4d91483a6Sfdy * Copyright (c) 2020-2021 Peng Cheng Laboratory
5d91483a6Sfdy *
6d91483a6Sfdy * XiangShan is licensed under Mulan PSL v2.
7d91483a6Sfdy * You can use this software according to the terms and conditions of the Mulan PSL v2.
8d91483a6Sfdy * You may obtain a copy of Mulan PSL v2 at:
9d91483a6Sfdy *          http://license.coscl.org.cn/MulanPSL2
10d91483a6Sfdy *
11d91483a6Sfdy * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
12d91483a6Sfdy * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
13d91483a6Sfdy * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
14d91483a6Sfdy *
15d91483a6Sfdy * See the Mulan PSL v2 for more details.
16d91483a6Sfdy ***************************************************************************************/
17d91483a6Sfdy
18d91483a6Sfdypackage xiangshan.backend.decode
19d91483a6Sfdy
2083ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
21d91483a6Sfdyimport chisel3._
22d91483a6Sfdyimport chisel3.util._
23d91483a6Sfdyimport freechips.rocketchip.rocket.Instructions
24d91483a6Sfdyimport freechips.rocketchip.util.uintToBitPat
25d91483a6Sfdyimport utils._
26d91483a6Sfdyimport utility._
27d91483a6Sfdyimport xiangshan.ExceptionNO.illegalInstr
28d91483a6Sfdyimport xiangshan._
29d91483a6Sfdyimport xiangshan.backend.fu.fpu.FPU
30d91483a6Sfdyimport xiangshan.backend.fu.FuType
31d91483a6Sfdyimport freechips.rocketchip.rocket.Instructions._
32d91483a6Sfdyimport xiangshan.backend.Bundles.{DecodedInst, StaticInst}
3398cfe81bSxgkiriimport xiangshan.backend.decode.isa.bitfield.XSInstBitFields
349fabe323SZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VSew, VType, VLmul, Vl}
35d91483a6Sfdyimport yunsuan.VpermType
36c4501a6fSZiyue-Zhangimport chisel3.util.experimental.decode.{QMCMinimizer, TruthTable, decoder}
37c4501a6fSZiyue-Zhang
38c4501a6fSZiyue-Zhangclass indexedLSUopTable(uopIdx:Int) extends Module {
3955f7bedaSZiyue Zhang  val src = IO(Input(UInt(4.W)))
40c4501a6fSZiyue-Zhang  val outOffsetVs2 = IO(Output(UInt(3.W)))
41c4501a6fSZiyue-Zhang  val outOffsetVd = IO(Output(UInt(3.W)))
4255f7bedaSZiyue Zhang  def genCsBundle_VEC_INDEXED_LDST(lmul:Int, emul:Int, uopIdx:Int): (Int, Int) ={
4355f7bedaSZiyue Zhang    // only consider non segment indexed load/store
44c4501a6fSZiyue-Zhang    if (lmul < emul) {    // lmul < emul, uop num is depend on emul * nf
45c4501a6fSZiyue-Zhang      var offset = 1 << (emul - lmul)
46de785770Szhanglinjuan      for (i <- 0 until (1 << emul)) {
4755f7bedaSZiyue Zhang        if (uopIdx == i) {
4855f7bedaSZiyue Zhang          return (i, i / offset)
49c4501a6fSZiyue-Zhang        }
50c4501a6fSZiyue-Zhang      }
51c379dcbeSZiyue-Zhang    } else {              // lmul > emul, uop num is depend on lmul * nf
52c4501a6fSZiyue-Zhang      var offset = 1 << (lmul - emul)
53de785770Szhanglinjuan      for (i <- 0 until (1 << lmul)) {
5455f7bedaSZiyue Zhang        if (uopIdx == i) {
5555f7bedaSZiyue Zhang          return (i / offset, i)
56c4501a6fSZiyue-Zhang        }
57c4501a6fSZiyue-Zhang      }
58c4501a6fSZiyue-Zhang    }
5955f7bedaSZiyue Zhang    return (0, 0)
60c4501a6fSZiyue-Zhang  }
61c4501a6fSZiyue-Zhang  // strided load/store
6255f7bedaSZiyue Zhang  var combVemulNf : Seq[(Int, Int, Int, Int)] = Seq()
63c4501a6fSZiyue-Zhang  for (emul <- 0 until 4) {
64c4501a6fSZiyue-Zhang    for (lmul <- 0 until 4) {
6555f7bedaSZiyue Zhang      var offset = genCsBundle_VEC_INDEXED_LDST(lmul, emul, uopIdx)
66c4501a6fSZiyue-Zhang      var offsetVs2 = offset._1
67c4501a6fSZiyue-Zhang      var offsetVd = offset._2
6855f7bedaSZiyue Zhang      combVemulNf :+= (emul, lmul, offsetVs2, offsetVd)
69c4501a6fSZiyue-Zhang    }
70c4501a6fSZiyue-Zhang  }
710cd00663SzhanglyGit  val out = decoder(QMCMinimizer, src, TruthTable(combVemulNf.map {
7255f7bedaSZiyue Zhang    case (emul, lmul, offsetVs2, offsetVd) =>
7355f7bedaSZiyue Zhang      (BitPat((emul << 2 | lmul).U(4.W)), BitPat((offsetVs2 << 3 | offsetVd).U(6.W)))
7455f7bedaSZiyue Zhang  }, BitPat.N(6)))
75c4501a6fSZiyue-Zhang  outOffsetVs2 := out(5, 3)
76c4501a6fSZiyue-Zhang  outOffsetVd := out(2, 0)
77c4501a6fSZiyue-Zhang}
78d91483a6Sfdy
79d91483a6Sfdytrait VectorConstants {
80d91483a6Sfdy  val MAX_VLMUL = 8
81ac0f8299SZiyue Zhang  val VECTOR_TMP_REG_LMUL = 32 // 32~46  ->  15
82e4e68f86Sxiaofeibao  val VECTOR_COMPRESS = 1 // in v0 regfile
83c4501a6fSZiyue-Zhang  val MAX_INDEXED_LS_UOPNUM = 64
84d91483a6Sfdy}
85d91483a6Sfdy
86f7fe02a8Sjunxiong-jiclass DecodeUnitCompInput(implicit p: Parameters) extends XSBundle {
87f7fe02a8Sjunxiong-ji  val simpleDecodedInst = new DecodedInst
88f7fe02a8Sjunxiong-ji  val uopInfo = new UopInfo
89f7fe02a8Sjunxiong-ji}
90f7fe02a8Sjunxiong-ji
91f7fe02a8Sjunxiong-jiclass DecodeUnitCompOutput(implicit p: Parameters) extends XSBundle {
92f7fe02a8Sjunxiong-ji  val complexDecodedInsts = Vec(RenameWidth, DecoupledIO(new DecodedInst))
93f7fe02a8Sjunxiong-ji}
94f7fe02a8Sjunxiong-ji
95d91483a6Sfdyclass DecodeUnitCompIO(implicit p: Parameters) extends XSBundle {
96e25c13faSXuan Hu  val redirect = Input(Bool())
97d91483a6Sfdy  val csrCtrl = Input(new CustomCSRCtrlIO)
9896a12457Ssinsanction  val vtypeBypass = Input(new VType)
99e25c13faSXuan Hu  // When the first inst in decode vector is complex inst, pass it in
100f7fe02a8Sjunxiong-ji  val in = Flipped(DecoupledIO(new DecodeUnitCompInput))
101f7fe02a8Sjunxiong-ji  val out = new DecodeUnitCompOutput
102e25c13faSXuan Hu  val complexNum = Output(UInt(3.W))
103d91483a6Sfdy}
10417ec87f2SXuan Hu
105d91483a6Sfdy/**
106d91483a6Sfdy * @author zly
107d91483a6Sfdy */
108d91483a6Sfdyclass DecodeUnitComp()(implicit p : Parameters) extends XSModule with DecodeUnitConstants with VectorConstants {
109d91483a6Sfdy  val io = IO(new DecodeUnitCompIO)
110d91483a6Sfdy
111e25c13faSXuan Hu  // alias
112e25c13faSXuan Hu  private val inReady = io.in.ready
113e25c13faSXuan Hu  private val inValid = io.in.valid
114e25c13faSXuan Hu  private val inDecodedInst = WireInit(io.in.bits.simpleDecodedInst)
115229ab603SXuan Hu  private val inInstFields = io.in.bits.simpleDecodedInst.instr.asTypeOf(new XSInstBitFields)
116e25c13faSXuan Hu  private val inUopInfo = io.in.bits.uopInfo
117e25c13faSXuan Hu  private val outValids = io.out.complexDecodedInsts.map(_.valid)
118e25c13faSXuan Hu  private val outReadys = io.out.complexDecodedInsts.map(_.ready)
119e25c13faSXuan Hu  private val outDecodedInsts = io.out.complexDecodedInsts.map(_.bits)
120e25c13faSXuan Hu  private val outComplexNum = io.complexNum
121e25c13faSXuan Hu
122d91483a6Sfdy  val maxUopSize = MaxUopSize
123229ab603SXuan Hu  when (io.in.fire && io.in.bits.simpleDecodedInst.isVset) {
124229ab603SXuan Hu    when(inInstFields.RD === 0.U && inInstFields.RS1 === 0.U) {
125229ab603SXuan Hu      inDecodedInst.fuOpType := VSETOpType.keepVl(io.in.bits.simpleDecodedInst.fuOpType)
126229ab603SXuan Hu    }.elsewhen(inInstFields.RS1 === 0.U) {
127229ab603SXuan Hu      inDecodedInst.fuOpType := VSETOpType.setVlmax(io.in.bits.simpleDecodedInst.fuOpType)
128229ab603SXuan Hu    }
129229ab603SXuan Hu  }
130229ab603SXuan Hu
131e25c13faSXuan Hu  val latchedInst = RegEnable(inDecodedInst, inValid && inReady)
132e25c13faSXuan Hu  val latchedUopInfo = RegEnable(inUopInfo, inValid && inReady)
133d91483a6Sfdy  //input bits
134e25c13faSXuan Hu  private val instFields: XSInstBitFields = latchedInst.instr.asTypeOf(new XSInstBitFields)
135d91483a6Sfdy
136e25c13faSXuan Hu  val src1 = Cat(0.U(1.W), instFields.RS1)
137e25c13faSXuan Hu  val src2 = Cat(0.U(1.W), instFields.RS2)
138e25c13faSXuan Hu  val dest = Cat(0.U(1.W), instFields.RD)
1397f9f0a79SzhanglyGit
140e25c13faSXuan Hu  val nf    = instFields.NF
141e25c13faSXuan Hu  val width = instFields.WIDTH(1, 0)
142d91483a6Sfdy
143d91483a6Sfdy  //output of DecodeUnit
144e25c13faSXuan Hu  val numOfUop = Wire(UInt(log2Up(maxUopSize).W))
145e25c13faSXuan Hu  val numOfWB = Wire(UInt(log2Up(maxUopSize).W))
1467f9f0a79SzhanglyGit  val lmul = Wire(UInt(4.W))
147189ec863SzhanglyGit  val isVsetSimple = Wire(Bool())
148d91483a6Sfdy
14955f7bedaSZiyue Zhang  val indexedLSRegOffset = Seq.tabulate(MAX_VLMUL)(i => Module(new indexedLSUopTable(i)))
150c4501a6fSZiyue-Zhang  indexedLSRegOffset.map(_.src := 0.U)
151c4501a6fSZiyue-Zhang
152d91483a6Sfdy  //pre decode
153e25c13faSXuan Hu  lmul := latchedUopInfo.lmul
154e25c13faSXuan Hu  isVsetSimple := latchedInst.isVset
155e25c13faSXuan Hu  val vlmulReg = latchedInst.vpu.vlmul
156e25c13faSXuan Hu  val vsewReg = latchedInst.vpu.vsew
1575110577fSZiyue Zhang  val vstartReg = latchedInst.vpu.vstart
158229ab603SXuan Hu
159d91483a6Sfdy  //Type of uop Div
160e25c13faSXuan Hu  val typeOfSplit = latchedInst.uopSplitType
161e25c13faSXuan Hu  val src1Type = latchedInst.srcType(0)
162d6059658SZiyue Zhang  val src1IsImm = src1Type === SrcType.imm
163395c8649SZiyue-Zhang  val src1IsFp = src1Type === SrcType.fp
164d91483a6Sfdy
1657635b2a1SZiyue Zhang  val isVstore = FuType.isVStore(latchedInst.fuType)
1667635b2a1SZiyue Zhang
1679fabe323SZiyue Zhang  // exception generator
1689fabe323SZiyue Zhang  val vecException = Module(new VecExceptionGen)
1699fabe323SZiyue Zhang  vecException.io.inst := latchedInst.instr
1709fabe323SZiyue Zhang  vecException.io.decodedInst := latchedInst
1719fabe323SZiyue Zhang  vecException.io.vtype := latchedInst.vpu.vtype
1729fabe323SZiyue Zhang  vecException.io.vstart := latchedInst.vpu.vstart
1739fabe323SZiyue Zhang  val illegalInst = vecException.io.illegalInst
1749fabe323SZiyue Zhang
175e25c13faSXuan Hu  numOfUop := latchedUopInfo.numOfUop
176e25c13faSXuan Hu  numOfWB := latchedUopInfo.numOfWB
177e25c13faSXuan Hu
178e25c13faSXuan Hu  //uops dispatch
179e25c13faSXuan Hu  val s_idle :: s_active :: Nil = Enum(2)
180e25c13faSXuan Hu  val state = RegInit(s_idle)
181e25c13faSXuan Hu  val stateNext = WireDefault(state)
182e25c13faSXuan Hu  val numDecodedUop = RegInit(0.U(log2Up(maxUopSize).W))
183e25c13faSXuan Hu  val uopRes = RegInit(0.U(log2Up(maxUopSize).W))
184e25c13faSXuan Hu  val uopResNext = WireInit(uopRes)
185964d9a87SZiyue Zhang  val e64 = 3.U(2.W)
186b0480352SZiyue Zhang  val isUsSegment = instFields.MOP === 0.U && ((nf =/= 0.U && instFields.LUMOP === 0.U) || instFields.LUMOP === "b10000".U)
1874aa00286SXuan Hu  val isIxSegment = instFields.MOP(0) === 1.U && nf =/= 0.U
1884aa00286SXuan Hu  val isSdSegment = instFields.MOP === "b10".U && nf =/= 0.U
1897f9f0a79SzhanglyGit
190d91483a6Sfdy  //uop div up to maxUopSize
191d91483a6Sfdy  val csBundle = Wire(Vec(maxUopSize, new DecodedInst))
1928e59a3a7SXuan Hu  val fixedDecodedInst = Wire(Vec(maxUopSize, new DecodedInst))
1938e59a3a7SXuan Hu
194e25c13faSXuan Hu  csBundle.foreach { case dst =>
195e25c13faSXuan Hu    dst := latchedInst
196e25c13faSXuan Hu    dst.numUops := latchedUopInfo.numOfUop
197e25c13faSXuan Hu    dst.numWB := latchedUopInfo.numOfWB
1989fabe323SZiyue Zhang    dst.exceptionVec(ExceptionNO.EX_II) := latchedInst.exceptionVec(ExceptionNO.EX_II) || illegalInst
199d91483a6Sfdy    dst.firstUop := false.B
200d91483a6Sfdy    dst.lastUop := false.B
20131c51290Szhanglinjuan    dst.vlsInstr := false.B
202d91483a6Sfdy  }
203d91483a6Sfdy
204d91483a6Sfdy  csBundle(0).firstUop := true.B
205d91483a6Sfdy  csBundle(numOfUop - 1.U).lastUop := true.B
206d91483a6Sfdy
2075110577fSZiyue Zhang  // when vstart is not zero, the last uop will modify vstart to zero
2085110577fSZiyue Zhang  // therefore, blockback and flush pipe
2095110577fSZiyue Zhang  csBundle(numOfUop - 1.U).blockBackward := vstartReg =/= 0.U
21093df46dcSZiyue Zhang  csBundle(0.U).flushPipe := vstartReg =/= 0.U
2115110577fSZiyue Zhang
212189ec863SzhanglyGit  switch(typeOfSplit) {
21312861ac7Slinzhida    is(UopSplitType.AMO_CAS_W) {
21412861ac7Slinzhida      csBundle(0).uopIdx := 0.U
2152c6839d1SNewPaulWalker      csBundle(0).fuOpType := Cat(1.U(3.W), LSUOpType.amocas_w)
216*d33dbc9eSNewPaulWalker      csBundle(0).lsrc(0) := 0.U
2172c6839d1SNewPaulWalker      csBundle(0).lsrc(1) := src2
2182c6839d1SNewPaulWalker      csBundle(0).rfWen := false.B
21912861ac7Slinzhida      csBundle(0).waitForward := true.B
22012861ac7Slinzhida      csBundle(0).blockBackward := false.B
22112861ac7Slinzhida
22212861ac7Slinzhida      csBundle(1).uopIdx := 1.U
2232c6839d1SNewPaulWalker      csBundle(1).fuOpType := Cat(0.U(3.W), LSUOpType.amocas_w)
22412861ac7Slinzhida      csBundle(1).lsrc(0) := src1
2252c6839d1SNewPaulWalker      csBundle(1).lsrc(1) := dest
22612861ac7Slinzhida      csBundle(1).waitForward := false.B
22712861ac7Slinzhida      csBundle(1).blockBackward := true.B
22812861ac7Slinzhida    }
22912861ac7Slinzhida    is(UopSplitType.AMO_CAS_D) {
23012861ac7Slinzhida      csBundle(0).uopIdx := 0.U
2312c6839d1SNewPaulWalker      csBundle(0).fuOpType := Cat(1.U(3.W), LSUOpType.amocas_d)
232*d33dbc9eSNewPaulWalker      csBundle(0).lsrc(0) := 0.U
2332c6839d1SNewPaulWalker      csBundle(0).lsrc(1) := src2
2342c6839d1SNewPaulWalker      csBundle(0).rfWen := false.B
23512861ac7Slinzhida      csBundle(0).waitForward := true.B
23612861ac7Slinzhida      csBundle(0).blockBackward := false.B
23712861ac7Slinzhida
23812861ac7Slinzhida      csBundle(1).uopIdx := 1.U
2392c6839d1SNewPaulWalker      csBundle(1).fuOpType := Cat(0.U(3.W), LSUOpType.amocas_d)
24012861ac7Slinzhida      csBundle(1).lsrc(0) := src1
2412c6839d1SNewPaulWalker      csBundle(1).lsrc(1) := dest
24212861ac7Slinzhida      csBundle(1).waitForward := false.B
24312861ac7Slinzhida      csBundle(1).blockBackward := true.B
24412861ac7Slinzhida    }
24512861ac7Slinzhida    is(UopSplitType.AMO_CAS_Q) {
24612861ac7Slinzhida      csBundle(0).uopIdx := 0.U
2472c6839d1SNewPaulWalker      csBundle(0).fuOpType := Cat(1.U(3.W), LSUOpType.amocas_q)
248*d33dbc9eSNewPaulWalker      csBundle(0).lsrc(0) := 0.U
2492c6839d1SNewPaulWalker      csBundle(0).lsrc(1) := src2
2502c6839d1SNewPaulWalker      csBundle(0).rfWen := false.B
25112861ac7Slinzhida      csBundle(0).waitForward := true.B
25212861ac7Slinzhida      csBundle(0).blockBackward := false.B
25312861ac7Slinzhida
25412861ac7Slinzhida      csBundle(1).uopIdx := 1.U
2552c6839d1SNewPaulWalker      csBundle(1).fuOpType := Cat(0.U(3.W), LSUOpType.amocas_q)
25612861ac7Slinzhida      csBundle(1).lsrc(0) := src1
2572c6839d1SNewPaulWalker      csBundle(1).lsrc(1) := dest
25812861ac7Slinzhida      csBundle(1).waitForward := false.B
25912861ac7Slinzhida      csBundle(1).blockBackward := false.B
26012861ac7Slinzhida
26112861ac7Slinzhida      csBundle(2).uopIdx := 2.U
2622c6839d1SNewPaulWalker      csBundle(2).fuOpType := Cat(3.U(3.W), LSUOpType.amocas_q)
263*d33dbc9eSNewPaulWalker      csBundle(2).lsrc(0) := 0.U
2642c6839d1SNewPaulWalker      csBundle(2).lsrc(1) := Mux(src2 === 0.U, 0.U, src2 + 1.U)
2652c6839d1SNewPaulWalker      csBundle(2).rfWen := false.B
26612861ac7Slinzhida      csBundle(2).waitForward := false.B
26712861ac7Slinzhida      csBundle(2).blockBackward := false.B
26812861ac7Slinzhida
26912861ac7Slinzhida      csBundle(3).uopIdx := 3.U
2702c6839d1SNewPaulWalker      csBundle(3).fuOpType := Cat(2.U(3.W), LSUOpType.amocas_q)
271*d33dbc9eSNewPaulWalker      csBundle(3).lsrc(0) := 0.U
2722c6839d1SNewPaulWalker      csBundle(3).lsrc(1) := Mux(dest === 0.U, 0.U, dest + 1.U)
2732c6839d1SNewPaulWalker      csBundle(3).ldest := Mux(dest === 0.U, 0.U, dest + 1.U)
27412861ac7Slinzhida      csBundle(3).waitForward := false.B
27512861ac7Slinzhida      csBundle(3).blockBackward := true.B
27612861ac7Slinzhida    }
277e25c13faSXuan Hu    is(UopSplitType.VSET) {
2784cdab2a9SXuan Hu      // In simple decoder, rfWen and vecWen are not set
279189ec863SzhanglyGit      when(isVsetSimple) {
2804cdab2a9SXuan Hu        // Default
2814cdab2a9SXuan Hu        // uop0 set rd, never flushPipe
282d91483a6Sfdy        csBundle(0).fuType := FuType.vsetiwi.U
28393df46dcSZiyue Zhang        csBundle(0).flushPipe := Mux(VSETOpType.isVsetvl(latchedInst.fuOpType), true.B, vstartReg =/= 0.U)
2841436b764SZiyue Zhang        csBundle(0).blockBackward := false.B
285d91483a6Sfdy        csBundle(0).rfWen := true.B
2864cdab2a9SXuan Hu        // uop1 set vl, vsetvl will flushPipe
287430c2c95Sxiaofeibao        csBundle(1).ldest := Vl_IDX.U
288e4e68f86Sxiaofeibao        csBundle(1).vecWen := false.B
289e4e68f86Sxiaofeibao        csBundle(1).vlWen := true.B
29093df46dcSZiyue Zhang        csBundle(1).flushPipe := false.B
29193df46dcSZiyue Zhang        csBundle(1).blockBackward := Mux(VSETOpType.isVsetvl(latchedInst.fuOpType), true.B, vstartReg =/= 0.U)
2924cdab2a9SXuan Hu        when(VSETOpType.isVsetvli(latchedInst.fuOpType) && dest === 0.U && src1 === 0.U) {
293d8ceb649SZiyue Zhang          // write nothing, uop0 is a nop instruction
294d8ceb649SZiyue Zhang          csBundle(0).rfWen := false.B
295d8ceb649SZiyue Zhang          csBundle(0).fpWen := false.B
296d8ceb649SZiyue Zhang          csBundle(0).vecWen := false.B
297e4e68f86Sxiaofeibao          csBundle(0).vlWen := false.B
2984cdab2a9SXuan Hu          csBundle(1).fuType := FuType.vsetfwf.U
299b37ee2eeSZiyue-Zhang          csBundle(1).srcType(0) := SrcType.no
300b37ee2eeSZiyue-Zhang          csBundle(1).srcType(2) := SrcType.no
301b37ee2eeSZiyue-Zhang          csBundle(1).srcType(3) := SrcType.no
302b37ee2eeSZiyue-Zhang          csBundle(1).srcType(4) := SrcType.vp
303b37ee2eeSZiyue-Zhang          csBundle(1).lsrc(4) := Vl_IDX.U
3044cdab2a9SXuan Hu        }.elsewhen(VSETOpType.isVsetvl(latchedInst.fuOpType) && dest === 0.U && src1 === 0.U) {
3054cdab2a9SXuan Hu          // uop0: mv vtype gpr to vector region
3064cdab2a9SXuan Hu          csBundle(0).srcType(0) := SrcType.xp
3074cdab2a9SXuan Hu          csBundle(0).srcType(1) := SrcType.no
3080f423558SZiyue-Zhang          csBundle(0).lsrc(0) := src2
309d91483a6Sfdy          csBundle(0).lsrc(1) := 0.U
310c8cff56fSsinsanction          csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
311964d9a87SZiyue Zhang          csBundle(0).fuType := FuType.i2v.U
312964d9a87SZiyue Zhang          csBundle(0).fuOpType := Cat(IF2VectorType.i2Vec(2, 0), e64)
313964d9a87SZiyue Zhang          csBundle(0).rfWen := false.B
314c8cff56fSsinsanction          csBundle(0).fpWen := false.B
315c8cff56fSsinsanction          csBundle(0).vecWen := true.B
316e4e68f86Sxiaofeibao          csBundle(0).vlWen := false.B
3174cdab2a9SXuan Hu          // uop1: uvsetvcfg_vv
318d91483a6Sfdy          csBundle(1).fuType := FuType.vsetfwf.U
3194cdab2a9SXuan Hu          // vl
320b37ee2eeSZiyue-Zhang          csBundle(1).srcType(0) := SrcType.no
321b37ee2eeSZiyue-Zhang          csBundle(1).srcType(2) := SrcType.no
322b37ee2eeSZiyue-Zhang          csBundle(1).srcType(3) := SrcType.no
323b37ee2eeSZiyue-Zhang          csBundle(1).srcType(4) := SrcType.vp
324b37ee2eeSZiyue-Zhang          csBundle(1).lsrc(4) := Vl_IDX.U
3254cdab2a9SXuan Hu          // vtype
326c8cff56fSsinsanction          csBundle(1).srcType(1) := SrcType.vp
327c8cff56fSsinsanction          csBundle(1).lsrc(1) := VECTOR_TMP_REG_LMUL.U
328e4e68f86Sxiaofeibao          csBundle(1).vecWen := false.B
329e4e68f86Sxiaofeibao          csBundle(1).vlWen := true.B
330430c2c95Sxiaofeibao          csBundle(1).ldest := Vl_IDX.U
33117d9db4eSZiyue Zhang        }.elsewhen(dest === 0.U) {
33217d9db4eSZiyue Zhang          // write nothing, uop0 is a nop instruction
33317d9db4eSZiyue Zhang          csBundle(0).rfWen := false.B
33417d9db4eSZiyue Zhang          csBundle(0).fpWen := false.B
33517d9db4eSZiyue Zhang          csBundle(0).vecWen := false.B
336e4e68f86Sxiaofeibao          csBundle(0).vlWen := false.B
337e03e0c5bSZiyue Zhang        }.elsewhen(VSETOpType.isVsetvl(latchedInst.fuOpType)) {
338e03e0c5bSZiyue Zhang          // because vsetvl may modified src2 when src2 == rd,
339e03e0c5bSZiyue Zhang          // we need to modify vd in second uop to avoid dependency
340e03e0c5bSZiyue Zhang          // uop0 set vl
341e03e0c5bSZiyue Zhang          csBundle(0).fuType := FuType.vsetiwf.U
342e03e0c5bSZiyue Zhang          csBundle(0).ldest := Vl_IDX.U
343e03e0c5bSZiyue Zhang          csBundle(0).rfWen := false.B
344e03e0c5bSZiyue Zhang          csBundle(0).vlWen := true.B
345e03e0c5bSZiyue Zhang          // uop1 set rd
346e03e0c5bSZiyue Zhang          csBundle(1).fuType := FuType.vsetiwi.U
347e03e0c5bSZiyue Zhang          csBundle(1).ldest := dest
348e03e0c5bSZiyue Zhang          csBundle(1).rfWen := true.B
349e03e0c5bSZiyue Zhang          csBundle(1).vlWen := false.B
350d91483a6Sfdy        }
35196a12457Ssinsanction        // use bypass vtype from vtypeGen
35296a12457Ssinsanction        csBundle(0).vpu.connectVType(io.vtypeBypass)
35396a12457Ssinsanction        csBundle(1).vpu.connectVType(io.vtypeBypass)
354d91483a6Sfdy      }
355d91483a6Sfdy    }
35617ec87f2SXuan Hu    is(UopSplitType.VEC_VVV) {
357d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
358d91483a6Sfdy        csBundle(i).lsrc(0) := src1 + i.U
359d91483a6Sfdy        csBundle(i).lsrc(1) := src2 + i.U
360d91483a6Sfdy        csBundle(i).lsrc(2) := dest + i.U
361d91483a6Sfdy        csBundle(i).ldest := dest + i.U
362d91483a6Sfdy        csBundle(i).uopIdx := i.U
363d91483a6Sfdy      }
364d91483a6Sfdy    }
365684d7aceSxiaofeibao-xjtu    is(UopSplitType.VEC_VFV) {
366395c8649SZiyue-Zhang      /*
367b50f8edeSsinsanction      f to vector move
368395c8649SZiyue-Zhang       */
369395c8649SZiyue-Zhang      csBundle(0).srcType(0) := SrcType.fp
370395c8649SZiyue-Zhang      csBundle(0).srcType(1) := SrcType.imm
371b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
372395c8649SZiyue-Zhang      csBundle(0).lsrc(1) := 0.U
373395c8649SZiyue-Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
374395c8649SZiyue-Zhang      csBundle(0).fuType := FuType.f2v.U
375395c8649SZiyue-Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.fDup2Vec(2, 0), vsewReg)
376395c8649SZiyue-Zhang      csBundle(0).vecWen := true.B
377783a1d5fSlewislzh      csBundle(0).vpu.isReverse := false.B
378395c8649SZiyue-Zhang      /*
379395c8649SZiyue-Zhang      LMUL
380395c8649SZiyue-Zhang       */
381684d7aceSxiaofeibao-xjtu      for (i <- 0 until MAX_VLMUL) {
382395c8649SZiyue-Zhang        csBundle(i + 1).srcType(0) := SrcType.vp
383395c8649SZiyue-Zhang        csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
384395c8649SZiyue-Zhang        csBundle(i + 1).lsrc(1) := src2 + i.U
385395c8649SZiyue-Zhang        csBundle(i + 1).lsrc(2) := dest + i.U
386395c8649SZiyue-Zhang        csBundle(i + 1).ldest := dest + i.U
387395c8649SZiyue-Zhang        csBundle(i + 1).uopIdx := i.U
388684d7aceSxiaofeibao-xjtu      }
389684d7aceSxiaofeibao-xjtu    }
39017ec87f2SXuan Hu    is(UopSplitType.VEC_EXT2) {
391d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
392d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + i.U
393d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
394d91483a6Sfdy        csBundle(2 * i).ldest := dest + (2 * i).U
395d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
396d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
397d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
398d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
399d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
400d91483a6Sfdy      }
401d91483a6Sfdy    }
40217ec87f2SXuan Hu    is(UopSplitType.VEC_EXT4) {
403d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 4) {
404d91483a6Sfdy        csBundle(4 * i).lsrc(1) := src2 + i.U
405d91483a6Sfdy        csBundle(4 * i).lsrc(2) := dest + (4 * i).U
406d91483a6Sfdy        csBundle(4 * i).ldest := dest + (4 * i).U
407d91483a6Sfdy        csBundle(4 * i).uopIdx := (4 * i).U
408d91483a6Sfdy        csBundle(4 * i + 1).lsrc(1) := src2 + i.U
409d91483a6Sfdy        csBundle(4 * i + 1).lsrc(2) := dest + (4 * i + 1).U
410d91483a6Sfdy        csBundle(4 * i + 1).ldest := dest + (4 * i + 1).U
411d91483a6Sfdy        csBundle(4 * i + 1).uopIdx := (4 * i + 1).U
412d91483a6Sfdy        csBundle(4 * i + 2).lsrc(1) := src2 + i.U
413d91483a6Sfdy        csBundle(4 * i + 2).lsrc(2) := dest + (4 * i + 2).U
414d91483a6Sfdy        csBundle(4 * i + 2).ldest := dest + (4 * i + 2).U
415d91483a6Sfdy        csBundle(4 * i + 2).uopIdx := (4 * i + 2).U
416d91483a6Sfdy        csBundle(4 * i + 3).lsrc(1) := src2 + i.U
417d91483a6Sfdy        csBundle(4 * i + 3).lsrc(2) := dest + (4 * i + 3).U
418d91483a6Sfdy        csBundle(4 * i + 3).ldest := dest + (4 * i + 3).U
419d91483a6Sfdy        csBundle(4 * i + 3).uopIdx := (4 * i + 3).U
420d91483a6Sfdy      }
421d91483a6Sfdy    }
42217ec87f2SXuan Hu    is(UopSplitType.VEC_EXT8) {
423d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
424d91483a6Sfdy        csBundle(i).lsrc(1) := src2
425d91483a6Sfdy        csBundle(i).lsrc(2) := dest + i.U
426d91483a6Sfdy        csBundle(i).ldest := dest + i.U
427d91483a6Sfdy        csBundle(i).uopIdx := i.U
428d91483a6Sfdy      }
429d91483a6Sfdy    }
43017ec87f2SXuan Hu    is(UopSplitType.VEC_0XV) {
431d91483a6Sfdy      /*
432395c8649SZiyue-Zhang      i/f to vector move
433d91483a6Sfdy       */
434395c8649SZiyue-Zhang      csBundle(0).srcType(0) := Mux(src1IsFp, SrcType.fp, SrcType.reg)
435d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
436b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
437d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
4387c67deccSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
439395c8649SZiyue-Zhang      csBundle(0).fuType := Mux(src1IsFp, FuType.f2v.U, FuType.i2v.U)
440395c8649SZiyue-Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsFp, IF2VectorType.fDup2Vec(2, 0), IF2VectorType.i2Vec(2, 0)), vsewReg)
441d91483a6Sfdy      csBundle(0).rfWen := false.B
4427c67deccSZiyue Zhang      csBundle(0).fpWen := false.B
4437c67deccSZiyue Zhang      csBundle(0).vecWen := true.B
444d91483a6Sfdy      /*
4457c67deccSZiyue Zhang      vmv.s.x
446d91483a6Sfdy       */
4477c67deccSZiyue Zhang      csBundle(1).srcType(0) := SrcType.vp
4487c67deccSZiyue Zhang      csBundle(1).srcType(1) := SrcType.imm
449d91483a6Sfdy      csBundle(1).srcType(2) := SrcType.vp
4507c67deccSZiyue Zhang      csBundle(1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
451d91483a6Sfdy      csBundle(1).lsrc(1) := 0.U
452d91483a6Sfdy      csBundle(1).lsrc(2) := dest
453d91483a6Sfdy      csBundle(1).ldest := dest
454d91483a6Sfdy      csBundle(1).rfWen := false.B
455d91483a6Sfdy      csBundle(1).fpWen := false.B
456d91483a6Sfdy      csBundle(1).vecWen := true.B
4577c67deccSZiyue Zhang      csBundle(1).uopIdx := 0.U
458d91483a6Sfdy    }
45917ec87f2SXuan Hu    is(UopSplitType.VEC_VXV) {
460d91483a6Sfdy      /*
461d6059658SZiyue Zhang      i to vector move
462d91483a6Sfdy       */
463e03e0c5bSZiyue Zhang      csBundle(0).srcType(0) := Mux(src1IsImm, SrcType.imm, SrcType.reg)
464d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
465b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
466d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
467fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
468fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
469b1712600SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.immDup2Vec(2, 0), IF2VectorType.iDup2Vec(2, 0)), vsewReg)
470fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
471783a1d5fSlewislzh      csBundle(0).vpu.isReverse := false.B
472fc85f18fSZiyue Zhang      /*
473fc85f18fSZiyue Zhang      LMUL
474fc85f18fSZiyue Zhang       */
475fc85f18fSZiyue Zhang      for (i <- 0 until MAX_VLMUL) {
476fc85f18fSZiyue Zhang        csBundle(i + 1).srcType(0) := SrcType.vp
477fc85f18fSZiyue Zhang        csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
478d91483a6Sfdy        csBundle(i + 1).lsrc(1) := src2 + i.U
479d91483a6Sfdy        csBundle(i + 1).lsrc(2) := dest + i.U
480d91483a6Sfdy        csBundle(i + 1).ldest := dest + i.U
481d91483a6Sfdy        csBundle(i + 1).uopIdx := i.U
482d91483a6Sfdy      }
483d91483a6Sfdy    }
48417ec87f2SXuan Hu    is(UopSplitType.VEC_VVW) {
485d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
486d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src1 + i.U
487d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + i.U
488d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
489d91483a6Sfdy        csBundle(2 * i).ldest := dest + (2 * i).U
490d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
491d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1 + i.U
492d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
493d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
494d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
495d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
496d91483a6Sfdy      }
497d91483a6Sfdy    }
4983748ec56Sxiaofeibao-xjtu    is(UopSplitType.VEC_VFW) {
499395c8649SZiyue-Zhang      /*
500395c8649SZiyue-Zhang      f to vector move
501395c8649SZiyue-Zhang       */
502395c8649SZiyue-Zhang      csBundle(0).srcType(0) := SrcType.fp
503395c8649SZiyue-Zhang      csBundle(0).srcType(1) := SrcType.imm
504b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
505395c8649SZiyue-Zhang      csBundle(0).lsrc(1) := 0.U
506395c8649SZiyue-Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
507395c8649SZiyue-Zhang      csBundle(0).fuType := FuType.f2v.U
508395c8649SZiyue-Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.fDup2Vec(2, 0), vsewReg)
509395c8649SZiyue-Zhang      csBundle(0).rfWen := false.B
510395c8649SZiyue-Zhang      csBundle(0).fpWen := false.B
511395c8649SZiyue-Zhang      csBundle(0).vecWen := true.B
512395c8649SZiyue-Zhang
5133748ec56Sxiaofeibao-xjtu      for (i <- 0 until MAX_VLMUL / 2) {
514395c8649SZiyue-Zhang        csBundle(2 * i + 1).srcType(0) := SrcType.vp
515395c8649SZiyue-Zhang        csBundle(2 * i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
5163748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
517395c8649SZiyue-Zhang        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U
518395c8649SZiyue-Zhang        csBundle(2 * i + 1).ldest := dest + (2 * i).U
519395c8649SZiyue-Zhang        csBundle(2 * i + 1).uopIdx := (2 * i).U
520395c8649SZiyue-Zhang        csBundle(2 * i + 2).srcType(0) := SrcType.vp
521395c8649SZiyue-Zhang        csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
522395c8649SZiyue-Zhang        csBundle(2 * i + 2).lsrc(1) := src2 + i.U
523395c8649SZiyue-Zhang        csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U
524395c8649SZiyue-Zhang        csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U
525395c8649SZiyue-Zhang        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
5263748ec56Sxiaofeibao-xjtu      }
5273748ec56Sxiaofeibao-xjtu    }
52817ec87f2SXuan Hu    is(UopSplitType.VEC_WVW) {
529d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
530d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src1 + i.U
531d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + (2 * i).U
532d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
533d91483a6Sfdy        csBundle(2 * i).ldest := dest + (2 * i).U
534d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
535d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1 + i.U
536d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U
537d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
538d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
539d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
540d91483a6Sfdy      }
541d91483a6Sfdy    }
54217ec87f2SXuan Hu    is(UopSplitType.VEC_VXW) {
543d91483a6Sfdy      /*
544d6059658SZiyue Zhang      i to vector move
545d91483a6Sfdy       */
5464c8a449fSZiyue Zhang      csBundle(0).srcType(0) := Mux(src1IsImm, SrcType.imm, SrcType.reg)
547d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
548b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
549d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
550fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
551fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
5524c8a449fSZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.immDup2Vec(2, 0), IF2VectorType.iDup2Vec(2, 0)), vsewReg)
553fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
554d91483a6Sfdy
555d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
556fc85f18fSZiyue Zhang        csBundle(2 * i + 1).srcType(0) := SrcType.vp
557fc85f18fSZiyue Zhang        csBundle(2 * i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
558d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
559d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U
560d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i).U
561d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
562fc85f18fSZiyue Zhang        csBundle(2 * i + 2).srcType(0) := SrcType.vp
563fc85f18fSZiyue Zhang        csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
564d91483a6Sfdy        csBundle(2 * i + 2).lsrc(1) := src2 + i.U
565d91483a6Sfdy        csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U
566d91483a6Sfdy        csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U
567d91483a6Sfdy        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
568d91483a6Sfdy      }
569d91483a6Sfdy    }
57017ec87f2SXuan Hu    is(UopSplitType.VEC_WXW) {
571d91483a6Sfdy      /*
572d6059658SZiyue Zhang      i to vector move
573d91483a6Sfdy       */
574d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
575d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
576b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
577d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
578fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
579fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
580b1712600SZiyue Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.iDup2Vec(2, 0), vsewReg)
581fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
582d91483a6Sfdy
583d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
584fc85f18fSZiyue Zhang        csBundle(2 * i + 1).srcType(0) := SrcType.vp
585fc85f18fSZiyue Zhang        csBundle(2 * i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
586d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U
587d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U
588d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i).U
589d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
590fc85f18fSZiyue Zhang        csBundle(2 * i + 2).srcType(0) := SrcType.vp
591fc85f18fSZiyue Zhang        csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
592d91483a6Sfdy        csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U
593d91483a6Sfdy        csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U
594d91483a6Sfdy        csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U
595d91483a6Sfdy        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
596d91483a6Sfdy      }
597d91483a6Sfdy    }
59817ec87f2SXuan Hu    is(UopSplitType.VEC_WVV) {
599d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
600d91483a6Sfdy
601d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src1 + i.U
602d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + (2 * i).U
603d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + i.U
604d6f9198fSXuan Hu        csBundle(2 * i).ldest := dest + i.U
605d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
606d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1 + i.U
607d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U
608d6f9198fSXuan Hu        csBundle(2 * i + 1).lsrc(2) := dest + i.U
609d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + i.U
610d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
611d91483a6Sfdy      }
612d91483a6Sfdy    }
6133748ec56Sxiaofeibao-xjtu    is(UopSplitType.VEC_WFW) {
614395c8649SZiyue-Zhang      /*
615395c8649SZiyue-Zhang      f to vector move
616395c8649SZiyue-Zhang       */
617395c8649SZiyue-Zhang      csBundle(0).srcType(0) := SrcType.fp
618395c8649SZiyue-Zhang      csBundle(0).srcType(1) := SrcType.imm
619b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
620395c8649SZiyue-Zhang      csBundle(0).lsrc(1) := 0.U
621395c8649SZiyue-Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
622395c8649SZiyue-Zhang      csBundle(0).fuType := FuType.f2v.U
623395c8649SZiyue-Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.fDup2Vec(2, 0), vsewReg)
624395c8649SZiyue-Zhang      csBundle(0).rfWen := false.B
625395c8649SZiyue-Zhang      csBundle(0).fpWen := false.B
626395c8649SZiyue-Zhang      csBundle(0).vecWen := true.B
627395c8649SZiyue-Zhang
6283748ec56Sxiaofeibao-xjtu      for (i <- 0 until MAX_VLMUL / 2) {
629395c8649SZiyue-Zhang        csBundle(2 * i + 1).srcType(0) := SrcType.vp
630395c8649SZiyue-Zhang        csBundle(2 * i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
631395c8649SZiyue-Zhang        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U
632395c8649SZiyue-Zhang        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U
633395c8649SZiyue-Zhang        csBundle(2 * i + 1).ldest := dest + (2 * i).U
634395c8649SZiyue-Zhang        csBundle(2 * i + 1).uopIdx := (2 * i).U
635395c8649SZiyue-Zhang        csBundle(2 * i + 2).srcType(0) := SrcType.vp
636395c8649SZiyue-Zhang        csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
637395c8649SZiyue-Zhang        csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U
638395c8649SZiyue-Zhang        csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U
639395c8649SZiyue-Zhang        csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U
640395c8649SZiyue-Zhang        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
6413748ec56Sxiaofeibao-xjtu      }
6423748ec56Sxiaofeibao-xjtu    }
64317ec87f2SXuan Hu    is(UopSplitType.VEC_WXV) {
644d91483a6Sfdy      /*
645d6059658SZiyue Zhang      i to vector move
646d91483a6Sfdy       */
647e03e0c5bSZiyue Zhang      csBundle(0).srcType(0) := Mux(src1IsImm, SrcType.imm, SrcType.reg)
648d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
649b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
650d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
651fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
652fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
653b1712600SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.immDup2Vec(2, 0), IF2VectorType.iDup2Vec(2, 0)), vsewReg)
654fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
655d91483a6Sfdy
656d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
657fc85f18fSZiyue Zhang        csBundle(2 * i + 1).srcType(0) := SrcType.vp
658fc85f18fSZiyue Zhang        csBundle(2 * i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
659d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U
660d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + i.U
661d6f9198fSXuan Hu        csBundle(2 * i + 1).ldest := dest + i.U
662d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
663fc85f18fSZiyue Zhang        csBundle(2 * i + 2).srcType(0) := SrcType.vp
664fc85f18fSZiyue Zhang        csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
665d91483a6Sfdy        csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U
666d6f9198fSXuan Hu        csBundle(2 * i + 2).lsrc(2) := dest + i.U
667d91483a6Sfdy        csBundle(2 * i + 2).ldest := dest + i.U
668d91483a6Sfdy        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
669d91483a6Sfdy      }
670d91483a6Sfdy    }
67117ec87f2SXuan Hu    is(UopSplitType.VEC_VVM) {
672d91483a6Sfdy      csBundle(0).lsrc(2) := dest
673d6f9198fSXuan Hu      csBundle(0).ldest := dest
674d91483a6Sfdy      csBundle(0).uopIdx := 0.U
675d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
676d91483a6Sfdy        csBundle(i).lsrc(0) := src1 + i.U
677d91483a6Sfdy        csBundle(i).lsrc(1) := src2 + i.U
678d6f9198fSXuan Hu        csBundle(i).lsrc(2) := dest
679d6f9198fSXuan Hu        csBundle(i).ldest := dest
680d91483a6Sfdy        csBundle(i).uopIdx := i.U
681d91483a6Sfdy      }
682d91483a6Sfdy    }
683f06d6d60Sxiaofeibao-xjtu    is(UopSplitType.VEC_VFM) {
684395c8649SZiyue-Zhang      /*
685395c8649SZiyue-Zhang      f to vector move
686395c8649SZiyue-Zhang       */
687395c8649SZiyue-Zhang      csBundle(0).srcType(0) := SrcType.fp
688395c8649SZiyue-Zhang      csBundle(0).srcType(1) := SrcType.imm
689b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
690395c8649SZiyue-Zhang      csBundle(0).lsrc(1) := 0.U
691395c8649SZiyue-Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
692395c8649SZiyue-Zhang      csBundle(0).fuType := FuType.f2v.U
693395c8649SZiyue-Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.fDup2Vec(2, 0), vsewReg)
694395c8649SZiyue-Zhang      csBundle(0).rfWen := false.B
695395c8649SZiyue-Zhang      csBundle(0).fpWen := false.B
696395c8649SZiyue-Zhang      csBundle(0).vecWen := true.B
697395c8649SZiyue-Zhang      //LMUL
698395c8649SZiyue-Zhang      csBundle(1).srcType(0) := SrcType.vp
699395c8649SZiyue-Zhang      csBundle(1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
700395c8649SZiyue-Zhang      csBundle(1).lsrc(2) := dest
701395c8649SZiyue-Zhang      csBundle(1).ldest := dest
702395c8649SZiyue-Zhang      csBundle(1).uopIdx := 0.U
703f06d6d60Sxiaofeibao-xjtu      for (i <- 1 until MAX_VLMUL) {
704395c8649SZiyue-Zhang        csBundle(i + 1).srcType(0) := SrcType.vp
705395c8649SZiyue-Zhang        csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
706395c8649SZiyue-Zhang        csBundle(i + 1).lsrc(1) := src2 + i.U
707395c8649SZiyue-Zhang        csBundle(i + 1).lsrc(2) := dest
708395c8649SZiyue-Zhang        csBundle(i + 1).ldest := dest
709395c8649SZiyue-Zhang        csBundle(i + 1).uopIdx := i.U
710f06d6d60Sxiaofeibao-xjtu      }
711f06d6d60Sxiaofeibao-xjtu      csBundle(numOfUop - 1.U).ldest := dest
712f06d6d60Sxiaofeibao-xjtu    }
71317ec87f2SXuan Hu    is(UopSplitType.VEC_VXM) {
714d91483a6Sfdy      /*
715d6059658SZiyue Zhang      i to vector move
716d91483a6Sfdy       */
717e03e0c5bSZiyue Zhang      csBundle(0).srcType(0) := Mux(src1IsImm, SrcType.imm, SrcType.reg)
718d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
719b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
720d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
721fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
722fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
723b1712600SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.immDup2Vec(2, 0), IF2VectorType.iDup2Vec(2, 0)), vsewReg)
724fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
725d91483a6Sfdy      //LMUL
726fc85f18fSZiyue Zhang      csBundle(1).srcType(0) := SrcType.vp
727fc85f18fSZiyue Zhang      csBundle(1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
728d91483a6Sfdy      csBundle(1).lsrc(2) := dest
729d6f9198fSXuan Hu      csBundle(1).ldest := dest
730d91483a6Sfdy      csBundle(1).uopIdx := 0.U
731d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
732fc85f18fSZiyue Zhang        csBundle(i + 1).srcType(0) := SrcType.vp
733fc85f18fSZiyue Zhang        csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
734d91483a6Sfdy        csBundle(i + 1).lsrc(1) := src2 + i.U
735d6f9198fSXuan Hu        csBundle(i + 1).lsrc(2) := dest
736d6f9198fSXuan Hu        csBundle(i + 1).ldest := dest
737d91483a6Sfdy        csBundle(i + 1).uopIdx := i.U
738d91483a6Sfdy      }
739d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest
740d91483a6Sfdy    }
74117ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDE1UP) {
742d91483a6Sfdy      /*
743d6059658SZiyue Zhang      i to vector move
744d91483a6Sfdy       */
745d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
746d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
747b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
748d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
749fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
750fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
751b8505463SZiyue Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.iDup2Vec(2, 0), vsewReg)
752fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
753d91483a6Sfdy      //LMUL
754fc85f18fSZiyue Zhang      csBundle(1).srcType(0) := SrcType.vp
755fc85f18fSZiyue Zhang      csBundle(1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
756d91483a6Sfdy      csBundle(1).lsrc(2) := dest
757d91483a6Sfdy      csBundle(1).ldest := dest
758d91483a6Sfdy      csBundle(1).uopIdx := 0.U
759d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
760d91483a6Sfdy        csBundle(i + 1).srcType(0) := SrcType.vp
761d91483a6Sfdy        csBundle(i + 1).lsrc(0) := src2 + (i - 1).U
762d91483a6Sfdy        csBundle(i + 1).lsrc(1) := src2 + i.U
763d91483a6Sfdy        csBundle(i + 1).lsrc(2) := dest + i.U
764d91483a6Sfdy        csBundle(i + 1).ldest := dest + i.U
765d91483a6Sfdy        csBundle(i + 1).uopIdx := i.U
766d91483a6Sfdy      }
767d91483a6Sfdy    }
76817ec87f2SXuan Hu    is(UopSplitType.VEC_FSLIDE1UP) {
769395c8649SZiyue-Zhang      /*
770b50f8edeSsinsanction      f to vector move
771395c8649SZiyue-Zhang       */
772d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.fp
773395c8649SZiyue-Zhang      csBundle(0).srcType(1) := SrcType.imm
774b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
775395c8649SZiyue-Zhang      csBundle(0).lsrc(1) := 0.U
776395c8649SZiyue-Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
777395c8649SZiyue-Zhang      csBundle(0).fuType := FuType.f2v.U
778395c8649SZiyue-Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.fDup2Vec(2, 0), vsewReg)
779395c8649SZiyue-Zhang      csBundle(0).rfWen := false.B
780395c8649SZiyue-Zhang      csBundle(0).fpWen := false.B
781395c8649SZiyue-Zhang      csBundle(0).vecWen := true.B
782395c8649SZiyue-Zhang      //LMUL
783395c8649SZiyue-Zhang      csBundle(1).srcType(0) := SrcType.vp
784395c8649SZiyue-Zhang      csBundle(1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
785395c8649SZiyue-Zhang      csBundle(1).lsrc(1) := src2
786395c8649SZiyue-Zhang      csBundle(1).lsrc(2) := dest
787395c8649SZiyue-Zhang      csBundle(1).ldest := dest
788395c8649SZiyue-Zhang      csBundle(1).uopIdx := 0.U
789d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
790395c8649SZiyue-Zhang        csBundle(i + 1).srcType(0) := SrcType.vp
791395c8649SZiyue-Zhang        csBundle(i + 1).lsrc(0) := src2 + (i - 1).U
792395c8649SZiyue-Zhang        csBundle(i + 1).lsrc(1) := src2 + i.U
793395c8649SZiyue-Zhang        csBundle(i + 1).lsrc(2) := dest + i.U
794395c8649SZiyue-Zhang        csBundle(i + 1).ldest := dest + i.U
795395c8649SZiyue-Zhang        csBundle(i + 1).uopIdx := i.U
796d91483a6Sfdy      }
797d91483a6Sfdy    }
79817ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDE1DOWN) { // lmul+lmul = 16
799d91483a6Sfdy      /*
800d6059658SZiyue Zhang      i to vector move
801d91483a6Sfdy       */
802d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
803d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
804b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
805d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
806fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
807fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
808b8505463SZiyue Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.iDup2Vec(2, 0), vsewReg)
809fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
810d91483a6Sfdy      //LMUL
811d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
812d91483a6Sfdy        csBundle(2 * i + 1).srcType(0) := SrcType.vp
813d91483a6Sfdy        csBundle(2 * i + 1).srcType(1) := SrcType.vp
814d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src2 + (i + 1).U
815d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
816d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + i.U
817fc85f18fSZiyue Zhang        csBundle(2 * i + 1).ldest := VECTOR_TMP_REG_LMUL.U + 1.U
818d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
819d91483a6Sfdy        if (2 * i + 2 < MAX_VLMUL * 2) {
820fc85f18fSZiyue Zhang          csBundle(2 * i + 2).srcType(0) := SrcType.vp
821fc85f18fSZiyue Zhang          csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
822d91483a6Sfdy          // csBundle(2 * i + 2).lsrc(1) := src2 + i.U         // DontCare
823fc85f18fSZiyue Zhang          csBundle(2 * i + 2).lsrc(2) := VECTOR_TMP_REG_LMUL.U + 1.U
824d91483a6Sfdy          csBundle(2 * i + 2).ldest := dest + i.U
825d91483a6Sfdy          csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
826d91483a6Sfdy        }
827d91483a6Sfdy      }
8288cbcda9aSZiyue Zhang      csBundle(numOfUop - 1.U).srcType(0) := SrcType.vp
8298cbcda9aSZiyue Zhang      csBundle(numOfUop - 1.U).lsrc(0) := VECTOR_TMP_REG_LMUL.U
830d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U
831d91483a6Sfdy    }
83217ec87f2SXuan Hu    is(UopSplitType.VEC_FSLIDE1DOWN) {
833395c8649SZiyue-Zhang      /*
834b50f8edeSsinsanction      f to vector move
835395c8649SZiyue-Zhang       */
836395c8649SZiyue-Zhang      csBundle(0).srcType(0) := SrcType.fp
837395c8649SZiyue-Zhang      csBundle(0).srcType(1) := SrcType.imm
838b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
839395c8649SZiyue-Zhang      csBundle(0).lsrc(1) := 0.U
840395c8649SZiyue-Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
841395c8649SZiyue-Zhang      csBundle(0).fuType := FuType.f2v.U
842395c8649SZiyue-Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.fDup2Vec(2, 0), vsewReg)
843395c8649SZiyue-Zhang      csBundle(0).rfWen := false.B
844395c8649SZiyue-Zhang      csBundle(0).fpWen := false.B
845395c8649SZiyue-Zhang      csBundle(0).vecWen := true.B
846d91483a6Sfdy      //LMUL
847d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
848395c8649SZiyue-Zhang        csBundle(2 * i + 1).srcType(0) := SrcType.vp
849395c8649SZiyue-Zhang        csBundle(2 * i + 1).srcType(1) := SrcType.vp
850395c8649SZiyue-Zhang        csBundle(2 * i + 1).lsrc(0) := src2 + (i + 1).U
851395c8649SZiyue-Zhang        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
852395c8649SZiyue-Zhang        csBundle(2 * i + 1).lsrc(2) := dest + i.U
853395c8649SZiyue-Zhang        csBundle(2 * i + 1).ldest := VECTOR_TMP_REG_LMUL.U + 1.U
854395c8649SZiyue-Zhang        csBundle(2 * i + 1).uopIdx := (2 * i).U
855395c8649SZiyue-Zhang        if (2 * i + 2 < MAX_VLMUL * 2) {
856395c8649SZiyue-Zhang          csBundle(2 * i + 2).srcType(0) := SrcType.vp
857395c8649SZiyue-Zhang          csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
858395c8649SZiyue-Zhang          // csBundle(2 * i + 2).lsrc(1) := src2 + i.U         // DontCare
859395c8649SZiyue-Zhang          csBundle(2 * i + 2).lsrc(2) := VECTOR_TMP_REG_LMUL.U + 1.U
860395c8649SZiyue-Zhang          csBundle(2 * i + 2).ldest := dest + i.U
861395c8649SZiyue-Zhang          csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
862d91483a6Sfdy        }
863395c8649SZiyue-Zhang      }
864395c8649SZiyue-Zhang      csBundle(numOfUop - 1.U).srcType(0) := SrcType.vp
865395c8649SZiyue-Zhang      csBundle(numOfUop - 1.U).lsrc(0) := VECTOR_TMP_REG_LMUL.U
866d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U
867d91483a6Sfdy    }
86817ec87f2SXuan Hu    is(UopSplitType.VEC_VRED) {
869aaa08c5aSxiaofeibao-xjtu      when(vlmulReg === "b001".U) {
870d91483a6Sfdy        csBundle(0).srcType(2) := SrcType.DC
871d91483a6Sfdy        csBundle(0).lsrc(0) := src2 + 1.U
872d91483a6Sfdy        csBundle(0).lsrc(1) := src2
873d91483a6Sfdy        csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
874d91483a6Sfdy        csBundle(0).uopIdx := 0.U
875d91483a6Sfdy      }
876aaa08c5aSxiaofeibao-xjtu      when(vlmulReg === "b010".U) {
877d91483a6Sfdy        csBundle(0).srcType(2) := SrcType.DC
878d91483a6Sfdy        csBundle(0).lsrc(0) := src2 + 1.U
879d91483a6Sfdy        csBundle(0).lsrc(1) := src2
880d91483a6Sfdy        csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
881d91483a6Sfdy        csBundle(0).uopIdx := 0.U
882d91483a6Sfdy
883d91483a6Sfdy        csBundle(1).srcType(2) := SrcType.DC
884d91483a6Sfdy        csBundle(1).lsrc(0) := src2 + 3.U
885d91483a6Sfdy        csBundle(1).lsrc(1) := src2 + 2.U
886d91483a6Sfdy        csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
887d91483a6Sfdy        csBundle(1).uopIdx := 1.U
888d91483a6Sfdy
889d91483a6Sfdy        csBundle(2).srcType(2) := SrcType.DC
890d91483a6Sfdy        csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
891d91483a6Sfdy        csBundle(2).lsrc(1) := VECTOR_TMP_REG_LMUL.U
892d91483a6Sfdy        csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
893d91483a6Sfdy        csBundle(2).uopIdx := 2.U
894d91483a6Sfdy      }
895aaa08c5aSxiaofeibao-xjtu      when(vlmulReg === "b011".U) {
896d91483a6Sfdy        for (i <- 0 until MAX_VLMUL) {
897d91483a6Sfdy          if (i < MAX_VLMUL - MAX_VLMUL / 2) {
898d91483a6Sfdy            csBundle(i).lsrc(0) := src2 + (i * 2 + 1).U
899d91483a6Sfdy            csBundle(i).lsrc(1) := src2 + (i * 2).U
900d91483a6Sfdy            csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
901d91483a6Sfdy          } else if (i < MAX_VLMUL - MAX_VLMUL / 4) {
902d91483a6Sfdy            csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2 + 1).U
903d91483a6Sfdy            csBundle(i).lsrc(1) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2).U
904d91483a6Sfdy            csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
905d91483a6Sfdy          } else if (i < MAX_VLMUL - MAX_VLMUL / 8) {
906d91483a6Sfdy            csBundle(6).lsrc(0) := (VECTOR_TMP_REG_LMUL + 5).U
907d91483a6Sfdy            csBundle(6).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U
908d91483a6Sfdy            csBundle(6).ldest := (VECTOR_TMP_REG_LMUL + 6).U
909d91483a6Sfdy          }
910d91483a6Sfdy          csBundle(i).srcType(2) := SrcType.DC
911d91483a6Sfdy          csBundle(i).uopIdx := i.U
912d91483a6Sfdy        }
913d91483a6Sfdy      }
914caa15984SZiyue Zhang      when(vlmulReg(2) === 0.U && vlmulReg(1, 0).orR) {
915caa15984SZiyue Zhang        /*
916caa15984SZiyue Zhang         * 2 <= vlmul <= 8
917caa15984SZiyue Zhang         */
918d91483a6Sfdy        csBundle(numOfUop - 1.U).srcType(2) := SrcType.vp
919d91483a6Sfdy        csBundle(numOfUop - 1.U).lsrc(0) := src1
920d91483a6Sfdy        csBundle(numOfUop - 1.U).lsrc(1) := VECTOR_TMP_REG_LMUL.U + numOfUop - 2.U
921d91483a6Sfdy        csBundle(numOfUop - 1.U).lsrc(2) := dest
922d91483a6Sfdy        csBundle(numOfUop - 1.U).ldest := dest
923d91483a6Sfdy        csBundle(numOfUop - 1.U).uopIdx := numOfUop - 1.U
924d91483a6Sfdy      }
925d91483a6Sfdy    }
926582849ffSxiaofeibao-xjtu    is(UopSplitType.VEC_VFRED) {
927aaa08c5aSxiaofeibao-xjtu      val vlmul = vlmulReg
928aaa08c5aSxiaofeibao-xjtu      val vsew = vsewReg
929582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.m8){
930582849ffSxiaofeibao-xjtu        for (i <- 0 until 4) {
931582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(0) := src2 + (i * 2 + 1).U
932582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(1) := src2 + (i * 2).U
933582849ffSxiaofeibao-xjtu          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
934582849ffSxiaofeibao-xjtu          csBundle(i).uopIdx := i.U
935582849ffSxiaofeibao-xjtu        }
936582849ffSxiaofeibao-xjtu        for (i <- 4 until 6) {
937582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + (i - 4) * 2 + 1).U
938582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(1) := (VECTOR_TMP_REG_LMUL + (i - 4) * 2).U
939582849ffSxiaofeibao-xjtu          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
940582849ffSxiaofeibao-xjtu          csBundle(i).uopIdx := i.U
941582849ffSxiaofeibao-xjtu        }
942582849ffSxiaofeibao-xjtu        csBundle(6).lsrc(0) := (VECTOR_TMP_REG_LMUL + 5).U
943582849ffSxiaofeibao-xjtu        csBundle(6).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U
944582849ffSxiaofeibao-xjtu        csBundle(6).ldest := (VECTOR_TMP_REG_LMUL + 6).U
945582849ffSxiaofeibao-xjtu        csBundle(6).uopIdx := 6.U
946582849ffSxiaofeibao-xjtu        when(vsew === VSew.e64) {
947582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(0) := (VECTOR_TMP_REG_LMUL + 6).U
948582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(1) := (VECTOR_TMP_REG_LMUL + 6).U
949582849ffSxiaofeibao-xjtu          csBundle(7).ldest := (VECTOR_TMP_REG_LMUL + 7).U
950582849ffSxiaofeibao-xjtu          csBundle(7).vpu.fpu.isFoldTo1_2 := true.B
951582849ffSxiaofeibao-xjtu          csBundle(7).uopIdx := 7.U
952582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(0) := src1
953582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(1) := (VECTOR_TMP_REG_LMUL + 7).U
954582849ffSxiaofeibao-xjtu          csBundle(8).ldest := dest
955582849ffSxiaofeibao-xjtu          csBundle(8).uopIdx := 8.U
956582849ffSxiaofeibao-xjtu        }
957582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
958582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(0) := (VECTOR_TMP_REG_LMUL + 6).U
959582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(1) := (VECTOR_TMP_REG_LMUL + 6).U
960582849ffSxiaofeibao-xjtu          csBundle(7).ldest := (VECTOR_TMP_REG_LMUL + 7).U
961582849ffSxiaofeibao-xjtu          csBundle(7).vpu.fpu.isFoldTo1_2 := true.B
962582849ffSxiaofeibao-xjtu          csBundle(7).uopIdx := 7.U
963582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(0) := (VECTOR_TMP_REG_LMUL + 7).U
964582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(1) := (VECTOR_TMP_REG_LMUL + 7).U
965582849ffSxiaofeibao-xjtu          csBundle(8).ldest := (VECTOR_TMP_REG_LMUL + 8).U
966582849ffSxiaofeibao-xjtu          csBundle(8).vpu.fpu.isFoldTo1_4 := true.B
967582849ffSxiaofeibao-xjtu          csBundle(8).uopIdx := 8.U
968582849ffSxiaofeibao-xjtu          csBundle(9).lsrc(0) := src1
969582849ffSxiaofeibao-xjtu          csBundle(9).lsrc(1) := (VECTOR_TMP_REG_LMUL + 8).U
970582849ffSxiaofeibao-xjtu          csBundle(9).ldest := dest
971582849ffSxiaofeibao-xjtu          csBundle(9).uopIdx := 9.U
972582849ffSxiaofeibao-xjtu        }
973582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
974582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(0) := (VECTOR_TMP_REG_LMUL + 6).U
975582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(1) := (VECTOR_TMP_REG_LMUL + 6).U
976582849ffSxiaofeibao-xjtu          csBundle(7).ldest := (VECTOR_TMP_REG_LMUL + 7).U
977582849ffSxiaofeibao-xjtu          csBundle(7).vpu.fpu.isFoldTo1_2 := true.B
978582849ffSxiaofeibao-xjtu          csBundle(7).uopIdx := 7.U
979582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(0) := (VECTOR_TMP_REG_LMUL + 7).U
980582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(1) := (VECTOR_TMP_REG_LMUL + 7).U
981582849ffSxiaofeibao-xjtu          csBundle(8).ldest := (VECTOR_TMP_REG_LMUL + 8).U
982582849ffSxiaofeibao-xjtu          csBundle(8).vpu.fpu.isFoldTo1_4 := true.B
983582849ffSxiaofeibao-xjtu          csBundle(8).uopIdx := 8.U
984582849ffSxiaofeibao-xjtu          csBundle(9).lsrc(0) := (VECTOR_TMP_REG_LMUL + 8).U
985582849ffSxiaofeibao-xjtu          csBundle(9).lsrc(1) := (VECTOR_TMP_REG_LMUL + 8).U
986582849ffSxiaofeibao-xjtu          csBundle(9).ldest := (VECTOR_TMP_REG_LMUL + 9).U
987582849ffSxiaofeibao-xjtu          csBundle(9).vpu.fpu.isFoldTo1_8 := true.B
988582849ffSxiaofeibao-xjtu          csBundle(9).uopIdx := 9.U
989582849ffSxiaofeibao-xjtu          csBundle(10).lsrc(0) := src1
990582849ffSxiaofeibao-xjtu          csBundle(10).lsrc(1) := (VECTOR_TMP_REG_LMUL + 9).U
991582849ffSxiaofeibao-xjtu          csBundle(10).ldest := dest
992582849ffSxiaofeibao-xjtu          csBundle(10).uopIdx := 10.U
993582849ffSxiaofeibao-xjtu        }
994582849ffSxiaofeibao-xjtu      }
995582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.m4) {
996582849ffSxiaofeibao-xjtu        for (i <- 0 until 2) {
997582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(0) := src2 + (i * 2 + 1).U
998582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(1) := src2 + (i * 2).U
999582849ffSxiaofeibao-xjtu          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
1000582849ffSxiaofeibao-xjtu          csBundle(i).uopIdx := i.U
1001582849ffSxiaofeibao-xjtu        }
1002582849ffSxiaofeibao-xjtu        csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
1003582849ffSxiaofeibao-xjtu        csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1004582849ffSxiaofeibao-xjtu        csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
1005582849ffSxiaofeibao-xjtu        csBundle(2).uopIdx := 2.U
1006582849ffSxiaofeibao-xjtu        when(vsew === VSew.e64) {
1007582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := (VECTOR_TMP_REG_LMUL + 2).U
1008582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
1009582849ffSxiaofeibao-xjtu          csBundle(3).ldest := (VECTOR_TMP_REG_LMUL + 3).U
1010582849ffSxiaofeibao-xjtu          csBundle(3).vpu.fpu.isFoldTo1_2 := true.B
1011582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
1012582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(0) := src1
1013582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(1) := (VECTOR_TMP_REG_LMUL + 3).U
1014582849ffSxiaofeibao-xjtu          csBundle(4).ldest := dest
1015582849ffSxiaofeibao-xjtu          csBundle(4).uopIdx := 4.U
1016582849ffSxiaofeibao-xjtu        }
1017582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
1018582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := (VECTOR_TMP_REG_LMUL + 2).U
1019582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
1020582849ffSxiaofeibao-xjtu          csBundle(3).ldest := (VECTOR_TMP_REG_LMUL + 3).U
1021582849ffSxiaofeibao-xjtu          csBundle(3).vpu.fpu.isFoldTo1_2 := true.B
1022582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
1023582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(0) := (VECTOR_TMP_REG_LMUL + 3).U
1024582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(1) := (VECTOR_TMP_REG_LMUL + 3).U
1025582849ffSxiaofeibao-xjtu          csBundle(4).ldest := (VECTOR_TMP_REG_LMUL + 4).U
1026582849ffSxiaofeibao-xjtu          csBundle(4).vpu.fpu.isFoldTo1_4 := true.B
1027582849ffSxiaofeibao-xjtu          csBundle(4).uopIdx := 4.U
1028582849ffSxiaofeibao-xjtu          csBundle(5).lsrc(0) := src1
1029582849ffSxiaofeibao-xjtu          csBundle(5).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U
1030582849ffSxiaofeibao-xjtu          csBundle(5).ldest := dest
1031582849ffSxiaofeibao-xjtu          csBundle(5).uopIdx := 5.U
1032582849ffSxiaofeibao-xjtu        }
1033582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
1034582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := (VECTOR_TMP_REG_LMUL + 2).U
1035582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
1036582849ffSxiaofeibao-xjtu          csBundle(3).ldest := (VECTOR_TMP_REG_LMUL + 3).U
1037582849ffSxiaofeibao-xjtu          csBundle(3).vpu.fpu.isFoldTo1_2 := true.B
1038582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
1039582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(0) := (VECTOR_TMP_REG_LMUL + 3).U
1040582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(1) := (VECTOR_TMP_REG_LMUL + 3).U
1041582849ffSxiaofeibao-xjtu          csBundle(4).ldest := (VECTOR_TMP_REG_LMUL + 4).U
1042582849ffSxiaofeibao-xjtu          csBundle(4).vpu.fpu.isFoldTo1_4 := true.B
1043582849ffSxiaofeibao-xjtu          csBundle(4).uopIdx := 4.U
1044582849ffSxiaofeibao-xjtu          csBundle(5).lsrc(0) := (VECTOR_TMP_REG_LMUL + 4).U
1045582849ffSxiaofeibao-xjtu          csBundle(5).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U
1046582849ffSxiaofeibao-xjtu          csBundle(5).ldest := (VECTOR_TMP_REG_LMUL + 5).U
1047582849ffSxiaofeibao-xjtu          csBundle(5).vpu.fpu.isFoldTo1_8 := true.B
1048582849ffSxiaofeibao-xjtu          csBundle(5).uopIdx := 5.U
1049582849ffSxiaofeibao-xjtu          csBundle(6).lsrc(0) := src1
1050582849ffSxiaofeibao-xjtu          csBundle(6).lsrc(1) := (VECTOR_TMP_REG_LMUL + 5).U
1051582849ffSxiaofeibao-xjtu          csBundle(6).ldest := dest
1052582849ffSxiaofeibao-xjtu          csBundle(6).uopIdx := 6.U
1053582849ffSxiaofeibao-xjtu        }
1054582849ffSxiaofeibao-xjtu      }
1055582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.m2) {
1056582849ffSxiaofeibao-xjtu        csBundle(0).lsrc(0) := src2 + 1.U
1057582849ffSxiaofeibao-xjtu        csBundle(0).lsrc(1) := src2 + 0.U
1058582849ffSxiaofeibao-xjtu        csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
1059582849ffSxiaofeibao-xjtu        csBundle(0).uopIdx := 0.U
1060582849ffSxiaofeibao-xjtu        when(vsew === VSew.e64) {
1061582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
1062582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1063582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
1064582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_2 := true.B
1065582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
1066582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := src1
1067582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
1068582849ffSxiaofeibao-xjtu          csBundle(2).ldest := dest
1069582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
1070582849ffSxiaofeibao-xjtu        }
1071582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
1072582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
1073582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1074582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
1075582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_2 := true.B
1076582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
1077582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
1078582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
1079582849ffSxiaofeibao-xjtu          csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
1080582849ffSxiaofeibao-xjtu          csBundle(2).vpu.fpu.isFoldTo1_4 := true.B
1081582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
1082582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := src1
1083582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
1084582849ffSxiaofeibao-xjtu          csBundle(3).ldest := dest
1085582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
1086582849ffSxiaofeibao-xjtu        }
1087582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
1088582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
1089582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1090582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
1091582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_2 := true.B
1092582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
1093582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
1094582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
1095582849ffSxiaofeibao-xjtu          csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
1096582849ffSxiaofeibao-xjtu          csBundle(2).vpu.fpu.isFoldTo1_4 := true.B
1097582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
1098582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := (VECTOR_TMP_REG_LMUL + 2).U
1099582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
1100582849ffSxiaofeibao-xjtu          csBundle(3).ldest := (VECTOR_TMP_REG_LMUL + 3).U
1101582849ffSxiaofeibao-xjtu          csBundle(3).vpu.fpu.isFoldTo1_8 := true.B
1102582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
1103582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(0) := src1
1104582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(1) := (VECTOR_TMP_REG_LMUL + 3).U
1105582849ffSxiaofeibao-xjtu          csBundle(4).ldest := dest
1106582849ffSxiaofeibao-xjtu          csBundle(4).uopIdx := 4.U
1107582849ffSxiaofeibao-xjtu        }
1108582849ffSxiaofeibao-xjtu      }
1109582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.m1) {
1110582849ffSxiaofeibao-xjtu        when(vsew === VSew.e64) {
1111582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
1112582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
1113582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
1114582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_2 := true.B
1115582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
1116582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := src1
1117582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1118582849ffSxiaofeibao-xjtu          csBundle(1).ldest := dest
1119582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
1120582849ffSxiaofeibao-xjtu        }
1121582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
1122582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
1123582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
1124582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
1125582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_2 := true.B
1126582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
1127582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
1128582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1129582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
1130582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_4 := true.B
1131582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
1132582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := src1
1133582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
1134582849ffSxiaofeibao-xjtu          csBundle(2).ldest := dest
1135582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
1136582849ffSxiaofeibao-xjtu        }
1137582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
1138582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
1139582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
1140582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
1141582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_2 := true.B
1142582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
1143582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
1144582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1145582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
1146582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_4 := true.B
1147582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
1148582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
1149582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
1150582849ffSxiaofeibao-xjtu          csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
1151582849ffSxiaofeibao-xjtu          csBundle(2).vpu.fpu.isFoldTo1_8 := true.B
1152582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
1153582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := src1
1154582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
1155582849ffSxiaofeibao-xjtu          csBundle(3).ldest := dest
1156582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
1157582849ffSxiaofeibao-xjtu        }
1158582849ffSxiaofeibao-xjtu      }
1159582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.mf2) {
1160582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
1161582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
1162582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
1163582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
1164582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_4 := true.B
1165582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
1166582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := src1
1167582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1168582849ffSxiaofeibao-xjtu          csBundle(1).ldest := dest
1169582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
1170582849ffSxiaofeibao-xjtu        }
1171582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
1172582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
1173582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
1174582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
1175582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_4 := true.B
1176582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
1177582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
1178582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1179582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
1180582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_8 := true.B
1181582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
1182582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := src1
1183582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
1184582849ffSxiaofeibao-xjtu          csBundle(2).ldest := dest
1185582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
1186582849ffSxiaofeibao-xjtu        }
1187582849ffSxiaofeibao-xjtu      }
1188582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.mf4) {
1189582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
1190582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
1191582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
1192582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
1193582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_8 := true.B
1194582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
1195582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := src1
1196582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
1197582849ffSxiaofeibao-xjtu          csBundle(1).ldest := dest
1198582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
1199582849ffSxiaofeibao-xjtu        }
1200582849ffSxiaofeibao-xjtu      }
1201582849ffSxiaofeibao-xjtu    }
1202d91483a6Sfdy
1203b94b1889Sxiaofeibao-xjtu    is(UopSplitType.VEC_VFREDOSUM) {
1204b94b1889Sxiaofeibao-xjtu      import yunsuan.VfaluType
1205aaa08c5aSxiaofeibao-xjtu      val vlmul = vlmulReg
1206aaa08c5aSxiaofeibao-xjtu      val vsew = vsewReg
1207e25c13faSXuan Hu      val isWiden = latchedInst.fuOpType === VfaluType.vfwredosum
1208b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.m8) {
1209b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e64) {
1210b94b1889Sxiaofeibao-xjtu          val vlmax = 16
1211b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1212b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1213b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 2 == 0) src2 + (i/2).U else VECTOR_TMP_REG_LMUL.U)
1214b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 2 == 0) src2 + (i/2).U else if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1215b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1216b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := (if (i % 2 == 0) false.B else true.B)
1217b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1218b94b1889Sxiaofeibao-xjtu          }
1219b94b1889Sxiaofeibao-xjtu        }
1220b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
1221b94b1889Sxiaofeibao-xjtu          val vlmax = 32
1222b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1223b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1224b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
12258bbc295cSZiyue Zhang            csBundle(i).lsrc(2) := (if (i % 4 == 0) src2 + (i/4).U else if (i == vlmax - 1) dest else if (i % 4 == 1) Mux(isWiden, src2 + (i/4).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1226b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
12278bbc295cSZiyue Zhang            csBundle(i).vpu.fpu.isFoldTo1_2 := isWiden && (if (i % 4 == 0) false.B else true.B)
12288bbc295cSZiyue Zhang            csBundle(i).vpu.fpu.isFoldTo1_4 := !isWiden && (if (i % 4 == 0) false.B else true.B)
1229b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1230b94b1889Sxiaofeibao-xjtu          }
1231b94b1889Sxiaofeibao-xjtu        }
1232b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1233b94b1889Sxiaofeibao-xjtu          val vlmax = 64
1234b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1235b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1236b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
12378bbc295cSZiyue Zhang            csBundle(i).lsrc(2) := (if (i % 8 == 0) src2 + (i/8).U else if (i == vlmax - 1) dest else if (i % 8 == 1) Mux(isWiden, src2 + (i/8).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1238b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
12398bbc295cSZiyue Zhang            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
12408bbc295cSZiyue Zhang            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1241b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1242b94b1889Sxiaofeibao-xjtu          }
1243b94b1889Sxiaofeibao-xjtu        }
1244b94b1889Sxiaofeibao-xjtu      }
1245b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.m4) {
1246b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e64) {
1247b94b1889Sxiaofeibao-xjtu          val vlmax = 8
1248b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1249b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1250b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 2 == 0) src2 + (i/2).U else VECTOR_TMP_REG_LMUL.U)
1251b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 2 == 0) src2 + (i/2).U else if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1252b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1253b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := (if (i % 2 == 0) false.B else true.B)
1254b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1255b94b1889Sxiaofeibao-xjtu          }
1256b94b1889Sxiaofeibao-xjtu        }
1257b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
1258b94b1889Sxiaofeibao-xjtu          val vlmax = 16
1259b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1260b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1261b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
1262b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 4 == 0) src2 + (i/4).U else if (i == vlmax - 1) dest else if (i % 4 == 1) Mux(isWiden, src2 + (i/4).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1263b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1264b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := isWiden && (if (i % 4 == 0) false.B else true.B)
1265b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := !isWiden && (if (i % 4 == 0) false.B else true.B)
1266b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1267b94b1889Sxiaofeibao-xjtu          }
1268b94b1889Sxiaofeibao-xjtu        }
1269b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1270b94b1889Sxiaofeibao-xjtu          val vlmax = 32
1271b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1272b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1273b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
1274b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 8 == 0) src2 + (i/8).U else if (i == vlmax - 1) dest else if (i % 8 == 1) Mux(isWiden, src2 + (i/8).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1275b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1276b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1277b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1278b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1279b94b1889Sxiaofeibao-xjtu          }
1280b94b1889Sxiaofeibao-xjtu        }
1281b94b1889Sxiaofeibao-xjtu      }
1282b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.m2) {
1283b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e64) {
1284b94b1889Sxiaofeibao-xjtu          val vlmax = 4
1285b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1286b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1287b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 2 == 0) src2 + (i/2).U else VECTOR_TMP_REG_LMUL.U)
1288b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 2 == 0) src2 + (i/2).U else if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1289b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1290b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := (if (i % 2 == 0) false.B else true.B)
1291b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1292b94b1889Sxiaofeibao-xjtu          }
1293b94b1889Sxiaofeibao-xjtu        }
1294b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
1295b94b1889Sxiaofeibao-xjtu          val vlmax = 8
1296b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1297b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1298b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
1299b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 4 == 0) src2 + (i/4).U else if (i == vlmax - 1) dest else if (i % 4 == 1) Mux(isWiden, src2 + (i/4).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1300b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1301b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := isWiden && (if (i % 4 == 0) false.B else true.B)
1302b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := !isWiden && (if (i % 4 == 0) false.B else true.B)
1303b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1304b94b1889Sxiaofeibao-xjtu          }
1305b94b1889Sxiaofeibao-xjtu        }
1306b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1307b94b1889Sxiaofeibao-xjtu          val vlmax = 16
1308b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1309b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1310b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
1311b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 8 == 0) src2 + (i/8).U else if (i == vlmax - 1) dest else if (i % 8 == 1) Mux(isWiden, src2 + (i/8).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1312b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1313b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1314b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1315b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1316b94b1889Sxiaofeibao-xjtu          }
1317b94b1889Sxiaofeibao-xjtu        }
1318b94b1889Sxiaofeibao-xjtu      }
1319b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.m1) {
1320b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e64) {
1321b94b1889Sxiaofeibao-xjtu          val vlmax = 2
1322b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1323b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1324b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 2 == 0) src2 + (i/2).U else VECTOR_TMP_REG_LMUL.U)
1325b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 2 == 0) src2 + (i/2).U else if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1326b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1327b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := (if (i % 2 == 0) false.B else true.B)
1328b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1329b94b1889Sxiaofeibao-xjtu          }
1330b94b1889Sxiaofeibao-xjtu        }
1331b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
1332b94b1889Sxiaofeibao-xjtu          val vlmax = 4
1333b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1334b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1335b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
1336b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 4 == 0) src2 + (i/4).U else if (i == vlmax - 1) dest else if (i % 4 == 1) Mux(isWiden, src2 + (i/4).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1337b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1338b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := isWiden && (if (i % 4 == 0) false.B else true.B)
1339b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := !isWiden && (if (i % 4 == 0) false.B else true.B)
1340b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1341b94b1889Sxiaofeibao-xjtu          }
1342b94b1889Sxiaofeibao-xjtu        }
1343b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1344b94b1889Sxiaofeibao-xjtu          val vlmax = 8
1345b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1346b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1347b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
1348b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 8 == 0) src2 + (i/8).U else if (i == vlmax - 1) dest else if (i % 8 == 1) Mux(isWiden, src2 + (i/8).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1349b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1350b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1351b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1352b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1353b94b1889Sxiaofeibao-xjtu          }
1354b94b1889Sxiaofeibao-xjtu        }
1355b94b1889Sxiaofeibao-xjtu      }
1356b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.mf2) {
1357b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
1358b94b1889Sxiaofeibao-xjtu          val vlmax = 2
1359b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1360b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1361b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
1362b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 4 == 0) src2 + (i/4).U else if (i == vlmax - 1) dest else if (i % 4 == 1) Mux(isWiden, src2 + (i/4).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1363b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1364b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := isWiden && (if (i % 4 == 0) false.B else true.B)
1365b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := !isWiden && (if (i % 4 == 0) false.B else true.B)
1366b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1367b94b1889Sxiaofeibao-xjtu          }
1368b94b1889Sxiaofeibao-xjtu        }
1369b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1370b94b1889Sxiaofeibao-xjtu          val vlmax = 4
1371b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1372b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1373b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
1374b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 8 == 0) src2 + (i/8).U else if (i == vlmax - 1) dest else if (i % 8 == 1) Mux(isWiden, src2 + (i/8).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1375b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1376b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1377b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1378b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1379b94b1889Sxiaofeibao-xjtu          }
1380b94b1889Sxiaofeibao-xjtu        }
1381b94b1889Sxiaofeibao-xjtu      }
1382b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.mf4) {
1383b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1384b94b1889Sxiaofeibao-xjtu          val vlmax = 2
1385b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1386b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1387b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
1388b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 8 == 0) src2 + (i/8).U else if (i == vlmax - 1) dest else if (i % 8 == 1) Mux(isWiden, src2 + (i/8).U, VECTOR_TMP_REG_LMUL.U) else VECTOR_TMP_REG_LMUL.U)
1389b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1390b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1391b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1392b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1393b94b1889Sxiaofeibao-xjtu          }
1394b94b1889Sxiaofeibao-xjtu        }
1395b94b1889Sxiaofeibao-xjtu      }
1396b94b1889Sxiaofeibao-xjtu    }
1397d6059658SZiyue Zhang
139817ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDEUP) {
1399d6059658SZiyue Zhang      // i to vector move
1400e03e0c5bSZiyue Zhang      csBundle(0).srcType(0) := Mux(src1IsImm, SrcType.imm, SrcType.reg)
1401d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
1402b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
1403d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
1404fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1405fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1406b1712600SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.imm2Vec(2, 0), IF2VectorType.i2Vec(2, 0)), vsewReg)
1407fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
1408d91483a6Sfdy      // LMUL
1409d91483a6Sfdy      for (i <- 0 until MAX_VLMUL)
1410d91483a6Sfdy        for (j <- 0 to i) {
14114ee69032SzhanglyGit          val old_vd = if (j == 0) {
14124ee69032SzhanglyGit            dest + i.U
1413fc85f18fSZiyue Zhang          } else (VECTOR_TMP_REG_LMUL + j).U
14144ee69032SzhanglyGit          val vd = if (j == i) {
14154ee69032SzhanglyGit            dest + i.U
1416fc85f18fSZiyue Zhang          } else (VECTOR_TMP_REG_LMUL + j + 1).U
1417fc85f18fSZiyue Zhang          csBundle(i * (i + 1) / 2 + j + 1).srcType(0) := SrcType.vp
1418fc85f18fSZiyue Zhang          csBundle(i * (i + 1) / 2 + j + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
1419d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).lsrc(1) := src2 + j.U
1420d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).lsrc(2) := old_vd
1421d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).ldest := vd
1422d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).uopIdx := (i * (i + 1) / 2 + j).U
1423d91483a6Sfdy        }
1424d91483a6Sfdy    }
1425d91483a6Sfdy
142617ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDEDOWN) {
1427d6059658SZiyue Zhang      // i to vector move
1428e03e0c5bSZiyue Zhang      csBundle(0).srcType(0) := Mux(src1IsImm, SrcType.imm, SrcType.reg)
1429d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
1430b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
1431d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
1432fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1433fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1434b1712600SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.imm2Vec(2, 0), IF2VectorType.i2Vec(2, 0)), vsewReg)
1435fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
1436d91483a6Sfdy      // LMUL
1437d91483a6Sfdy      for (i <- 0 until MAX_VLMUL)
1438d91483a6Sfdy        for (j <- (0 to i).reverse) {
1439d91483a6Sfdy          when(i.U < lmul) {
14404ee69032SzhanglyGit            val old_vd = if (j == 0) {
14414ee69032SzhanglyGit              dest + lmul - 1.U - i.U
1442fc85f18fSZiyue Zhang            } else (VECTOR_TMP_REG_LMUL + j).U
14434ee69032SzhanglyGit            val vd = if (j == i) {
14444ee69032SzhanglyGit              dest + lmul - 1.U - i.U
1445fc85f18fSZiyue Zhang            } else (VECTOR_TMP_REG_LMUL + j + 1).U
1446fc85f18fSZiyue Zhang            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).srcType(0) := SrcType.vp
1447fc85f18fSZiyue Zhang            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(0) := VECTOR_TMP_REG_LMUL.U
1448d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(1) := src2 + lmul - 1.U - j.U
1449d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(2) := old_vd
1450d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).ldest := vd
1451d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).uopIdx := numOfUop - (i * (i + 1) / 2 + i - j + 2).U
1452d91483a6Sfdy          }
1453d91483a6Sfdy        }
1454d91483a6Sfdy    }
1455d91483a6Sfdy
145617ec87f2SXuan Hu    is(UopSplitType.VEC_M0X) {
1457d91483a6Sfdy      // LMUL
1458d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
1459d91483a6Sfdy        val srcType0 = if (i == 0) SrcType.DC else SrcType.vp
1460d91483a6Sfdy        val ldest = (VECTOR_TMP_REG_LMUL + i).U
1461d91483a6Sfdy        csBundle(i).srcType(0) := srcType0
1462d91483a6Sfdy        csBundle(i).srcType(1) := SrcType.vp
1463d91483a6Sfdy        csBundle(i).rfWen := false.B
1464cd2c45feSZiyue Zhang        csBundle(i).fpWen := false.B
1465d91483a6Sfdy        csBundle(i).vecWen := true.B
1466d91483a6Sfdy        csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U
1467d91483a6Sfdy        csBundle(i).lsrc(1) := src2
1468d91483a6Sfdy        // csBundle(i).lsrc(2) := dest + i.U  DontCare
1469d91483a6Sfdy        csBundle(i).ldest := ldest
1470d91483a6Sfdy        csBundle(i).uopIdx := i.U
1471d91483a6Sfdy      }
1472762f2b39SZiyue Zhang      csBundle(numOfUop - 1.U).rfWen := Mux(dest === 0.U, false.B, true.B)
1473762f2b39SZiyue Zhang      csBundle(numOfUop - 1.U).fpWen := false.B
1474762f2b39SZiyue Zhang      csBundle(numOfUop - 1.U).vecWen := false.B
1475762f2b39SZiyue Zhang      csBundle(numOfUop - 1.U).ldest := dest
1476d91483a6Sfdy    }
1477d91483a6Sfdy
147817ec87f2SXuan Hu    is(UopSplitType.VEC_MVV) {
1479d91483a6Sfdy      // LMUL
1480d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
1481d91483a6Sfdy        val srcType0 = if (i == 0) SrcType.DC else SrcType.vp
1482d91483a6Sfdy        csBundle(i * 2 + 0).srcType(0) := srcType0
1483d91483a6Sfdy        csBundle(i * 2 + 0).srcType(1) := SrcType.vp
1484d91483a6Sfdy        csBundle(i * 2 + 0).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U
1485d91483a6Sfdy        csBundle(i * 2 + 0).lsrc(1) := src2
1486d91483a6Sfdy        csBundle(i * 2 + 0).lsrc(2) := dest + i.U
1487d91483a6Sfdy        csBundle(i * 2 + 0).ldest := dest + i.U
1488d91483a6Sfdy        csBundle(i * 2 + 0).uopIdx := (i * 2 + 0).U
1489d91483a6Sfdy
1490d91483a6Sfdy        csBundle(i * 2 + 1).srcType(0) := srcType0
1491d91483a6Sfdy        csBundle(i * 2 + 1).srcType(1) := SrcType.vp
1492d91483a6Sfdy        csBundle(i * 2 + 1).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U
1493d91483a6Sfdy        csBundle(i * 2 + 1).lsrc(1) := src2
1494d91483a6Sfdy        // csBundle(i).lsrc(2) := dest + i.U  DontCare
1495d91483a6Sfdy        csBundle(i * 2 + 1).ldest := (VECTOR_TMP_REG_LMUL + i).U
1496d91483a6Sfdy        csBundle(i * 2 + 1).uopIdx := (i * 2 + 1).U
1497d91483a6Sfdy      }
1498d91483a6Sfdy    }
1499189ec863SzhanglyGit    is(UopSplitType.VEC_VWW) {
1500189ec863SzhanglyGit      for (i <- 0 until MAX_VLMUL*2) {
1501189ec863SzhanglyGit        when(i.U < lmul){
1502189ec863SzhanglyGit          csBundle(i).srcType(2) := SrcType.DC
1503189ec863SzhanglyGit          csBundle(i).lsrc(0) := src2 + i.U
1504189ec863SzhanglyGit          csBundle(i).lsrc(1) := src2 + i.U
1505189ec863SzhanglyGit          // csBundle(i).lsrc(2) := dest + (2 * i).U
1506189ec863SzhanglyGit          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
1507189ec863SzhanglyGit          csBundle(i).uopIdx :=  i.U
1508189ec863SzhanglyGit        } otherwise {
1509189ec863SzhanglyGit          csBundle(i).srcType(2) := SrcType.DC
1510189ec863SzhanglyGit          csBundle(i).lsrc(0) := VECTOR_TMP_REG_LMUL.U + Cat((i.U-lmul),0.U(1.W)) + 1.U
1511189ec863SzhanglyGit          csBundle(i).lsrc(1) := VECTOR_TMP_REG_LMUL.U + Cat((i.U-lmul),0.U(1.W))
1512189ec863SzhanglyGit          // csBundle(i).lsrc(2) := dest + (2 * i).U
1513189ec863SzhanglyGit          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
1514189ec863SzhanglyGit          csBundle(i).uopIdx := i.U
1515189ec863SzhanglyGit        }
1516189ec863SzhanglyGit        csBundle(numOfUop-1.U).srcType(2) := SrcType.vp
1517189ec863SzhanglyGit        csBundle(numOfUop-1.U).lsrc(0) := src1
1518189ec863SzhanglyGit        csBundle(numOfUop-1.U).lsrc(2) := dest
1519189ec863SzhanglyGit        csBundle(numOfUop-1.U).ldest := dest
1520189ec863SzhanglyGit      }
1521189ec863SzhanglyGit    }
1522189ec863SzhanglyGit    is(UopSplitType.VEC_RGATHER) {
1523189ec863SzhanglyGit      def genCsBundle_VEC_RGATHER(len:Int): Unit ={
1524189ec863SzhanglyGit        for (i <- 0 until len)
1525189ec863SzhanglyGit          for (j <- 0 until len) {
1526189ec863SzhanglyGit            // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm
1527189ec863SzhanglyGit            // csBundle(i * len + j).srcType(1) := SrcType.vp
1528189ec863SzhanglyGit            // csBundle(i * len + j).srcType(2) := SrcType.vp
1529189ec863SzhanglyGit            csBundle(i * len + j).lsrc(0) := src1 + i.U
1530189ec863SzhanglyGit            csBundle(i * len + j).lsrc(1) := src2 + j.U
1531189ec863SzhanglyGit            val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j - 1).U
1532189ec863SzhanglyGit            csBundle(i * len + j).lsrc(2) := vd_old
1533189ec863SzhanglyGit            val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U
1534189ec863SzhanglyGit            csBundle(i * len + j).ldest := vd
1535189ec863SzhanglyGit            csBundle(i * len + j).uopIdx := (i * len + j).U
1536189ec863SzhanglyGit          }
1537189ec863SzhanglyGit      }
1538aaa08c5aSxiaofeibao-xjtu      switch(vlmulReg) {
1539189ec863SzhanglyGit        is("b001".U ){
1540189ec863SzhanglyGit          genCsBundle_VEC_RGATHER(2)
1541189ec863SzhanglyGit        }
1542189ec863SzhanglyGit        is("b010".U ){
1543189ec863SzhanglyGit          genCsBundle_VEC_RGATHER(4)
1544189ec863SzhanglyGit        }
1545189ec863SzhanglyGit        is("b011".U ){
1546189ec863SzhanglyGit          genCsBundle_VEC_RGATHER(8)
1547189ec863SzhanglyGit        }
1548189ec863SzhanglyGit      }
1549189ec863SzhanglyGit    }
1550189ec863SzhanglyGit    is(UopSplitType.VEC_RGATHER_VX) {
1551189ec863SzhanglyGit      def genCsBundle_RGATHER_VX(len:Int): Unit ={
1552189ec863SzhanglyGit        for (i <- 0 until len)
1553189ec863SzhanglyGit          for (j <- 0 until len) {
1554fc85f18fSZiyue Zhang            csBundle(i * len + j + 1).srcType(0) := SrcType.vp
1555189ec863SzhanglyGit            // csBundle(i * len + j + 1).srcType(1) := SrcType.vp
1556189ec863SzhanglyGit            // csBundle(i * len + j + 1).srcType(2) := SrcType.vp
1557fc85f18fSZiyue Zhang            csBundle(i * len + j + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
1558189ec863SzhanglyGit            csBundle(i * len + j + 1).lsrc(1) := src2 + j.U
1559fc85f18fSZiyue Zhang            val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U
1560189ec863SzhanglyGit            csBundle(i * len + j + 1).lsrc(2) := vd_old
1561fc85f18fSZiyue Zhang            val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j + 1).U
1562189ec863SzhanglyGit            csBundle(i * len + j + 1).ldest := vd
1563189ec863SzhanglyGit            csBundle(i * len + j + 1).uopIdx := (i * len + j).U
1564189ec863SzhanglyGit          }
1565189ec863SzhanglyGit      }
1566d6059658SZiyue Zhang      // i to vector move
1567e03e0c5bSZiyue Zhang      csBundle(0).srcType(0) := Mux(src1IsImm, SrcType.imm, SrcType.reg)
1568189ec863SzhanglyGit      csBundle(0).srcType(1) := SrcType.imm
1569b50f8edeSsinsanction      csBundle(0).srcType(2) := SrcType.imm
1570189ec863SzhanglyGit      csBundle(0).lsrc(1) := 0.U
1571fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1572fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1573b1712600SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.imm2Vec(2, 0), IF2VectorType.i2Vec(2, 0)), vsewReg)
157493a5bfb8SZiyue Zhang      csBundle(0).rfWen := false.B
157593a5bfb8SZiyue Zhang      csBundle(0).fpWen := false.B
1576fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
1577189ec863SzhanglyGit      genCsBundle_RGATHER_VX(1)
1578783e318eSsinceforYy      switch(vlmulReg) {
1579189ec863SzhanglyGit        is("b001".U ){
1580189ec863SzhanglyGit          genCsBundle_RGATHER_VX(2)
1581189ec863SzhanglyGit        }
1582189ec863SzhanglyGit        is("b010".U ){
1583189ec863SzhanglyGit          genCsBundle_RGATHER_VX(4)
1584189ec863SzhanglyGit        }
1585189ec863SzhanglyGit        is("b011".U ){
1586189ec863SzhanglyGit          genCsBundle_RGATHER_VX(8)
1587189ec863SzhanglyGit        }
1588189ec863SzhanglyGit      }
1589189ec863SzhanglyGit    }
1590189ec863SzhanglyGit    is(UopSplitType.VEC_RGATHEREI16) {
1591189ec863SzhanglyGit      def genCsBundle_VEC_RGATHEREI16_SEW8(len:Int): Unit ={
1592189ec863SzhanglyGit        for (i <- 0 until len)
1593189ec863SzhanglyGit          for (j <- 0 until len) {
1594189ec863SzhanglyGit            val vd_old0 = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j*2-1).U
1595189ec863SzhanglyGit            val vd0 = (VECTOR_TMP_REG_LMUL + j*2 ).U
1596189ec863SzhanglyGit            csBundle((i * len + j)*2+0).lsrc(0) := src1 + (i*2+0).U
1597189ec863SzhanglyGit            csBundle((i * len + j)*2+0).lsrc(1) := src2 + j.U
1598189ec863SzhanglyGit            csBundle((i * len + j)*2+0).lsrc(2) := vd_old0
1599189ec863SzhanglyGit            csBundle((i * len + j)*2+0).ldest := vd0
1600189ec863SzhanglyGit            csBundle((i * len + j)*2+0).uopIdx := ((i * len + j)*2+0).U
1601189ec863SzhanglyGit            val vd_old1 = (VECTOR_TMP_REG_LMUL + j*2).U
1602189ec863SzhanglyGit            val vd1 = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j*2+1 ).U
1603189ec863SzhanglyGit            csBundle((i * len + j)*2+1).lsrc(0) := src1 + (i*2+1).U
1604189ec863SzhanglyGit            csBundle((i * len + j)*2+1).lsrc(1) := src2 + j.U
1605189ec863SzhanglyGit            csBundle((i * len + j)*2+1).lsrc(2) := vd_old1
1606189ec863SzhanglyGit            csBundle((i * len + j)*2+1).ldest := vd1
1607189ec863SzhanglyGit            csBundle((i * len + j)*2+1).uopIdx := ((i * len + j)*2+1).U
1608189ec863SzhanglyGit          }
1609189ec863SzhanglyGit      }
1610189ec863SzhanglyGit      def genCsBundle_VEC_RGATHEREI16(len:Int): Unit ={
1611189ec863SzhanglyGit        for (i <- 0 until len)
1612189ec863SzhanglyGit          for (j <- 0 until len) {
1613189ec863SzhanglyGit            val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j-1).U
1614189ec863SzhanglyGit            val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U
1615189ec863SzhanglyGit            csBundle(i * len + j).lsrc(0) := src1 + i.U
1616189ec863SzhanglyGit            csBundle(i * len + j).lsrc(1) := src2 + j.U
1617189ec863SzhanglyGit            csBundle(i * len + j).lsrc(2) := vd_old
1618189ec863SzhanglyGit            csBundle(i * len + j).ldest := vd
1619189ec863SzhanglyGit            csBundle(i * len + j).uopIdx := (i * len + j).U
1620189ec863SzhanglyGit          }
1621189ec863SzhanglyGit      }
162293a5bfb8SZiyue Zhang      def genCsBundle_VEC_RGATHEREI16_SEW32(len:Int): Unit ={
162393a5bfb8SZiyue Zhang        for (i <- 0 until len)
162493a5bfb8SZiyue Zhang          for (j <- 0 until len) {
162593a5bfb8SZiyue Zhang            val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j-1).U
162693a5bfb8SZiyue Zhang            val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U
162793a5bfb8SZiyue Zhang            csBundle(i * len + j).lsrc(0) := src1 + (i / 2).U
162893a5bfb8SZiyue Zhang            csBundle(i * len + j).lsrc(1) := src2 + j.U
162993a5bfb8SZiyue Zhang            csBundle(i * len + j).lsrc(2) := vd_old
163093a5bfb8SZiyue Zhang            csBundle(i * len + j).ldest := vd
163193a5bfb8SZiyue Zhang            csBundle(i * len + j).uopIdx := (i * len + j).U
163293a5bfb8SZiyue Zhang          }
163393a5bfb8SZiyue Zhang      }
163493a5bfb8SZiyue Zhang      def genCsBundle_VEC_RGATHEREI16_SEW64(len:Int): Unit ={
163593a5bfb8SZiyue Zhang        for (i <- 0 until len)
163693a5bfb8SZiyue Zhang          for (j <- 0 until len) {
163793a5bfb8SZiyue Zhang            val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j-1).U
163893a5bfb8SZiyue Zhang            val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U
163993a5bfb8SZiyue Zhang            csBundle(i * len + j).lsrc(0) := src1 + (i / 4).U
164093a5bfb8SZiyue Zhang            csBundle(i * len + j).lsrc(1) := src2 + j.U
164193a5bfb8SZiyue Zhang            csBundle(i * len + j).lsrc(2) := vd_old
164293a5bfb8SZiyue Zhang            csBundle(i * len + j).ldest := vd
164393a5bfb8SZiyue Zhang            csBundle(i * len + j).uopIdx := (i * len + j).U
164493a5bfb8SZiyue Zhang          }
164593a5bfb8SZiyue Zhang      }
1646aaa08c5aSxiaofeibao-xjtu      when(!vsewReg.orR){
1647189ec863SzhanglyGit        genCsBundle_VEC_RGATHEREI16_SEW8(1)
164893a5bfb8SZiyue Zhang      }.elsewhen(vsewReg === VSew.e32){
164993a5bfb8SZiyue Zhang        genCsBundle_VEC_RGATHEREI16_SEW32(1)
165093a5bfb8SZiyue Zhang      }.elsewhen(vsewReg === VSew.e64){
165193a5bfb8SZiyue Zhang        genCsBundle_VEC_RGATHEREI16_SEW64(1)
1652189ec863SzhanglyGit      }.otherwise{
1653189ec863SzhanglyGit        genCsBundle_VEC_RGATHEREI16(1)
1654189ec863SzhanglyGit      }
165593a5bfb8SZiyue Zhang      switch(vlmulReg) {
1656189ec863SzhanglyGit        is("b001".U) {
1657aaa08c5aSxiaofeibao-xjtu          when(!vsewReg.orR) {
1658189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16_SEW8(2)
165993a5bfb8SZiyue Zhang          }.elsewhen(vsewReg === VSew.e32){
166093a5bfb8SZiyue Zhang            genCsBundle_VEC_RGATHEREI16_SEW32(2)
166193a5bfb8SZiyue Zhang          }.elsewhen(vsewReg === VSew.e64){
166293a5bfb8SZiyue Zhang            genCsBundle_VEC_RGATHEREI16_SEW64(2)
1663189ec863SzhanglyGit          }.otherwise{
1664189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16(2)
1665189ec863SzhanglyGit          }
1666189ec863SzhanglyGit        }
1667189ec863SzhanglyGit        is("b010".U) {
1668aaa08c5aSxiaofeibao-xjtu          when(!vsewReg.orR) {
1669189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16_SEW8(4)
167093a5bfb8SZiyue Zhang          }.elsewhen(vsewReg === VSew.e32){
167193a5bfb8SZiyue Zhang            genCsBundle_VEC_RGATHEREI16_SEW32(4)
167293a5bfb8SZiyue Zhang          }.elsewhen(vsewReg === VSew.e64){
167393a5bfb8SZiyue Zhang            genCsBundle_VEC_RGATHEREI16_SEW64(4)
1674189ec863SzhanglyGit          }.otherwise{
1675189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16(4)
1676189ec863SzhanglyGit          }
1677189ec863SzhanglyGit        }
1678189ec863SzhanglyGit        is("b011".U) {
167993a5bfb8SZiyue Zhang          when(vsewReg === VSew.e32){
168093a5bfb8SZiyue Zhang            genCsBundle_VEC_RGATHEREI16_SEW32(8)
168193a5bfb8SZiyue Zhang          }.elsewhen(vsewReg === VSew.e64){
168293a5bfb8SZiyue Zhang            genCsBundle_VEC_RGATHEREI16_SEW64(8)
168393a5bfb8SZiyue Zhang          }.otherwise{
1684189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16(8)
1685189ec863SzhanglyGit          }
1686189ec863SzhanglyGit        }
1687189ec863SzhanglyGit      }
168893a5bfb8SZiyue Zhang    }
1689189ec863SzhanglyGit    is(UopSplitType.VEC_COMPRESS) {
1690189ec863SzhanglyGit      def genCsBundle_VEC_COMPRESS(len:Int): Unit = {
1691189ec863SzhanglyGit        for (i <- 0 until len) {
1692189ec863SzhanglyGit          val jlen = if (i == len-1) i+1 else i+2
1693189ec863SzhanglyGit          for (j <- 0 until jlen) {
1694189ec863SzhanglyGit            val vd_old = if(i==j) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j + 1).U
1695189ec863SzhanglyGit            val vd = if(i==len-1) (dest + j.U) else {
16963bec463eSlewislzh              if (j == i+1) VECTOR_TMP_REG_LMUL.U  else (VECTOR_TMP_REG_LMUL + j + 1).U
1697189ec863SzhanglyGit            }
16983bec463eSlewislzh            csBundle(i*(i+3)/2 + j).vecWen := true.B
16993bec463eSlewislzh            csBundle(i*(i+3)/2 + j).v0Wen := false.B
17005da52072SsinceforYy            val src13Type = if (j == i+1) DontCare else SrcType.vp
17015da52072SsinceforYy            csBundle(i*(i+3)/2 + j).srcType(0) := src13Type
17025da52072SsinceforYy            csBundle(i*(i+3)/2 + j).srcType(1) := SrcType.vp
17035da52072SsinceforYy            csBundle(i*(i+3)/2 + j).srcType(2) := src13Type
17043bec463eSlewislzh            if (i == 0) {
1705189ec863SzhanglyGit              csBundle(i*(i+3)/2 + j).lsrc(0) := src1
17063bec463eSlewislzh            } else {
17073bec463eSlewislzh              csBundle(i*(i+3)/2 + j).lsrc(0) := VECTOR_TMP_REG_LMUL.U
17083bec463eSlewislzh            }
1709189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).lsrc(1) := src2 + i.U
1710189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).lsrc(2) := vd_old
1711189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).ldest := vd
1712189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).uopIdx := (i*(i+3)/2 + j).U
1713189ec863SzhanglyGit          }
1714189ec863SzhanglyGit        }
1715189ec863SzhanglyGit      }
1716aaa08c5aSxiaofeibao-xjtu      switch(vlmulReg) {
1717189ec863SzhanglyGit        is("b001".U ){
1718189ec863SzhanglyGit          genCsBundle_VEC_COMPRESS(2)
1719189ec863SzhanglyGit        }
1720189ec863SzhanglyGit        is("b010".U ){
1721189ec863SzhanglyGit          genCsBundle_VEC_COMPRESS(4)
1722189ec863SzhanglyGit        }
1723189ec863SzhanglyGit        is("b011".U ){
1724189ec863SzhanglyGit          genCsBundle_VEC_COMPRESS(8)
1725189ec863SzhanglyGit        }
1726189ec863SzhanglyGit      }
1727189ec863SzhanglyGit    }
17280a34fc22SZiyue Zhang    is(UopSplitType.VEC_MVNR) {
17290a34fc22SZiyue Zhang      for (i <- 0 until MAX_VLMUL) {
17300a34fc22SZiyue Zhang        csBundle(i).lsrc(0) := src1 + i.U
17310a34fc22SZiyue Zhang        csBundle(i).lsrc(1) := src2 + i.U
17320a34fc22SZiyue Zhang        csBundle(i).lsrc(2) := dest + i.U
17330a34fc22SZiyue Zhang        csBundle(i).ldest := dest + i.U
17340a34fc22SZiyue Zhang        csBundle(i).uopIdx := i.U
17350a34fc22SZiyue Zhang      }
17360a34fc22SZiyue Zhang    }
1737c4501a6fSZiyue-Zhang    is(UopSplitType.VEC_US_LDST) {
17384ee69032SzhanglyGit      /*
17394ee69032SzhanglyGit      FMV.D.X
17404ee69032SzhanglyGit       */
17414ee69032SzhanglyGit      csBundle(0).srcType(0) := SrcType.reg
17424ee69032SzhanglyGit      csBundle(0).srcType(1) := SrcType.imm
17434ee69032SzhanglyGit      csBundle(0).lsrc(1) := 0.U
1744c8cff56fSsinsanction      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1745964d9a87SZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1746964d9a87SZiyue Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.i2Vec(2, 0), e64)
17474ee69032SzhanglyGit      csBundle(0).rfWen := false.B
1748c8cff56fSsinsanction      csBundle(0).fpWen := false.B
1749c8cff56fSsinsanction      csBundle(0).vecWen := true.B
175031c51290Szhanglinjuan      csBundle(0).vlsInstr := true.B
17514ee69032SzhanglyGit      //LMUL
17524ee69032SzhanglyGit      for (i <- 0 until MAX_VLMUL) {
1753c8cff56fSsinsanction        csBundle(i + 1).srcType(0) := SrcType.vp
1754c8cff56fSsinsanction        csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
17554dfab1f2Szhanglinjuan        csBundle(i + 1).lsrc(2) := dest + i.U // old vd
17564ee69032SzhanglyGit        csBundle(i + 1).ldest := dest + i.U
17574ee69032SzhanglyGit        csBundle(i + 1).uopIdx := i.U
175831c51290Szhanglinjuan        csBundle(i + 1).vlsInstr := true.B
17594ee69032SzhanglyGit      }
17604aa00286SXuan Hu      csBundle.head.waitForward := isUsSegment
17614aa00286SXuan Hu      csBundle(numOfUop - 1.U).blockBackward := isUsSegment
17624ee69032SzhanglyGit    }
1763b0480352SZiyue Zhang    is(UopSplitType.VEC_US_FF_LD) {
1764b0480352SZiyue Zhang      csBundle(0).srcType(0) := SrcType.reg
1765b0480352SZiyue Zhang      csBundle(0).srcType(1) := SrcType.imm
1766b0480352SZiyue Zhang      csBundle(0).lsrc(1) := 0.U
1767b0480352SZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1768b0480352SZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1769b0480352SZiyue Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.i2Vec(2, 0), e64)
1770b0480352SZiyue Zhang      csBundle(0).rfWen := false.B
1771b0480352SZiyue Zhang      csBundle(0).fpWen := false.B
1772b0480352SZiyue Zhang      csBundle(0).vecWen := true.B
1773b0480352SZiyue Zhang      csBundle(0).vlsInstr := true.B
1774b0480352SZiyue Zhang      //LMUL
1775b0480352SZiyue Zhang      for (i <- 0 until MAX_VLMUL) {
1776b0480352SZiyue Zhang        csBundle(i + 1).srcType(0) := SrcType.vp
1777b0480352SZiyue Zhang        csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
1778b0480352SZiyue Zhang        csBundle(i + 1).lsrc(2) := dest + i.U // old vd
1779b0480352SZiyue Zhang        csBundle(i + 1).ldest := dest + i.U
1780b0480352SZiyue Zhang        csBundle(i + 1).uopIdx := i.U
1781b0480352SZiyue Zhang        csBundle(i + 1).vlsInstr := true.B
1782b0480352SZiyue Zhang      }
1783b0480352SZiyue Zhang      csBundle.head.waitForward := isUsSegment
1784b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).blockBackward := isUsSegment
1785b0480352SZiyue Zhang      // last uop read vl and write vl
1786b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).srcType(0) := SrcType.no
1787b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).srcType(1) := SrcType.no
1788b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).srcType(2) := SrcType.no
1789b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).srcType(3) := SrcType.no
1790b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).srcType(4) := SrcType.vp
1791b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).lsrc(4) := Vl_IDX.U
1792b0480352SZiyue Zhang      // vtype
1793b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).vecWen := false.B
1794b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).vlWen := true.B
1795b0480352SZiyue Zhang      csBundle(numOfUop - 1.U).ldest := Vl_IDX.U
1796b0480352SZiyue Zhang    }
1797c4501a6fSZiyue-Zhang    is(UopSplitType.VEC_S_LDST) {
1798c4501a6fSZiyue-Zhang      /*
1799c4501a6fSZiyue-Zhang      FMV.D.X
1800c4501a6fSZiyue-Zhang       */
1801c4501a6fSZiyue-Zhang      csBundle(0).srcType(0) := SrcType.reg
1802c4501a6fSZiyue-Zhang      csBundle(0).srcType(1) := SrcType.imm
1803c4501a6fSZiyue-Zhang      csBundle(0).lsrc(1) := 0.U
1804c8cff56fSsinsanction      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1805964d9a87SZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1806964d9a87SZiyue Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.i2Vec(2, 0), e64)
1807c4501a6fSZiyue-Zhang      csBundle(0).rfWen := false.B
1808c8cff56fSsinsanction      csBundle(0).fpWen := false.B
1809c8cff56fSsinsanction      csBundle(0).vecWen := true.B
181031c51290Szhanglinjuan      csBundle(0).vlsInstr := true.B
1811c4501a6fSZiyue-Zhang
18126a926cf7SXuan Hu      csBundle(1).srcType(0) := SrcType.reg
18136a926cf7SXuan Hu      csBundle(1).srcType(1) := SrcType.imm
1814e25c13faSXuan Hu      csBundle(1).lsrc(0) := latchedInst.lsrc(1)
18156a926cf7SXuan Hu      csBundle(1).lsrc(1) := 0.U
1816c8cff56fSsinsanction      csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
1817964d9a87SZiyue Zhang      csBundle(1).fuType := FuType.i2v.U
1818964d9a87SZiyue Zhang      csBundle(1).fuOpType := Cat(IF2VectorType.i2Vec(2, 0), e64)
1819c4501a6fSZiyue-Zhang      csBundle(1).rfWen := false.B
1820c8cff56fSsinsanction      csBundle(1).fpWen := false.B
1821c8cff56fSsinsanction      csBundle(1).vecWen := true.B
182231c51290Szhanglinjuan      csBundle(1).vlsInstr := true.B
1823c4501a6fSZiyue-Zhang
1824c4501a6fSZiyue-Zhang      //LMUL
1825c4501a6fSZiyue-Zhang      for (i <- 0 until MAX_VLMUL) {
1826c8cff56fSsinsanction        csBundle(i + 2).srcType(0) := SrcType.vp
1827c8cff56fSsinsanction        csBundle(i + 2).srcType(1) := SrcType.vp
1828c8cff56fSsinsanction        csBundle(i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
1829c8cff56fSsinsanction        csBundle(i + 2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
18304dfab1f2Szhanglinjuan        csBundle(i + 2).lsrc(2) := dest + i.U // old vd
1831c4501a6fSZiyue-Zhang        csBundle(i + 2).ldest := dest + i.U
1832c4501a6fSZiyue-Zhang        csBundle(i + 2).uopIdx := i.U
183331c51290Szhanglinjuan        csBundle(i + 2).vlsInstr := true.B
1834c4501a6fSZiyue-Zhang      }
18354aa00286SXuan Hu      csBundle.head.waitForward := isSdSegment
18364aa00286SXuan Hu      csBundle(numOfUop - 1.U).blockBackward := isSdSegment
1837c4501a6fSZiyue-Zhang    }
1838c4501a6fSZiyue-Zhang    is(UopSplitType.VEC_I_LDST) {
18392de01baaSZiyue Zhang      def genCsBundle_SEGMENT_INDEXED_LOADSTORE(lmul:Int, nf:Int): Unit ={
184055f7bedaSZiyue Zhang        for (i <- 0 until MAX_VLMUL) {
18412de01baaSZiyue Zhang          val vecWen = if (i < lmul * nf) true.B else false.B
18422de01baaSZiyue Zhang          val src2Type = if (i < lmul * nf) SrcType.vp else SrcType.no
1843c8cff56fSsinsanction          csBundle(i + 1).srcType(0) := SrcType.vp
1844c8cff56fSsinsanction          csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
18452de01baaSZiyue Zhang          csBundle(i + 1).srcType(1) := SrcType.no
184655f7bedaSZiyue Zhang          csBundle(i + 1).lsrc(1) := src2 + i.U
18472de01baaSZiyue Zhang          csBundle(i + 1).srcType(2) := src2Type
18482de01baaSZiyue Zhang          csBundle(i + 1).lsrc(2) := dest + i.U
184955f7bedaSZiyue Zhang          csBundle(i + 1).ldest := dest + i.U
18502de01baaSZiyue Zhang          csBundle(i + 1).rfWen := false.B
18512de01baaSZiyue Zhang          csBundle(i + 1).fpWen := false.B
18522de01baaSZiyue Zhang          csBundle(i + 1).vecWen := vecWen
185355f7bedaSZiyue Zhang          csBundle(i + 1).uopIdx := i.U
185455f7bedaSZiyue Zhang          csBundle(i + 1).vlsInstr := true.B
185555f7bedaSZiyue Zhang        }
185655f7bedaSZiyue Zhang      }
18572de01baaSZiyue Zhang      def genCsBundle_SEGMENT_INDEXED_LOADSTORE_SRC1(emul:Int): Unit ={
18582de01baaSZiyue Zhang        for (i <- 0 until MAX_VLMUL) {
18592de01baaSZiyue Zhang          val src1Type = if (i < emul) SrcType.vp else SrcType.no
18602de01baaSZiyue Zhang          csBundle(i + 1).srcType(1) := src1Type
18612de01baaSZiyue Zhang          csBundle(i + 1).lsrc(1) := src2 + i.U
18622de01baaSZiyue Zhang        }
18632de01baaSZiyue Zhang      }
186455f7bedaSZiyue Zhang
18650cd00663SzhanglyGit      val vlmul = vlmulReg
18660cd00663SzhanglyGit      val vsew = Cat(0.U(1.W), vsewReg)
18670cd00663SzhanglyGit      val veew = Cat(0.U(1.W), width)
1868c4501a6fSZiyue-Zhang      val vemul: UInt = veew.asUInt + 1.U + vlmul.asUInt + ~vsew.asUInt
1869e3da8badSTang Haojin      val simple_lmul = MuxLookup(vlmul, 0.U(2.W))(Seq(
1870c4501a6fSZiyue-Zhang        "b001".U -> 1.U,
1871c4501a6fSZiyue-Zhang        "b010".U -> 2.U,
1872c4501a6fSZiyue-Zhang        "b011".U -> 3.U
1873c4501a6fSZiyue-Zhang      ))
1874e3da8badSTang Haojin      val simple_emul = MuxLookup(vemul, 0.U(2.W))(Seq(
1875c4501a6fSZiyue-Zhang        "b001".U -> 1.U,
1876c4501a6fSZiyue-Zhang        "b010".U -> 2.U,
1877c4501a6fSZiyue-Zhang        "b011".U -> 3.U
1878c4501a6fSZiyue-Zhang      ))
1879c4501a6fSZiyue-Zhang      csBundle(0).srcType(0) := SrcType.reg
1880c4501a6fSZiyue-Zhang      csBundle(0).srcType(1) := SrcType.imm
1881c4501a6fSZiyue-Zhang      csBundle(0).lsrc(1) := 0.U
1882c8cff56fSsinsanction      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1883964d9a87SZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1884964d9a87SZiyue Zhang      csBundle(0).fuOpType := Cat(IF2VectorType.i2Vec(2, 0), e64)
1885c4501a6fSZiyue-Zhang      csBundle(0).rfWen := false.B
1886c8cff56fSsinsanction      csBundle(0).fpWen := false.B
1887c8cff56fSsinsanction      csBundle(0).vecWen := true.B
188831c51290Szhanglinjuan      csBundle(0).vlsInstr := true.B
1889c4501a6fSZiyue-Zhang
1890c4501a6fSZiyue-Zhang      //LMUL
189155f7bedaSZiyue Zhang      when(nf === 0.U) {
189255f7bedaSZiyue Zhang        for (i <- 0 until MAX_VLMUL) {
189355f7bedaSZiyue Zhang          indexedLSRegOffset(i).src := Cat(simple_emul, simple_lmul)
1894c4501a6fSZiyue-Zhang          val offsetVs2 = indexedLSRegOffset(i).outOffsetVs2
1895c4501a6fSZiyue-Zhang          val offsetVd = indexedLSRegOffset(i).outOffsetVd
1896c8cff56fSsinsanction          csBundle(i + 1).srcType(0) := SrcType.vp
1897c8cff56fSsinsanction          csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
1898c4501a6fSZiyue-Zhang          csBundle(i + 1).lsrc(1) := Mux1H(UIntToOH(offsetVs2, MAX_VLMUL), (0 until MAX_VLMUL).map(j => src2 + j.U))
1899792b1339SAnzooooo          csBundle(i + 1).srcType(2) := SrcType.vp
190055f7bedaSZiyue Zhang          // lsrc2 is old vd
1901792b1339SAnzooooo          csBundle(i + 1).lsrc(2) := Mux1H(UIntToOH(offsetVd, MAX_VLMUL), (0 until MAX_VLMUL).map(j => dest + j.U))
1902c4501a6fSZiyue-Zhang          csBundle(i + 1).ldest := Mux1H(UIntToOH(offsetVd, MAX_VLMUL), (0 until MAX_VLMUL).map(j => dest + j.U))
1903c4501a6fSZiyue-Zhang          csBundle(i + 1).uopIdx := i.U
190431c51290Szhanglinjuan          csBundle(i + 1).vlsInstr := true.B
1905c4501a6fSZiyue-Zhang        }
190655f7bedaSZiyue Zhang      }.otherwise{
190755f7bedaSZiyue Zhang        // nf > 1, is segment indexed load/store
19082de01baaSZiyue Zhang        // gen src0, vd
19092de01baaSZiyue Zhang        switch(simple_lmul) {
19102de01baaSZiyue Zhang          is(0.U) {
19112de01baaSZiyue Zhang            switch(nf) {
19122de01baaSZiyue Zhang              is(1.U) {
19132de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(1, 2)
191455f7bedaSZiyue Zhang              }
19152de01baaSZiyue Zhang              is(2.U) {
19162de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(1, 3)
191755f7bedaSZiyue Zhang              }
19182de01baaSZiyue Zhang              is(3.U) {
19192de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(1, 4)
19202de01baaSZiyue Zhang              }
19212de01baaSZiyue Zhang              is(4.U) {
19222de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(1, 5)
19232de01baaSZiyue Zhang              }
19242de01baaSZiyue Zhang              is(5.U) {
19252de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(1, 6)
19262de01baaSZiyue Zhang              }
19272de01baaSZiyue Zhang              is(6.U) {
19282de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(1, 7)
19292de01baaSZiyue Zhang              }
19302de01baaSZiyue Zhang              is(7.U) {
19312de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(1, 8)
19322de01baaSZiyue Zhang              }
19332de01baaSZiyue Zhang            }
19342de01baaSZiyue Zhang          }
19352de01baaSZiyue Zhang          is(1.U) {
19362de01baaSZiyue Zhang            switch(nf) {
19372de01baaSZiyue Zhang              is(1.U) {
19382de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(2, 2)
19392de01baaSZiyue Zhang              }
19402de01baaSZiyue Zhang              is(2.U) {
19412de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(2, 3)
19422de01baaSZiyue Zhang              }
19432de01baaSZiyue Zhang              is(3.U) {
19442de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(2, 4)
19452de01baaSZiyue Zhang              }
19462de01baaSZiyue Zhang            }
19472de01baaSZiyue Zhang          }
19482de01baaSZiyue Zhang          is(2.U) {
19492de01baaSZiyue Zhang            switch(nf) {
19502de01baaSZiyue Zhang              is(1.U) {
19512de01baaSZiyue Zhang                genCsBundle_SEGMENT_INDEXED_LOADSTORE(4, 2)
19522de01baaSZiyue Zhang              }
19532de01baaSZiyue Zhang            }
19542de01baaSZiyue Zhang          }
19552de01baaSZiyue Zhang        }
19562de01baaSZiyue Zhang
19572de01baaSZiyue Zhang        // gen src1
19582de01baaSZiyue Zhang        switch(simple_emul) {
19592de01baaSZiyue Zhang          is(0.U) {
19602de01baaSZiyue Zhang            genCsBundle_SEGMENT_INDEXED_LOADSTORE_SRC1(1)
19612de01baaSZiyue Zhang          }
19622de01baaSZiyue Zhang          is(1.U) {
19632de01baaSZiyue Zhang            genCsBundle_SEGMENT_INDEXED_LOADSTORE_SRC1(2)
19642de01baaSZiyue Zhang          }
19652de01baaSZiyue Zhang          is(2.U) {
19662de01baaSZiyue Zhang            genCsBundle_SEGMENT_INDEXED_LOADSTORE_SRC1(4)
19672de01baaSZiyue Zhang          }
19682de01baaSZiyue Zhang          is(3.U) {
19692de01baaSZiyue Zhang            genCsBundle_SEGMENT_INDEXED_LOADSTORE_SRC1(8)
197055f7bedaSZiyue Zhang          }
197155f7bedaSZiyue Zhang        }
19727635b2a1SZiyue Zhang
19737635b2a1SZiyue Zhang        // when is vstore instructions, not set vecwen
19747635b2a1SZiyue Zhang        when(isVstore) {
19757635b2a1SZiyue Zhang          for (i <- 0 until MAX_VLMUL) {
19767635b2a1SZiyue Zhang            csBundle(i + 1).vecWen := false.B
19777635b2a1SZiyue Zhang          }
19787635b2a1SZiyue Zhang        }
197955f7bedaSZiyue Zhang      }
19804aa00286SXuan Hu      csBundle.head.waitForward := isIxSegment
19814aa00286SXuan Hu      csBundle(numOfUop - 1.U).blockBackward := isIxSegment
1982c4501a6fSZiyue-Zhang    }
1983d91483a6Sfdy  }
1984d91483a6Sfdy
1985d91483a6Sfdy  //readyFromRename Counter
1986d9cc7216Sxiaofeibao-xjtu  val readyCounter = Mux(outReadys.head, RenameWidth.U, 0.U)
1987e25c13faSXuan Hu
1988e25c13faSXuan Hu  // The left uops of the complex inst in ComplexDecoder can be send out this cycle
1989e25c13faSXuan Hu  val thisAllOut = uopRes <= readyCounter
1990d91483a6Sfdy
1991c7ca40e4SGuanghui Cheng  val count = RegInit(0.U(log2Up(maxUopSize/RenameWidth + 1).W))
1992c7ca40e4SGuanghui Cheng  val countNext = WireInit(count)
1993c7ca40e4SGuanghui Cheng
1994189ec863SzhanglyGit  switch(state) {
1995e25c13faSXuan Hu    is(s_idle) {
1996e25c13faSXuan Hu      when (inValid) {
1997e25c13faSXuan Hu        stateNext := s_active
1998e25c13faSXuan Hu        uopResNext := inUopInfo.numOfUop
1999c7ca40e4SGuanghui Cheng        countNext := 0.U
2000d91483a6Sfdy      }
2001e25c13faSXuan Hu    }
2002e25c13faSXuan Hu    is(s_active) {
2003e25c13faSXuan Hu      when (thisAllOut) {
2004e25c13faSXuan Hu        when (inValid) {
2005e25c13faSXuan Hu          stateNext := s_active
2006e25c13faSXuan Hu          uopResNext := inUopInfo.numOfUop
2007e25c13faSXuan Hu        }.otherwise {
2008e25c13faSXuan Hu          stateNext := s_idle
2009e25c13faSXuan Hu          uopResNext := 0.U
2010e25c13faSXuan Hu        }
2011c7ca40e4SGuanghui Cheng        countNext := 0.U
2012e25c13faSXuan Hu      }.otherwise {
2013e25c13faSXuan Hu        stateNext := s_active
2014e25c13faSXuan Hu        uopResNext := uopRes - readyCounter
2015c7ca40e4SGuanghui Cheng        countNext := count + outReadys.head.asUInt
2016e25c13faSXuan Hu      }
2017d91483a6Sfdy    }
2018d91483a6Sfdy  }
2019d91483a6Sfdy
2020e25c13faSXuan Hu  state := Mux(io.redirect, s_idle, stateNext)
2021e25c13faSXuan Hu  uopRes := Mux(io.redirect, 0.U, uopResNext)
2022c7ca40e4SGuanghui Cheng  count := Mux(io.redirect, 0.U, countNext)
2023189ec863SzhanglyGit
2024e25c13faSXuan Hu  val complexNum = Mux(uopRes > readyCounter, readyCounter, uopRes)
2025d91483a6Sfdy
20268e59a3a7SXuan Hu  fixedDecodedInst := csBundle
20278e59a3a7SXuan Hu
20288e59a3a7SXuan Hu  // when vstart is not zero, the last uop will modify vstart to zero
20298e59a3a7SXuan Hu  // therefore, blockback and flush pipe
20308e59a3a7SXuan Hu  fixedDecodedInst(numOfUop - 1.U).flushPipe := (vstartReg =/= 0.U) || latchedInst.flushPipe
2031c7ca40e4SGuanghui Cheng  val uopsSeq = (0 until RenameWidth).map(i => VecInit(fixedDecodedInst.zipWithIndex.filter(_._2 % RenameWidth == i).map(_._1)))
2032f7fe02a8Sjunxiong-ji
2033f7fe02a8Sjunxiong-ji  /** Generate output insts and valid signals */
2034d91483a6Sfdy  for(i <- 0 until RenameWidth) {
2035e25c13faSXuan Hu    outValids(i) := complexNum > i.U
2036c7ca40e4SGuanghui Cheng    outDecodedInsts(i) := uopsSeq(i)(count)
2037d91483a6Sfdy  }
2038d91483a6Sfdy
2039f7fe02a8Sjunxiong-ji  /** Generate number of valid output insts */
2040e25c13faSXuan Hu  outComplexNum := Mux(state === s_active, complexNum, 0.U)
2041e25c13faSXuan Hu  inReady := state === s_idle || state === s_active && thisAllOut
2042d91483a6Sfdy
2043ddc88dadSxiaofeibao
20443e10d835SXuan Hu  XSError(inValid && inUopInfo.numOfUop === 0.U,
20453e10d835SXuan Hu    p"uop number ${inUopInfo.numOfUop} is illegal, cannot be zero")
2046e25c13faSXuan Hu//  val validSimple = Wire(Vec(DecodeWidth, Bool()))
2047e25c13faSXuan Hu//  validSimple.zip(io.validFromIBuf.zip(io.isComplex)).map{ case (dst, (src1, src2)) => dst := src1 && !src2 }
2048e25c13faSXuan Hu//  val notInf = Wire(Vec(DecodeWidth, Bool()))
2049e25c13faSXuan Hu//  notInf.drop(1).zip(io.validFromIBuf.drop(1).zip(validSimple.drop(1))).map{ case (dst, (src1, src2)) => dst := !src1 || src2 }
2050e25c13faSXuan Hu//  notInf(0) := !io.validFromIBuf(0) || validSimple(0) || (io.isComplex(0) && io.in0pc === io.simple.decodedInst.pc)
2051e25c13faSXuan Hu//  val notInfVec = Wire(Vec(DecodeWidth, Bool()))
2052e25c13faSXuan Hu//  notInfVec.zipWithIndex.map{ case (dst, i) => dst := Cat(notInf.take(i + 1)).andR}
2053e25c13faSXuan Hu//
2054e25c13faSXuan Hu//  complexNum := Mux(io.validFromIBuf(0) && readyCounter.orR ,
2055e25c13faSXuan Hu//    Mux(uopRes0 > readyCounter, readyCounter, uopRes0),
2056e25c13faSXuan Hu//    0.U)
2057e25c13faSXuan Hu//  validToRename.zipWithIndex.foreach{
2058e25c13faSXuan Hu//    case(dst, i) =>
2059e25c13faSXuan Hu//      val validFix = Mux(complexNum.orR, validSimple((i+1).U - complexNum), validSimple(i))
2060e25c13faSXuan Hu//      dst := MuxCase(false.B, Seq(
2061e25c13faSXuan Hu//        (io.validFromIBuf(0) && readyCounter.orR && uopRes0 > readyCounter) -> Mux(readyCounter > i.U, true.B, false.B),
2062e25c13faSXuan Hu//        (io.validFromIBuf(0) && readyCounter.orR && !(uopRes0 > readyCounter)) -> Mux(complexNum > i.U, true.B, validFix && notInfVec(i.U - complexNum) && io.readyFromRename(i)),
2063e25c13faSXuan Hu//      ).toSeq)
2064e25c13faSXuan Hu//  }
2065e25c13faSXuan Hu//
2066e25c13faSXuan Hu//  readyToIBuf.zipWithIndex.foreach {
2067e25c13faSXuan Hu//    case (dst, i) =>
2068e25c13faSXuan Hu//      val readyToIBuf0 = Mux(io.isComplex(0), io.in0pc === io.simple.decodedInst.pc, true.B)
2069e25c13faSXuan Hu//      dst := MuxCase(true.B, Seq(
2070e25c13faSXuan Hu//        (io.validFromIBuf(0) && uopRes0 > readyCounter || !readyCounter.orR) -> false.B,
2071e25c13faSXuan Hu//        (io.validFromIBuf(0) && !(uopRes0 > readyCounter) && readyCounter.orR) -> (if (i==0) readyToIBuf0 else Mux(RenameWidth.U - complexNum >= i.U, notInfVec(i) && validSimple(i) && io.readyFromRename(i), false.B))
2072e25c13faSXuan Hu//      ).toSeq)
2073e25c13faSXuan Hu//  }
2074e25c13faSXuan Hu//
2075e25c13faSXuan Hu//  io.deq.decodedInsts := decodedInsts
2076e25c13faSXuan Hu//  io.deq.complexNum := complexNum
2077e25c13faSXuan Hu//  io.deq.validToRename := validToRename
2078e25c13faSXuan Hu//  io.deq.readyToIBuf := readyToIBuf
2079d91483a6Sfdy}
2080