xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnitComp.scala (revision d6059658a09c2758219a05d5226c63b4159ed3f0)
1d91483a6Sfdy/***************************************************************************************
2d91483a6Sfdy  * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3d91483a6Sfdy  * Copyright (c) 2020-2021 Peng Cheng Laboratory
4d91483a6Sfdy  *
5d91483a6Sfdy  * XiangShan is licensed under Mulan PSL v2.
6d91483a6Sfdy  * You can use this software according to the terms and conditions of the Mulan PSL v2.
7d91483a6Sfdy  * You may obtain a copy of Mulan PSL v2 at:
8d91483a6Sfdy  *          http://license.coscl.org.cn/MulanPSL2
9d91483a6Sfdy  *
10d91483a6Sfdy  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11d91483a6Sfdy  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12d91483a6Sfdy  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13d91483a6Sfdy  *
14d91483a6Sfdy  * See the Mulan PSL v2 for more details.
15d91483a6Sfdy  ***************************************************************************************/
16d91483a6Sfdy
17d91483a6Sfdypackage xiangshan.backend.decode
18d91483a6Sfdy
1983ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
20d91483a6Sfdyimport chisel3._
21d91483a6Sfdyimport chisel3.util._
22d91483a6Sfdyimport freechips.rocketchip.rocket.Instructions
23d91483a6Sfdyimport freechips.rocketchip.util.uintToBitPat
24d91483a6Sfdyimport utils._
25d91483a6Sfdyimport utility._
26d91483a6Sfdyimport xiangshan.ExceptionNO.illegalInstr
27d91483a6Sfdyimport xiangshan._
28d91483a6Sfdyimport xiangshan.backend.fu.fpu.FPU
29d91483a6Sfdyimport xiangshan.backend.fu.FuType
30d91483a6Sfdyimport freechips.rocketchip.rocket.Instructions._
31d91483a6Sfdyimport xiangshan.backend.Bundles.{DecodedInst, StaticInst}
3298cfe81bSxgkiriimport xiangshan.backend.decode.isa.bitfield.XSInstBitFields
33582849ffSxiaofeibao-xjtuimport xiangshan.backend.fu.vector.Bundles.{VSew, VType, VLmul}
34d91483a6Sfdyimport yunsuan.VpermType
35d91483a6Sfdy
36d91483a6Sfdyimport scala.collection.Seq
37d91483a6Sfdy
38d91483a6Sfdytrait VectorConstants {
39d91483a6Sfdy  val MAX_VLMUL = 8
40d91483a6Sfdy  val FP_TMP_REG_MV = 32
41189ec863SzhanglyGit  val VECTOR_TMP_REG_LMUL = 33 // 33~47  ->  15
42d91483a6Sfdy}
43d91483a6Sfdy
44d91483a6Sfdyclass DecodeUnitCompIO(implicit p: Parameters) extends XSBundle {
45aaa08c5aSxiaofeibao-xjtu  val simple = new Bundle {
46aaa08c5aSxiaofeibao-xjtu    val decodedInst = Input(new DecodedInst)
47aaa08c5aSxiaofeibao-xjtu    val isComplex = Input(Bool())
48aaa08c5aSxiaofeibao-xjtu    val uopInfo = Input(new UopInfo)
49aaa08c5aSxiaofeibao-xjtu  }
50d91483a6Sfdy  val vtype = Input(new VType)
51aaa08c5aSxiaofeibao-xjtu  val in0pc = Input(UInt(VAddrBits.W))
52aaa08c5aSxiaofeibao-xjtu  val isComplex = Input(Vec(DecodeWidth, Bool()))
53d91483a6Sfdy  val validFromIBuf = Input(Vec(DecodeWidth, Bool()))
54d91483a6Sfdy  val readyFromRename = Input(Vec(RenameWidth, Bool()))
55d91483a6Sfdy  val deq = new Bundle {
56d91483a6Sfdy    val decodedInsts = Output(Vec(RenameWidth, new DecodedInst))
57d91483a6Sfdy    val isVset = Output(Bool())
58d91483a6Sfdy    val readyToIBuf = Output(Vec(DecodeWidth, Bool()))
59d91483a6Sfdy    val validToRename = Output(Vec(RenameWidth, Bool()))
60d91483a6Sfdy    val complexNum = Output(UInt(3.W))
61d91483a6Sfdy  }
62d91483a6Sfdy  val csrCtrl = Input(new CustomCSRCtrlIO)
63d91483a6Sfdy}
6417ec87f2SXuan Hu
65d91483a6Sfdy/**
66d91483a6Sfdy  * @author zly
67d91483a6Sfdy  */
68d91483a6Sfdyclass DecodeUnitComp()(implicit p : Parameters) extends XSModule with DecodeUnitConstants with VectorConstants {
69d91483a6Sfdy  val io = IO(new DecodeUnitCompIO)
70d91483a6Sfdy
71d91483a6Sfdy  val maxUopSize = MaxUopSize
72d91483a6Sfdy  //input bits
73aaa08c5aSxiaofeibao-xjtu  private val inst: XSInstBitFields = io.simple.decodedInst.instr.asTypeOf(new XSInstBitFields)
74d91483a6Sfdy
7598cfe81bSxgkiri  val src1 = Cat(0.U(1.W), inst.RS1)
7698cfe81bSxgkiri  val src2 = Cat(0.U(1.W), inst.RS2)
7798cfe81bSxgkiri  val dest = Cat(0.U(1.W), inst.RD)
787f9f0a79SzhanglyGit
79d91483a6Sfdy
80d91483a6Sfdy  //output bits
81d91483a6Sfdy  val decodedInsts = Wire(Vec(RenameWidth, new DecodedInst))
82d91483a6Sfdy  val validToRename = Wire(Vec(RenameWidth, Bool()))
83d91483a6Sfdy  val readyToIBuf = Wire(Vec(DecodeWidth, Bool()))
84d91483a6Sfdy  val complexNum = Wire(UInt(3.W))
85d91483a6Sfdy
86d91483a6Sfdy  //output of DecodeUnit
87189ec863SzhanglyGit  val decodedInstsSimple = Wire(new DecodedInst)
887f9f0a79SzhanglyGit  val numOfUop = Wire(UInt(log2Up(maxUopSize+1).W))
897f9f0a79SzhanglyGit  val lmul = Wire(UInt(4.W))
90189ec863SzhanglyGit  val isVsetSimple = Wire(Bool())
91d91483a6Sfdy
92d91483a6Sfdy  //pre decode
93aaa08c5aSxiaofeibao-xjtu  decodedInstsSimple := io.simple.decodedInst
94aaa08c5aSxiaofeibao-xjtu  lmul := io.simple.uopInfo.lmul
95aaa08c5aSxiaofeibao-xjtu  isVsetSimple := io.simple.decodedInst.isVset
96aaa08c5aSxiaofeibao-xjtu  val vlmulReg = io.simple.decodedInst.vpu.vlmul
97aaa08c5aSxiaofeibao-xjtu  val vsewReg = io.simple.decodedInst.vpu.vsew
98189ec863SzhanglyGit  when(isVsetSimple) {
99d91483a6Sfdy    when(dest === 0.U && src1 === 0.U) {
100aaa08c5aSxiaofeibao-xjtu      decodedInstsSimple.fuOpType := VSETOpType.keepVl(io.simple.decodedInst.fuOpType)
101d91483a6Sfdy    }.elsewhen(src1 === 0.U) {
102aaa08c5aSxiaofeibao-xjtu      decodedInstsSimple.fuOpType := VSETOpType.setVlmax(io.simple.decodedInst.fuOpType)
103a8db15d8Sfdy    }
104a8db15d8Sfdy    when(io.vtype.illegal){
105189ec863SzhanglyGit      decodedInstsSimple.flushPipe := true.B
106d91483a6Sfdy    }
107d91483a6Sfdy  }
108d91483a6Sfdy  //Type of uop Div
109189ec863SzhanglyGit  val typeOfSplit = decodedInstsSimple.uopSplitType
110*d6059658SZiyue Zhang  val src1Type = decodedInstsSimple.srcType(0)
111*d6059658SZiyue Zhang  val src1IsImm = src1Type === SrcType.imm
112d91483a6Sfdy
1137f9f0a79SzhanglyGit  when(typeOfSplit === UopSplitType.DIR) {
1147f9f0a79SzhanglyGit    numOfUop := Mux(dest =/= 0.U, 2.U,
115d91483a6Sfdy      Mux(src1 =/= 0.U, 1.U,
1167f9f0a79SzhanglyGit        Mux(VSETOpType.isVsetvl(decodedInstsSimple.fuOpType), 2.U, 1.U)))
1177f9f0a79SzhanglyGit  } .otherwise {
118aaa08c5aSxiaofeibao-xjtu    numOfUop := io.simple.uopInfo.numOfUop
1197f9f0a79SzhanglyGit  }
1207f9f0a79SzhanglyGit
121d91483a6Sfdy
122d91483a6Sfdy  //uop div up to maxUopSize
123d91483a6Sfdy  val csBundle = Wire(Vec(maxUopSize, new DecodedInst))
124d91483a6Sfdy  csBundle.map { case dst =>
125189ec863SzhanglyGit    dst := decodedInstsSimple
126d91483a6Sfdy    dst.firstUop := false.B
127d91483a6Sfdy    dst.lastUop := false.B
128d91483a6Sfdy  }
129d91483a6Sfdy
130f1e8fcb2SXuan Hu  csBundle(0).numUops := numOfUop
131d91483a6Sfdy  csBundle(0).firstUop := true.B
132d91483a6Sfdy  csBundle(numOfUop - 1.U).lastUop := true.B
133d91483a6Sfdy
134189ec863SzhanglyGit  switch(typeOfSplit) {
13517ec87f2SXuan Hu    is(UopSplitType.DIR) {
136189ec863SzhanglyGit      when(isVsetSimple) {
137d91483a6Sfdy        when(dest =/= 0.U) {
138d91483a6Sfdy          csBundle(0).fuType := FuType.vsetiwi.U
139189ec863SzhanglyGit          csBundle(0).fuOpType := VSETOpType.switchDest(decodedInstsSimple.fuOpType)
140d91483a6Sfdy          csBundle(0).flushPipe := false.B
141d91483a6Sfdy          csBundle(0).rfWen := true.B
142d91483a6Sfdy          csBundle(0).vecWen := false.B
143cb10a55bSXuan Hu          csBundle(1).ldest := VCONFIG_IDX.U
144fe60541bSXuan Hu          csBundle(1).rfWen := false.B
145fe60541bSXuan Hu          csBundle(1).vecWen := true.B
146d91483a6Sfdy        }.elsewhen(src1 =/= 0.U) {
147cb10a55bSXuan Hu          csBundle(0).ldest := VCONFIG_IDX.U
148189ec863SzhanglyGit        }.elsewhen(VSETOpType.isVsetvli(decodedInstsSimple.fuOpType)) {
149d91483a6Sfdy          csBundle(0).fuType := FuType.vsetfwf.U
150d91483a6Sfdy          csBundle(0).srcType(0) := SrcType.vp
151cb10a55bSXuan Hu          csBundle(0).lsrc(0) := VCONFIG_IDX.U
152189ec863SzhanglyGit        }.elsewhen(VSETOpType.isVsetvl(decodedInstsSimple.fuOpType)) {
153d91483a6Sfdy          csBundle(0).srcType(0) := SrcType.reg
154d91483a6Sfdy          csBundle(0).srcType(1) := SrcType.imm
155d91483a6Sfdy          csBundle(0).lsrc(1) := 0.U
156d91483a6Sfdy          csBundle(0).ldest := FP_TMP_REG_MV.U
157d91483a6Sfdy          csBundle(0).fuType := FuType.i2f.U
158d91483a6Sfdy          csBundle(0).rfWen := false.B
159d91483a6Sfdy          csBundle(0).fpWen := true.B
160d91483a6Sfdy          csBundle(0).vecWen := false.B
161d91483a6Sfdy          csBundle(0).fpu.isAddSub := false.B
162d91483a6Sfdy          csBundle(0).fpu.typeTagIn := FPU.D
163d91483a6Sfdy          csBundle(0).fpu.typeTagOut := FPU.D
164d91483a6Sfdy          csBundle(0).fpu.fromInt := true.B
165d91483a6Sfdy          csBundle(0).fpu.wflags := false.B
166d91483a6Sfdy          csBundle(0).fpu.fpWen := true.B
167d91483a6Sfdy          csBundle(0).fpu.div := false.B
168d91483a6Sfdy          csBundle(0).fpu.sqrt := false.B
169d91483a6Sfdy          csBundle(0).fpu.fcvt := false.B
170d91483a6Sfdy          csBundle(0).flushPipe := false.B
171d91483a6Sfdy          csBundle(1).fuType := FuType.vsetfwf.U
172d91483a6Sfdy          csBundle(1).srcType(0) := SrcType.vp
173cb10a55bSXuan Hu          csBundle(1).lsrc(0) := VCONFIG_IDX.U
174d91483a6Sfdy          csBundle(1).srcType(1) := SrcType.fp
175d91483a6Sfdy          csBundle(1).lsrc(1) := FP_TMP_REG_MV.U
176cb10a55bSXuan Hu          csBundle(1).ldest := VCONFIG_IDX.U
177d91483a6Sfdy        }
178d91483a6Sfdy      }
179d91483a6Sfdy    }
18017ec87f2SXuan Hu    is(UopSplitType.VEC_VVV) {
181d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
182d91483a6Sfdy        csBundle(i).lsrc(0) := src1 + i.U
183d91483a6Sfdy        csBundle(i).lsrc(1) := src2 + i.U
184d91483a6Sfdy        csBundle(i).lsrc(2) := dest + i.U
185d91483a6Sfdy        csBundle(i).ldest := dest + i.U
186d91483a6Sfdy        csBundle(i).uopIdx := i.U
187d91483a6Sfdy      }
188d91483a6Sfdy    }
189684d7aceSxiaofeibao-xjtu    is(UopSplitType.VEC_VFV) {
190684d7aceSxiaofeibao-xjtu      for (i <- 0 until MAX_VLMUL) {
191684d7aceSxiaofeibao-xjtu        csBundle(i).lsrc(1) := src2 + i.U
192684d7aceSxiaofeibao-xjtu        csBundle(i).lsrc(2) := dest + i.U
193684d7aceSxiaofeibao-xjtu        csBundle(i).ldest := dest + i.U
194684d7aceSxiaofeibao-xjtu        csBundle(i).uopIdx := i.U
195684d7aceSxiaofeibao-xjtu      }
196684d7aceSxiaofeibao-xjtu    }
19717ec87f2SXuan Hu    is(UopSplitType.VEC_EXT2) {
198d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
199d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + i.U
200d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
201d91483a6Sfdy        csBundle(2 * i).ldest := dest + (2 * i).U
202d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
203d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
204d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
205d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
206d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
207d91483a6Sfdy      }
208d91483a6Sfdy    }
20917ec87f2SXuan Hu    is(UopSplitType.VEC_EXT4) {
210d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 4) {
211d91483a6Sfdy        csBundle(4 * i).lsrc(1) := src2 + i.U
212d91483a6Sfdy        csBundle(4 * i).lsrc(2) := dest + (4 * i).U
213d91483a6Sfdy        csBundle(4 * i).ldest := dest + (4 * i).U
214d91483a6Sfdy        csBundle(4 * i).uopIdx := (4 * i).U
215d91483a6Sfdy        csBundle(4 * i + 1).lsrc(1) := src2 + i.U
216d91483a6Sfdy        csBundle(4 * i + 1).lsrc(2) := dest + (4 * i + 1).U
217d91483a6Sfdy        csBundle(4 * i + 1).ldest := dest + (4 * i + 1).U
218d91483a6Sfdy        csBundle(4 * i + 1).uopIdx := (4 * i + 1).U
219d91483a6Sfdy        csBundle(4 * i + 2).lsrc(1) := src2 + i.U
220d91483a6Sfdy        csBundle(4 * i + 2).lsrc(2) := dest + (4 * i + 2).U
221d91483a6Sfdy        csBundle(4 * i + 2).ldest := dest + (4 * i + 2).U
222d91483a6Sfdy        csBundle(4 * i + 2).uopIdx := (4 * i + 2).U
223d91483a6Sfdy        csBundle(4 * i + 3).lsrc(1) := src2 + i.U
224d91483a6Sfdy        csBundle(4 * i + 3).lsrc(2) := dest + (4 * i + 3).U
225d91483a6Sfdy        csBundle(4 * i + 3).ldest := dest + (4 * i + 3).U
226d91483a6Sfdy        csBundle(4 * i + 3).uopIdx := (4 * i + 3).U
227d91483a6Sfdy      }
228d91483a6Sfdy    }
22917ec87f2SXuan Hu    is(UopSplitType.VEC_EXT8) {
230d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
231d91483a6Sfdy        csBundle(i).lsrc(1) := src2
232d91483a6Sfdy        csBundle(i).lsrc(2) := dest + i.U
233d91483a6Sfdy        csBundle(i).ldest := dest + i.U
234d91483a6Sfdy        csBundle(i).uopIdx := i.U
235d91483a6Sfdy      }
236d91483a6Sfdy    }
23717ec87f2SXuan Hu    is(UopSplitType.VEC_0XV) {
238d91483a6Sfdy      /*
239d91483a6Sfdy      FMV.D.X
240d91483a6Sfdy       */
241d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
242d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
243d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
244d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
245d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
246d91483a6Sfdy      csBundle(0).rfWen := false.B
247d91483a6Sfdy      csBundle(0).fpWen := true.B
248d91483a6Sfdy      csBundle(0).vecWen := false.B
249d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
250d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
251d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
252d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
253d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
254d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
255d91483a6Sfdy      csBundle(0).fpu.div := false.B
256d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
257d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
258d91483a6Sfdy      /*
259d91483a6Sfdy      vfmv.s.f
260d91483a6Sfdy       */
261d91483a6Sfdy      csBundle(1).srcType(0) := SrcType.fp
262d91483a6Sfdy      csBundle(1).srcType(1) := SrcType.vp
263d91483a6Sfdy      csBundle(1).srcType(2) := SrcType.vp
264d91483a6Sfdy      csBundle(1).lsrc(0) := FP_TMP_REG_MV.U
265d91483a6Sfdy      csBundle(1).lsrc(1) := 0.U
266d91483a6Sfdy      csBundle(1).lsrc(2) := dest
267d91483a6Sfdy      csBundle(1).ldest := dest
268d91483a6Sfdy      csBundle(1).fuType := FuType.vppu.U
26917ec87f2SXuan Hu      csBundle(1).fuOpType := VpermType.dummy
270d91483a6Sfdy      csBundle(1).rfWen := false.B
271d91483a6Sfdy      csBundle(1).fpWen := false.B
272d91483a6Sfdy      csBundle(1).vecWen := true.B
273d91483a6Sfdy    }
27417ec87f2SXuan Hu    is(UopSplitType.VEC_VXV) {
275d91483a6Sfdy      /*
276*d6059658SZiyue Zhang      i to vector move
277d91483a6Sfdy       */
278d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
279d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
280d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
281fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
282fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
283*d6059658SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.imm2vector(2, 0), IF2VectorType.i2vector(2, 0)), vsewReg)
284fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
285fc85f18fSZiyue Zhang      /*
286fc85f18fSZiyue Zhang      LMUL
287fc85f18fSZiyue Zhang       */
288fc85f18fSZiyue Zhang      for (i <- 0 until MAX_VLMUL) {
289fc85f18fSZiyue Zhang        csBundle(i + 1).srcType(0) := SrcType.vp
290fc85f18fSZiyue Zhang        csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
291d91483a6Sfdy        csBundle(i + 1).lsrc(1) := src2 + i.U
292d91483a6Sfdy        csBundle(i + 1).lsrc(2) := dest + i.U
293d91483a6Sfdy        csBundle(i + 1).ldest := dest + i.U
294d91483a6Sfdy        csBundle(i + 1).uopIdx := i.U
295d91483a6Sfdy      }
296d91483a6Sfdy    }
29717ec87f2SXuan Hu    is(UopSplitType.VEC_VVW) {
298d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
299d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src1 + i.U
300d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + i.U
301d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
302d91483a6Sfdy        csBundle(2 * i).ldest := dest + (2 * i).U
303d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
304d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1 + i.U
305d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
306d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
307d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
308d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
309d91483a6Sfdy      }
310d91483a6Sfdy    }
3113748ec56Sxiaofeibao-xjtu    is(UopSplitType.VEC_VFW) {
3123748ec56Sxiaofeibao-xjtu      for (i <- 0 until MAX_VLMUL / 2) {
3133748ec56Sxiaofeibao-xjtu        csBundle(2 * i).lsrc(0) := src1
3143748ec56Sxiaofeibao-xjtu        csBundle(2 * i).lsrc(1) := src2 + i.U
3153748ec56Sxiaofeibao-xjtu        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
3163748ec56Sxiaofeibao-xjtu        csBundle(2 * i).ldest := dest + (2 * i).U
3173748ec56Sxiaofeibao-xjtu        csBundle(2 * i).uopIdx := (2 * i).U
3183748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).lsrc(0) := src1
3193748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
3203748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
3213748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
3223748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
3233748ec56Sxiaofeibao-xjtu      }
3243748ec56Sxiaofeibao-xjtu    }
32517ec87f2SXuan Hu    is(UopSplitType.VEC_WVW) {
326d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
327d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src1 + i.U
328d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + (2 * i).U
329d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
330d91483a6Sfdy        csBundle(2 * i).ldest := dest + (2 * i).U
331d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
332d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1 + i.U
333d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U
334d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
335d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
336d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
337d91483a6Sfdy      }
338d91483a6Sfdy    }
33917ec87f2SXuan Hu    is(UopSplitType.VEC_VXW) {
340d91483a6Sfdy      /*
341*d6059658SZiyue Zhang      i to vector move
342d91483a6Sfdy       */
343d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
344d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
345d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
346fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
347fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
348fc85f18fSZiyue Zhang      csBundle(0).fuOpType := vsewReg
349fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
350d91483a6Sfdy
351d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
352fc85f18fSZiyue Zhang        csBundle(2 * i + 1).srcType(0) := SrcType.vp
353fc85f18fSZiyue Zhang        csBundle(2 * i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
354d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
355d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U
356d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i).U
357d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
358fc85f18fSZiyue Zhang        csBundle(2 * i + 2).srcType(0) := SrcType.vp
359fc85f18fSZiyue Zhang        csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
360d91483a6Sfdy        csBundle(2 * i + 2).lsrc(1) := src2 + i.U
361d91483a6Sfdy        csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U
362d91483a6Sfdy        csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U
363d91483a6Sfdy        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
364d91483a6Sfdy      }
365d91483a6Sfdy    }
36617ec87f2SXuan Hu    is(UopSplitType.VEC_WXW) {
367d91483a6Sfdy      /*
368*d6059658SZiyue Zhang      i to vector move
369d91483a6Sfdy       */
370d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
371d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
372d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
373fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
374fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
375fc85f18fSZiyue Zhang      csBundle(0).fuOpType := vsewReg
376fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
377d91483a6Sfdy
378d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
379fc85f18fSZiyue Zhang        csBundle(2 * i + 1).srcType(0) := SrcType.vp
380fc85f18fSZiyue Zhang        csBundle(2 * i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
381d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U
382d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U
383d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i).U
384d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
385fc85f18fSZiyue Zhang        csBundle(2 * i + 2).srcType(0) := SrcType.vp
386fc85f18fSZiyue Zhang        csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
387d91483a6Sfdy        csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U
388d91483a6Sfdy        csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U
389d91483a6Sfdy        csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U
390d91483a6Sfdy        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
391d91483a6Sfdy      }
392d91483a6Sfdy    }
39317ec87f2SXuan Hu    is(UopSplitType.VEC_WVV) {
394d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
395d91483a6Sfdy
396d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src1 + i.U
397d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + (2 * i).U
398d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + i.U
399d6f9198fSXuan Hu        csBundle(2 * i).ldest := dest + i.U
400d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
401d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1 + i.U
402d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U
403d6f9198fSXuan Hu        csBundle(2 * i + 1).lsrc(2) := dest + i.U
404d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + i.U
405d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
406d91483a6Sfdy      }
407d91483a6Sfdy    }
4083748ec56Sxiaofeibao-xjtu    is(UopSplitType.VEC_WFW) {
4093748ec56Sxiaofeibao-xjtu      for (i <- 0 until MAX_VLMUL / 2) {
4103748ec56Sxiaofeibao-xjtu        csBundle(2 * i).lsrc(0) := src1
4113748ec56Sxiaofeibao-xjtu        csBundle(2 * i).lsrc(1) := src2 + (2 * i).U
4123748ec56Sxiaofeibao-xjtu        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
4133748ec56Sxiaofeibao-xjtu        csBundle(2 * i).ldest := dest + (2 * i).U
4143748ec56Sxiaofeibao-xjtu        csBundle(2 * i).uopIdx := (2 * i).U
4153748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).lsrc(0) := src1
4163748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U
4173748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
4183748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
4193748ec56Sxiaofeibao-xjtu        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
4203748ec56Sxiaofeibao-xjtu      }
4213748ec56Sxiaofeibao-xjtu    }
42217ec87f2SXuan Hu    is(UopSplitType.VEC_WXV) {
423d91483a6Sfdy      /*
424*d6059658SZiyue Zhang      i to vector move
425d91483a6Sfdy       */
426d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
427d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
428d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
429fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
430fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
431*d6059658SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.imm2vector(2, 0), IF2VectorType.i2vector(2, 0)), vsewReg)
432fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
433d91483a6Sfdy
434d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
435fc85f18fSZiyue Zhang        csBundle(2 * i + 1).srcType(0) := SrcType.vp
436fc85f18fSZiyue Zhang        csBundle(2 * i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
437d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U
438d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + i.U
439d6f9198fSXuan Hu        csBundle(2 * i + 1).ldest := dest + i.U
440d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
441fc85f18fSZiyue Zhang        csBundle(2 * i + 2).srcType(0) := SrcType.vp
442fc85f18fSZiyue Zhang        csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
443d91483a6Sfdy        csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U
444d6f9198fSXuan Hu        csBundle(2 * i + 2).lsrc(2) := dest + i.U
445d91483a6Sfdy        csBundle(2 * i + 2).ldest := dest + i.U
446d91483a6Sfdy        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
447d91483a6Sfdy      }
448d91483a6Sfdy    }
44917ec87f2SXuan Hu    is(UopSplitType.VEC_VVM) {
450d91483a6Sfdy      csBundle(0).lsrc(2) := dest
451d6f9198fSXuan Hu      csBundle(0).ldest := dest
452d91483a6Sfdy      csBundle(0).uopIdx := 0.U
453d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
454d91483a6Sfdy        csBundle(i).lsrc(0) := src1 + i.U
455d91483a6Sfdy        csBundle(i).lsrc(1) := src2 + i.U
456d6f9198fSXuan Hu        csBundle(i).lsrc(2) := dest
457d6f9198fSXuan Hu        csBundle(i).ldest := dest
458d91483a6Sfdy        csBundle(i).uopIdx := i.U
459d91483a6Sfdy      }
460d91483a6Sfdy    }
461f06d6d60Sxiaofeibao-xjtu    is(UopSplitType.VEC_VFM) {
462f06d6d60Sxiaofeibao-xjtu      csBundle(0).lsrc(2) := dest
463f06d6d60Sxiaofeibao-xjtu      csBundle(0).ldest := dest
464f06d6d60Sxiaofeibao-xjtu      csBundle(0).uopIdx := 0.U
465f06d6d60Sxiaofeibao-xjtu      for (i <- 1 until MAX_VLMUL) {
466f06d6d60Sxiaofeibao-xjtu        csBundle(i).lsrc(0) := src1
467f06d6d60Sxiaofeibao-xjtu        csBundle(i).lsrc(1) := src2 + i.U
468f06d6d60Sxiaofeibao-xjtu        csBundle(i).lsrc(2) := dest
469f06d6d60Sxiaofeibao-xjtu        csBundle(i).ldest := dest
470f06d6d60Sxiaofeibao-xjtu        csBundle(i).uopIdx := i.U
471f06d6d60Sxiaofeibao-xjtu      }
472f06d6d60Sxiaofeibao-xjtu      csBundle(numOfUop - 1.U).ldest := dest
473f06d6d60Sxiaofeibao-xjtu    }
47417ec87f2SXuan Hu    is(UopSplitType.VEC_VXM) {
475d91483a6Sfdy      /*
476*d6059658SZiyue Zhang      i to vector move
477d91483a6Sfdy       */
478d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
479d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
480d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
481fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
482fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
483*d6059658SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.imm2vector(2, 0), IF2VectorType.i2vector(2, 0)), vsewReg)
484fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
485d91483a6Sfdy      //LMUL
486fc85f18fSZiyue Zhang      csBundle(1).srcType(0) := SrcType.vp
487fc85f18fSZiyue Zhang      csBundle(1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
488d91483a6Sfdy      csBundle(1).lsrc(2) := dest
489d6f9198fSXuan Hu      csBundle(1).ldest := dest
490d91483a6Sfdy      csBundle(1).uopIdx := 0.U
491d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
492fc85f18fSZiyue Zhang        csBundle(i + 1).srcType(0) := SrcType.vp
493fc85f18fSZiyue Zhang        csBundle(i + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
494d91483a6Sfdy        csBundle(i + 1).lsrc(1) := src2 + i.U
495d6f9198fSXuan Hu        csBundle(i + 1).lsrc(2) := dest
496d6f9198fSXuan Hu        csBundle(i + 1).ldest := dest
497d91483a6Sfdy        csBundle(i + 1).uopIdx := i.U
498d91483a6Sfdy      }
499d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest
500d91483a6Sfdy    }
50117ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDE1UP) {
502d91483a6Sfdy      /*
503*d6059658SZiyue Zhang      i to vector move
504d91483a6Sfdy       */
505d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
506d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
507d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
508fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
509fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
510fc85f18fSZiyue Zhang      csBundle(0).fuOpType := vsewReg
511fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
512d91483a6Sfdy      //LMUL
513fc85f18fSZiyue Zhang      csBundle(1).srcType(0) := SrcType.vp
514fc85f18fSZiyue Zhang      csBundle(1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
515d91483a6Sfdy      csBundle(1).lsrc(2) := dest
516d91483a6Sfdy      csBundle(1).ldest := dest
517d91483a6Sfdy      csBundle(1).uopIdx := 0.U
518d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
519d91483a6Sfdy        csBundle(i + 1).srcType(0) := SrcType.vp
520d91483a6Sfdy        csBundle(i + 1).lsrc(0) := src2 + (i - 1).U
521d91483a6Sfdy        csBundle(i + 1).lsrc(1) := src2 + i.U
522d91483a6Sfdy        csBundle(i + 1).lsrc(2) := dest + i.U
523d91483a6Sfdy        csBundle(i + 1).ldest := dest + i.U
524d91483a6Sfdy        csBundle(i + 1).uopIdx := i.U
525d91483a6Sfdy      }
526d91483a6Sfdy    }
52717ec87f2SXuan Hu    is(UopSplitType.VEC_FSLIDE1UP) {
528d91483a6Sfdy      //LMUL
529d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.fp
530d91483a6Sfdy      csBundle(0).lsrc(0) := src1
531d91483a6Sfdy      csBundle(0).lsrc(1) := src2
532d91483a6Sfdy      csBundle(0).lsrc(2) := dest
533d91483a6Sfdy      csBundle(0).ldest := dest
534d91483a6Sfdy      csBundle(0).uopIdx := 0.U
535d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
536d91483a6Sfdy        csBundle(i).srcType(0) := SrcType.vp
537d91483a6Sfdy        csBundle(i).lsrc(0) := src2 + (i - 1).U
538d91483a6Sfdy        csBundle(i).lsrc(1) := src2 + i.U
539d91483a6Sfdy        csBundle(i).lsrc(2) := dest + i.U
540d91483a6Sfdy        csBundle(i).ldest := dest + i.U
541d91483a6Sfdy        csBundle(i).uopIdx := i.U
542d91483a6Sfdy      }
543d91483a6Sfdy    }
54417ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDE1DOWN) { // lmul+lmul = 16
545d91483a6Sfdy      /*
546*d6059658SZiyue Zhang      i to vector move
547d91483a6Sfdy       */
548d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
549d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
550d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
551fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
552fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
553fc85f18fSZiyue Zhang      csBundle(0).fuOpType := vsewReg
554fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
555d91483a6Sfdy      //LMUL
556d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
557d91483a6Sfdy        csBundle(2 * i + 1).srcType(0) := SrcType.vp
558d91483a6Sfdy        csBundle(2 * i + 1).srcType(1) := SrcType.vp
559d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src2 + (i + 1).U
560d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
561d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + i.U
562fc85f18fSZiyue Zhang        csBundle(2 * i + 1).ldest := VECTOR_TMP_REG_LMUL.U + 1.U
563d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
564d91483a6Sfdy        if (2 * i + 2 < MAX_VLMUL * 2) {
565fc85f18fSZiyue Zhang          csBundle(2 * i + 2).srcType(0) := SrcType.vp
566fc85f18fSZiyue Zhang          csBundle(2 * i + 2).lsrc(0) := VECTOR_TMP_REG_LMUL.U
567d91483a6Sfdy          // csBundle(2 * i + 2).lsrc(1) := src2 + i.U         // DontCare
568fc85f18fSZiyue Zhang          csBundle(2 * i + 2).lsrc(2) := VECTOR_TMP_REG_LMUL.U + 1.U
569d91483a6Sfdy          csBundle(2 * i + 2).ldest := dest + i.U
570d91483a6Sfdy          csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
571d91483a6Sfdy        }
572d91483a6Sfdy      }
5738cbcda9aSZiyue Zhang      csBundle(numOfUop - 1.U).srcType(0) := SrcType.vp
5748cbcda9aSZiyue Zhang      csBundle(numOfUop - 1.U).lsrc(0) := VECTOR_TMP_REG_LMUL.U
575d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U
576d91483a6Sfdy    }
57717ec87f2SXuan Hu    is(UopSplitType.VEC_FSLIDE1DOWN) {
578d91483a6Sfdy      //LMUL
579d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
580d91483a6Sfdy        csBundle(2 * i).srcType(0) := SrcType.vp
581d91483a6Sfdy        csBundle(2 * i).srcType(1) := SrcType.vp
582d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src2 + (i + 1).U
583d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + i.U
584d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + i.U
585d91483a6Sfdy        csBundle(2 * i).ldest := VECTOR_TMP_REG_LMUL.U
586d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
587d91483a6Sfdy        csBundle(2 * i + 1).srcType(0) := SrcType.fp
588d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1
589d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := VECTOR_TMP_REG_LMUL.U
590d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + i.U
591d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
592d91483a6Sfdy      }
593d91483a6Sfdy      csBundle(numOfUop - 1.U).srcType(0) := SrcType.fp
594d91483a6Sfdy      csBundle(numOfUop - 1.U).lsrc(0) := src1
595d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U
596d91483a6Sfdy    }
59717ec87f2SXuan Hu    is(UopSplitType.VEC_VRED) {
598aaa08c5aSxiaofeibao-xjtu      when(vlmulReg === "b001".U) {
599d91483a6Sfdy        csBundle(0).srcType(2) := SrcType.DC
600d91483a6Sfdy        csBundle(0).lsrc(0) := src2 + 1.U
601d91483a6Sfdy        csBundle(0).lsrc(1) := src2
602d91483a6Sfdy        csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
603d91483a6Sfdy        csBundle(0).uopIdx := 0.U
604d91483a6Sfdy      }
605aaa08c5aSxiaofeibao-xjtu      when(vlmulReg === "b010".U) {
606d91483a6Sfdy        csBundle(0).srcType(2) := SrcType.DC
607d91483a6Sfdy        csBundle(0).lsrc(0) := src2 + 1.U
608d91483a6Sfdy        csBundle(0).lsrc(1) := src2
609d91483a6Sfdy        csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
610d91483a6Sfdy        csBundle(0).uopIdx := 0.U
611d91483a6Sfdy
612d91483a6Sfdy        csBundle(1).srcType(2) := SrcType.DC
613d91483a6Sfdy        csBundle(1).lsrc(0) := src2 + 3.U
614d91483a6Sfdy        csBundle(1).lsrc(1) := src2 + 2.U
615d91483a6Sfdy        csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
616d91483a6Sfdy        csBundle(1).uopIdx := 1.U
617d91483a6Sfdy
618d91483a6Sfdy        csBundle(2).srcType(2) := SrcType.DC
619d91483a6Sfdy        csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
620d91483a6Sfdy        csBundle(2).lsrc(1) := VECTOR_TMP_REG_LMUL.U
621d91483a6Sfdy        csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
622d91483a6Sfdy        csBundle(2).uopIdx := 2.U
623d91483a6Sfdy      }
624aaa08c5aSxiaofeibao-xjtu      when(vlmulReg === "b011".U) {
625d91483a6Sfdy        for (i <- 0 until MAX_VLMUL) {
626d91483a6Sfdy          if (i < MAX_VLMUL - MAX_VLMUL / 2) {
627d91483a6Sfdy            csBundle(i).lsrc(0) := src2 + (i * 2 + 1).U
628d91483a6Sfdy            csBundle(i).lsrc(1) := src2 + (i * 2).U
629d91483a6Sfdy            csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
630d91483a6Sfdy          } else if (i < MAX_VLMUL - MAX_VLMUL / 4) {
631d91483a6Sfdy            csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2 + 1).U
632d91483a6Sfdy            csBundle(i).lsrc(1) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2).U
633d91483a6Sfdy            csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
634d91483a6Sfdy          } else if (i < MAX_VLMUL - MAX_VLMUL / 8) {
635d91483a6Sfdy            csBundle(6).lsrc(0) := (VECTOR_TMP_REG_LMUL + 5).U
636d91483a6Sfdy            csBundle(6).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U
637d91483a6Sfdy            csBundle(6).ldest := (VECTOR_TMP_REG_LMUL + 6).U
638d91483a6Sfdy          }
639d91483a6Sfdy          csBundle(i).srcType(2) := SrcType.DC
640d91483a6Sfdy          csBundle(i).uopIdx := i.U
641d91483a6Sfdy        }
642d91483a6Sfdy      }
643aaa08c5aSxiaofeibao-xjtu      when(vlmulReg.orR) {
644d91483a6Sfdy        csBundle(numOfUop - 1.U).srcType(2) := SrcType.vp
645d91483a6Sfdy        csBundle(numOfUop - 1.U).lsrc(0) := src1
646d91483a6Sfdy        csBundle(numOfUop - 1.U).lsrc(1) := VECTOR_TMP_REG_LMUL.U + numOfUop - 2.U
647d91483a6Sfdy        csBundle(numOfUop - 1.U).lsrc(2) := dest
648d91483a6Sfdy        csBundle(numOfUop - 1.U).ldest := dest
649d91483a6Sfdy        csBundle(numOfUop - 1.U).uopIdx := numOfUop - 1.U
650d91483a6Sfdy      }
651d91483a6Sfdy    }
652582849ffSxiaofeibao-xjtu    is(UopSplitType.VEC_VFRED) {
653aaa08c5aSxiaofeibao-xjtu      val vlmul = vlmulReg
654aaa08c5aSxiaofeibao-xjtu      val vsew = vsewReg
655582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.m8){
656582849ffSxiaofeibao-xjtu        for (i <- 0 until 4) {
657582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(0) := src2 + (i * 2 + 1).U
658582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(1) := src2 + (i * 2).U
659582849ffSxiaofeibao-xjtu          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
660582849ffSxiaofeibao-xjtu          csBundle(i).uopIdx := i.U
661582849ffSxiaofeibao-xjtu        }
662582849ffSxiaofeibao-xjtu        for (i <- 4 until 6) {
663582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + (i - 4) * 2 + 1).U
664582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(1) := (VECTOR_TMP_REG_LMUL + (i - 4) * 2).U
665582849ffSxiaofeibao-xjtu          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
666582849ffSxiaofeibao-xjtu          csBundle(i).uopIdx := i.U
667582849ffSxiaofeibao-xjtu        }
668582849ffSxiaofeibao-xjtu        csBundle(6).lsrc(0) := (VECTOR_TMP_REG_LMUL + 5).U
669582849ffSxiaofeibao-xjtu        csBundle(6).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U
670582849ffSxiaofeibao-xjtu        csBundle(6).ldest := (VECTOR_TMP_REG_LMUL + 6).U
671582849ffSxiaofeibao-xjtu        csBundle(6).uopIdx := 6.U
672582849ffSxiaofeibao-xjtu        when(vsew === VSew.e64) {
673582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(0) := (VECTOR_TMP_REG_LMUL + 6).U
674582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(1) := (VECTOR_TMP_REG_LMUL + 6).U
675582849ffSxiaofeibao-xjtu          csBundle(7).ldest := (VECTOR_TMP_REG_LMUL + 7).U
676582849ffSxiaofeibao-xjtu          csBundle(7).vpu.fpu.isFoldTo1_2 := true.B
677582849ffSxiaofeibao-xjtu          csBundle(7).uopIdx := 7.U
678582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(0) := src1
679582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(1) := (VECTOR_TMP_REG_LMUL + 7).U
680582849ffSxiaofeibao-xjtu          csBundle(8).ldest := dest
681582849ffSxiaofeibao-xjtu          csBundle(8).uopIdx := 8.U
682582849ffSxiaofeibao-xjtu        }
683582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
684582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(0) := (VECTOR_TMP_REG_LMUL + 6).U
685582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(1) := (VECTOR_TMP_REG_LMUL + 6).U
686582849ffSxiaofeibao-xjtu          csBundle(7).ldest := (VECTOR_TMP_REG_LMUL + 7).U
687582849ffSxiaofeibao-xjtu          csBundle(7).vpu.fpu.isFoldTo1_2 := true.B
688582849ffSxiaofeibao-xjtu          csBundle(7).uopIdx := 7.U
689582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(0) := (VECTOR_TMP_REG_LMUL + 7).U
690582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(1) := (VECTOR_TMP_REG_LMUL + 7).U
691582849ffSxiaofeibao-xjtu          csBundle(8).ldest := (VECTOR_TMP_REG_LMUL + 8).U
692582849ffSxiaofeibao-xjtu          csBundle(8).vpu.fpu.isFoldTo1_4 := true.B
693582849ffSxiaofeibao-xjtu          csBundle(8).uopIdx := 8.U
694582849ffSxiaofeibao-xjtu          csBundle(9).lsrc(0) := src1
695582849ffSxiaofeibao-xjtu          csBundle(9).lsrc(1) := (VECTOR_TMP_REG_LMUL + 8).U
696582849ffSxiaofeibao-xjtu          csBundle(9).ldest := dest
697582849ffSxiaofeibao-xjtu          csBundle(9).uopIdx := 9.U
698582849ffSxiaofeibao-xjtu        }
699582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
700582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(0) := (VECTOR_TMP_REG_LMUL + 6).U
701582849ffSxiaofeibao-xjtu          csBundle(7).lsrc(1) := (VECTOR_TMP_REG_LMUL + 6).U
702582849ffSxiaofeibao-xjtu          csBundle(7).ldest := (VECTOR_TMP_REG_LMUL + 7).U
703582849ffSxiaofeibao-xjtu          csBundle(7).vpu.fpu.isFoldTo1_2 := true.B
704582849ffSxiaofeibao-xjtu          csBundle(7).uopIdx := 7.U
705582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(0) := (VECTOR_TMP_REG_LMUL + 7).U
706582849ffSxiaofeibao-xjtu          csBundle(8).lsrc(1) := (VECTOR_TMP_REG_LMUL + 7).U
707582849ffSxiaofeibao-xjtu          csBundle(8).ldest := (VECTOR_TMP_REG_LMUL + 8).U
708582849ffSxiaofeibao-xjtu          csBundle(8).vpu.fpu.isFoldTo1_4 := true.B
709582849ffSxiaofeibao-xjtu          csBundle(8).uopIdx := 8.U
710582849ffSxiaofeibao-xjtu          csBundle(9).lsrc(0) := (VECTOR_TMP_REG_LMUL + 8).U
711582849ffSxiaofeibao-xjtu          csBundle(9).lsrc(1) := (VECTOR_TMP_REG_LMUL + 8).U
712582849ffSxiaofeibao-xjtu          csBundle(9).ldest := (VECTOR_TMP_REG_LMUL + 9).U
713582849ffSxiaofeibao-xjtu          csBundle(9).vpu.fpu.isFoldTo1_8 := true.B
714582849ffSxiaofeibao-xjtu          csBundle(9).uopIdx := 9.U
715582849ffSxiaofeibao-xjtu          csBundle(10).lsrc(0) := src1
716582849ffSxiaofeibao-xjtu          csBundle(10).lsrc(1) := (VECTOR_TMP_REG_LMUL + 9).U
717582849ffSxiaofeibao-xjtu          csBundle(10).ldest := dest
718582849ffSxiaofeibao-xjtu          csBundle(10).uopIdx := 10.U
719582849ffSxiaofeibao-xjtu        }
720582849ffSxiaofeibao-xjtu      }
721582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.m4) {
722582849ffSxiaofeibao-xjtu        for (i <- 0 until 2) {
723582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(0) := src2 + (i * 2 + 1).U
724582849ffSxiaofeibao-xjtu          csBundle(i).lsrc(1) := src2 + (i * 2).U
725582849ffSxiaofeibao-xjtu          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
726582849ffSxiaofeibao-xjtu          csBundle(i).uopIdx := i.U
727582849ffSxiaofeibao-xjtu        }
728582849ffSxiaofeibao-xjtu        csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
729582849ffSxiaofeibao-xjtu        csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
730582849ffSxiaofeibao-xjtu        csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
731582849ffSxiaofeibao-xjtu        csBundle(2).uopIdx := 2.U
732582849ffSxiaofeibao-xjtu        when(vsew === VSew.e64) {
733582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := (VECTOR_TMP_REG_LMUL + 2).U
734582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
735582849ffSxiaofeibao-xjtu          csBundle(3).ldest := (VECTOR_TMP_REG_LMUL + 3).U
736582849ffSxiaofeibao-xjtu          csBundle(3).vpu.fpu.isFoldTo1_2 := true.B
737582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
738582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(0) := src1
739582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(1) := (VECTOR_TMP_REG_LMUL + 3).U
740582849ffSxiaofeibao-xjtu          csBundle(4).ldest := dest
741582849ffSxiaofeibao-xjtu          csBundle(4).uopIdx := 4.U
742582849ffSxiaofeibao-xjtu        }
743582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
744582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := (VECTOR_TMP_REG_LMUL + 2).U
745582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
746582849ffSxiaofeibao-xjtu          csBundle(3).ldest := (VECTOR_TMP_REG_LMUL + 3).U
747582849ffSxiaofeibao-xjtu          csBundle(3).vpu.fpu.isFoldTo1_2 := true.B
748582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
749582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(0) := (VECTOR_TMP_REG_LMUL + 3).U
750582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(1) := (VECTOR_TMP_REG_LMUL + 3).U
751582849ffSxiaofeibao-xjtu          csBundle(4).ldest := (VECTOR_TMP_REG_LMUL + 4).U
752582849ffSxiaofeibao-xjtu          csBundle(4).vpu.fpu.isFoldTo1_4 := true.B
753582849ffSxiaofeibao-xjtu          csBundle(4).uopIdx := 4.U
754582849ffSxiaofeibao-xjtu          csBundle(5).lsrc(0) := src1
755582849ffSxiaofeibao-xjtu          csBundle(5).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U
756582849ffSxiaofeibao-xjtu          csBundle(5).ldest := dest
757582849ffSxiaofeibao-xjtu          csBundle(5).uopIdx := 5.U
758582849ffSxiaofeibao-xjtu        }
759582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
760582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := (VECTOR_TMP_REG_LMUL + 2).U
761582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
762582849ffSxiaofeibao-xjtu          csBundle(3).ldest := (VECTOR_TMP_REG_LMUL + 3).U
763582849ffSxiaofeibao-xjtu          csBundle(3).vpu.fpu.isFoldTo1_2 := true.B
764582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
765582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(0) := (VECTOR_TMP_REG_LMUL + 3).U
766582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(1) := (VECTOR_TMP_REG_LMUL + 3).U
767582849ffSxiaofeibao-xjtu          csBundle(4).ldest := (VECTOR_TMP_REG_LMUL + 4).U
768582849ffSxiaofeibao-xjtu          csBundle(4).vpu.fpu.isFoldTo1_4 := true.B
769582849ffSxiaofeibao-xjtu          csBundle(4).uopIdx := 4.U
770582849ffSxiaofeibao-xjtu          csBundle(5).lsrc(0) := (VECTOR_TMP_REG_LMUL + 4).U
771582849ffSxiaofeibao-xjtu          csBundle(5).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U
772582849ffSxiaofeibao-xjtu          csBundle(5).ldest := (VECTOR_TMP_REG_LMUL + 5).U
773582849ffSxiaofeibao-xjtu          csBundle(5).vpu.fpu.isFoldTo1_8 := true.B
774582849ffSxiaofeibao-xjtu          csBundle(5).uopIdx := 5.U
775582849ffSxiaofeibao-xjtu          csBundle(6).lsrc(0) := src1
776582849ffSxiaofeibao-xjtu          csBundle(6).lsrc(1) := (VECTOR_TMP_REG_LMUL + 5).U
777582849ffSxiaofeibao-xjtu          csBundle(6).ldest := dest
778582849ffSxiaofeibao-xjtu          csBundle(6).uopIdx := 6.U
779582849ffSxiaofeibao-xjtu        }
780582849ffSxiaofeibao-xjtu      }
781582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.m2) {
782582849ffSxiaofeibao-xjtu        csBundle(0).lsrc(0) := src2 + 1.U
783582849ffSxiaofeibao-xjtu        csBundle(0).lsrc(1) := src2 + 0.U
784582849ffSxiaofeibao-xjtu        csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
785582849ffSxiaofeibao-xjtu        csBundle(0).uopIdx := 0.U
786582849ffSxiaofeibao-xjtu        when(vsew === VSew.e64) {
787582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
788582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
789582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
790582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_2 := true.B
791582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
792582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := src1
793582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
794582849ffSxiaofeibao-xjtu          csBundle(2).ldest := dest
795582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
796582849ffSxiaofeibao-xjtu        }
797582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
798582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
799582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
800582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
801582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_2 := true.B
802582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
803582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
804582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
805582849ffSxiaofeibao-xjtu          csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
806582849ffSxiaofeibao-xjtu          csBundle(2).vpu.fpu.isFoldTo1_4 := true.B
807582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
808582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := src1
809582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
810582849ffSxiaofeibao-xjtu          csBundle(3).ldest := dest
811582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
812582849ffSxiaofeibao-xjtu        }
813582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
814582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
815582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
816582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
817582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_2 := true.B
818582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
819582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
820582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
821582849ffSxiaofeibao-xjtu          csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
822582849ffSxiaofeibao-xjtu          csBundle(2).vpu.fpu.isFoldTo1_4 := true.B
823582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
824582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := (VECTOR_TMP_REG_LMUL + 2).U
825582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
826582849ffSxiaofeibao-xjtu          csBundle(3).ldest := (VECTOR_TMP_REG_LMUL + 3).U
827582849ffSxiaofeibao-xjtu          csBundle(3).vpu.fpu.isFoldTo1_8 := true.B
828582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
829582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(0) := src1
830582849ffSxiaofeibao-xjtu          csBundle(4).lsrc(1) := (VECTOR_TMP_REG_LMUL + 3).U
831582849ffSxiaofeibao-xjtu          csBundle(4).ldest := dest
832582849ffSxiaofeibao-xjtu          csBundle(4).uopIdx := 4.U
833582849ffSxiaofeibao-xjtu        }
834582849ffSxiaofeibao-xjtu      }
835582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.m1) {
836582849ffSxiaofeibao-xjtu        when(vsew === VSew.e64) {
837582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
838582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
839582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
840582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_2 := true.B
841582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
842582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := src1
843582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
844582849ffSxiaofeibao-xjtu          csBundle(1).ldest := dest
845582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
846582849ffSxiaofeibao-xjtu        }
847582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
848582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
849582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
850582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
851582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_2 := true.B
852582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
853582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
854582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
855582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
856582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_4 := true.B
857582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
858582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := src1
859582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
860582849ffSxiaofeibao-xjtu          csBundle(2).ldest := dest
861582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
862582849ffSxiaofeibao-xjtu        }
863582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
864582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
865582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
866582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
867582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_2 := true.B
868582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
869582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
870582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
871582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
872582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_4 := true.B
873582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
874582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
875582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
876582849ffSxiaofeibao-xjtu          csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
877582849ffSxiaofeibao-xjtu          csBundle(2).vpu.fpu.isFoldTo1_8 := true.B
878582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
879582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(0) := src1
880582849ffSxiaofeibao-xjtu          csBundle(3).lsrc(1) := (VECTOR_TMP_REG_LMUL + 2).U
881582849ffSxiaofeibao-xjtu          csBundle(3).ldest := dest
882582849ffSxiaofeibao-xjtu          csBundle(3).uopIdx := 3.U
883582849ffSxiaofeibao-xjtu        }
884582849ffSxiaofeibao-xjtu      }
885582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.mf2) {
886582849ffSxiaofeibao-xjtu        when(vsew === VSew.e32) {
887582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
888582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
889582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
890582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_4 := true.B
891582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
892582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := src1
893582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
894582849ffSxiaofeibao-xjtu          csBundle(1).ldest := dest
895582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
896582849ffSxiaofeibao-xjtu        }
897582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
898582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
899582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
900582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
901582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_4 := true.B
902582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
903582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := (VECTOR_TMP_REG_LMUL + 0).U
904582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
905582849ffSxiaofeibao-xjtu          csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
906582849ffSxiaofeibao-xjtu          csBundle(1).vpu.fpu.isFoldTo1_8 := true.B
907582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
908582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(0) := src1
909582849ffSxiaofeibao-xjtu          csBundle(2).lsrc(1) := (VECTOR_TMP_REG_LMUL + 1).U
910582849ffSxiaofeibao-xjtu          csBundle(2).ldest := dest
911582849ffSxiaofeibao-xjtu          csBundle(2).uopIdx := 2.U
912582849ffSxiaofeibao-xjtu        }
913582849ffSxiaofeibao-xjtu      }
914582849ffSxiaofeibao-xjtu      when(vlmul === VLmul.mf4) {
915582849ffSxiaofeibao-xjtu        when(vsew === VSew.e16) {
916582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(0) := src2
917582849ffSxiaofeibao-xjtu          csBundle(0).lsrc(1) := src2
918582849ffSxiaofeibao-xjtu          csBundle(0).ldest := (VECTOR_TMP_REG_LMUL + 0).U
919582849ffSxiaofeibao-xjtu          csBundle(0).vpu.fpu.isFoldTo1_8 := true.B
920582849ffSxiaofeibao-xjtu          csBundle(0).uopIdx := 0.U
921582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(0) := src1
922582849ffSxiaofeibao-xjtu          csBundle(1).lsrc(1) := (VECTOR_TMP_REG_LMUL + 0).U
923582849ffSxiaofeibao-xjtu          csBundle(1).ldest := dest
924582849ffSxiaofeibao-xjtu          csBundle(1).uopIdx := 1.U
925582849ffSxiaofeibao-xjtu        }
926582849ffSxiaofeibao-xjtu      }
927582849ffSxiaofeibao-xjtu    }
928d91483a6Sfdy
929b94b1889Sxiaofeibao-xjtu    is(UopSplitType.VEC_VFREDOSUM) {
930b94b1889Sxiaofeibao-xjtu      import yunsuan.VfaluType
931aaa08c5aSxiaofeibao-xjtu      val vlmul = vlmulReg
932aaa08c5aSxiaofeibao-xjtu      val vsew = vsewReg
933b94b1889Sxiaofeibao-xjtu      val isWiden = decodedInstsSimple.fuOpType === VfaluType.vfwredosum
934b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.m8) {
935b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e64) {
936b94b1889Sxiaofeibao-xjtu          val vlmax = 16
937b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
938b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
939b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 2 == 0) src2 + (i/2).U else VECTOR_TMP_REG_LMUL.U)
940b94b1889Sxiaofeibao-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)
941b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
942b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := (if (i % 2 == 0) false.B else true.B)
943b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
944b94b1889Sxiaofeibao-xjtu          }
945b94b1889Sxiaofeibao-xjtu        }
946b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
947b94b1889Sxiaofeibao-xjtu          val vlmax = 32
948b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
949b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
950b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
951b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 4 == 0) src2 + (i/4).U else if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
952b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
953b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := (if (i % 4 == 0) false.B else true.B)
954b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
955b94b1889Sxiaofeibao-xjtu          }
956b94b1889Sxiaofeibao-xjtu        }
957b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
958b94b1889Sxiaofeibao-xjtu          val vlmax = 64
959b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
960b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
961b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
962b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(2) := (if (i % 8 == 0) src2 + (i/8).U else if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
963b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
964b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := (if (i % 8 == 0) false.B else true.B)
965b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
966b94b1889Sxiaofeibao-xjtu          }
967b94b1889Sxiaofeibao-xjtu        }
968b94b1889Sxiaofeibao-xjtu      }
969b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.m4) {
970b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e64) {
971b94b1889Sxiaofeibao-xjtu          val vlmax = 8
972b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
973b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
974b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 2 == 0) src2 + (i/2).U else VECTOR_TMP_REG_LMUL.U)
975b94b1889Sxiaofeibao-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)
976b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
977b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := (if (i % 2 == 0) false.B else true.B)
978b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
979b94b1889Sxiaofeibao-xjtu          }
980b94b1889Sxiaofeibao-xjtu        }
981b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
982b94b1889Sxiaofeibao-xjtu          val vlmax = 16
983b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
984b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
985b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
986b94b1889Sxiaofeibao-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)
987b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
988b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := isWiden && (if (i % 4 == 0) false.B else true.B)
989b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := !isWiden && (if (i % 4 == 0) false.B else true.B)
990b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
991b94b1889Sxiaofeibao-xjtu          }
992b94b1889Sxiaofeibao-xjtu        }
993b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
994b94b1889Sxiaofeibao-xjtu          val vlmax = 32
995b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
996b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
997b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
998b94b1889Sxiaofeibao-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)
999b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1000b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1001b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1002b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1003b94b1889Sxiaofeibao-xjtu          }
1004b94b1889Sxiaofeibao-xjtu        }
1005b94b1889Sxiaofeibao-xjtu      }
1006b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.m2) {
1007b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e64) {
1008b94b1889Sxiaofeibao-xjtu          val vlmax = 4
1009b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1010b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1011b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 2 == 0) src2 + (i/2).U else VECTOR_TMP_REG_LMUL.U)
1012b94b1889Sxiaofeibao-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)
1013b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1014b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := (if (i % 2 == 0) false.B else true.B)
1015b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1016b94b1889Sxiaofeibao-xjtu          }
1017b94b1889Sxiaofeibao-xjtu        }
1018b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
1019b94b1889Sxiaofeibao-xjtu          val vlmax = 8
1020b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1021b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1022b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
1023b94b1889Sxiaofeibao-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)
1024b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1025b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := isWiden && (if (i % 4 == 0) false.B else true.B)
1026b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := !isWiden && (if (i % 4 == 0) false.B else true.B)
1027b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1028b94b1889Sxiaofeibao-xjtu          }
1029b94b1889Sxiaofeibao-xjtu        }
1030b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1031b94b1889Sxiaofeibao-xjtu          val vlmax = 16
1032b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1033b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1034b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
1035b94b1889Sxiaofeibao-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)
1036b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1037b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1038b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1039b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1040b94b1889Sxiaofeibao-xjtu          }
1041b94b1889Sxiaofeibao-xjtu        }
1042b94b1889Sxiaofeibao-xjtu      }
1043b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.m1) {
1044b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e64) {
1045b94b1889Sxiaofeibao-xjtu          val vlmax = 2
1046b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1047b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1048b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 2 == 0) src2 + (i/2).U else VECTOR_TMP_REG_LMUL.U)
1049b94b1889Sxiaofeibao-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)
1050b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1051b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := (if (i % 2 == 0) false.B else true.B)
1052b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1053b94b1889Sxiaofeibao-xjtu          }
1054b94b1889Sxiaofeibao-xjtu        }
1055b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
1056b94b1889Sxiaofeibao-xjtu          val vlmax = 4
1057b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1058b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1059b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
1060b94b1889Sxiaofeibao-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)
1061b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1062b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := isWiden && (if (i % 4 == 0) false.B else true.B)
1063b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := !isWiden && (if (i % 4 == 0) false.B else true.B)
1064b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1065b94b1889Sxiaofeibao-xjtu          }
1066b94b1889Sxiaofeibao-xjtu        }
1067b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1068b94b1889Sxiaofeibao-xjtu          val vlmax = 8
1069b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1070b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1071b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
1072b94b1889Sxiaofeibao-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)
1073b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1074b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1075b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1076b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1077b94b1889Sxiaofeibao-xjtu          }
1078b94b1889Sxiaofeibao-xjtu        }
1079b94b1889Sxiaofeibao-xjtu      }
1080b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.mf2) {
1081b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e32) {
1082b94b1889Sxiaofeibao-xjtu          val vlmax = 2
1083b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1084b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1085b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 4 == 0) src2 + (i/4).U else VECTOR_TMP_REG_LMUL.U)
1086b94b1889Sxiaofeibao-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)
1087b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1088b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_2 := isWiden && (if (i % 4 == 0) false.B else true.B)
1089b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := !isWiden && (if (i % 4 == 0) false.B else true.B)
1090b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1091b94b1889Sxiaofeibao-xjtu          }
1092b94b1889Sxiaofeibao-xjtu        }
1093b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1094b94b1889Sxiaofeibao-xjtu          val vlmax = 4
1095b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1096b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1097b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
1098b94b1889Sxiaofeibao-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)
1099b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1100b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1101b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1102b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1103b94b1889Sxiaofeibao-xjtu          }
1104b94b1889Sxiaofeibao-xjtu        }
1105b94b1889Sxiaofeibao-xjtu      }
1106b94b1889Sxiaofeibao-xjtu      when(vlmul === VLmul.mf4) {
1107b94b1889Sxiaofeibao-xjtu        when(vsew === VSew.e16) {
1108b94b1889Sxiaofeibao-xjtu          val vlmax = 2
1109b94b1889Sxiaofeibao-xjtu          for (i <- 0 until vlmax) {
1110b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(0) := (if (i == 0) src1 else VECTOR_TMP_REG_LMUL.U)
1111b94b1889Sxiaofeibao-xjtu            csBundle(i).lsrc(1) := (if (i % 8 == 0) src2 + (i/8).U else VECTOR_TMP_REG_LMUL.U)
1112b94b1889Sxiaofeibao-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)
1113b94b1889Sxiaofeibao-xjtu            csBundle(i).ldest := (if (i == vlmax - 1) dest else VECTOR_TMP_REG_LMUL.U)
1114b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_4 := isWiden && (if (i % 8 == 0) false.B else true.B)
1115b94b1889Sxiaofeibao-xjtu            csBundle(i).vpu.fpu.isFoldTo1_8 := !isWiden && (if (i % 8 == 0) false.B else true.B)
1116b94b1889Sxiaofeibao-xjtu            csBundle(i).uopIdx := i.U
1117b94b1889Sxiaofeibao-xjtu          }
1118b94b1889Sxiaofeibao-xjtu        }
1119b94b1889Sxiaofeibao-xjtu      }
1120b94b1889Sxiaofeibao-xjtu    }
1121*d6059658SZiyue Zhang
112217ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDEUP) {
1123*d6059658SZiyue Zhang      // i to vector move
1124d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
1125d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
1126d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
1127fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1128fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1129*d6059658SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.permImm2vector(2, 0), IF2VectorType.i2vector(2, 0)), vsewReg)
1130fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
1131d91483a6Sfdy      // LMUL
1132d91483a6Sfdy      for (i <- 0 until MAX_VLMUL)
1133d91483a6Sfdy        for (j <- 0 to i) {
11344ee69032SzhanglyGit          val old_vd = if (j == 0) {
11354ee69032SzhanglyGit            dest + i.U
1136fc85f18fSZiyue Zhang          } else (VECTOR_TMP_REG_LMUL + j).U
11374ee69032SzhanglyGit          val vd = if (j == i) {
11384ee69032SzhanglyGit            dest + i.U
1139fc85f18fSZiyue Zhang          } else (VECTOR_TMP_REG_LMUL + j + 1).U
1140fc85f18fSZiyue Zhang          csBundle(i * (i + 1) / 2 + j + 1).srcType(0) := SrcType.vp
1141fc85f18fSZiyue Zhang          csBundle(i * (i + 1) / 2 + j + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
1142d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).lsrc(1) := src2 + j.U
1143d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).lsrc(2) := old_vd
1144d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).ldest := vd
1145d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).uopIdx := (i * (i + 1) / 2 + j).U
1146d91483a6Sfdy        }
1147d91483a6Sfdy    }
1148d91483a6Sfdy
114917ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDEDOWN) {
1150*d6059658SZiyue Zhang      // i to vector move
1151d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
1152d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
1153d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
1154fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1155fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1156*d6059658SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.permImm2vector(2, 0), IF2VectorType.i2vector(2, 0)), vsewReg)
1157fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
1158d91483a6Sfdy      // LMUL
1159d91483a6Sfdy      for (i <- 0 until MAX_VLMUL)
1160d91483a6Sfdy        for (j <- (0 to i).reverse) {
1161d91483a6Sfdy          when(i.U < lmul) {
11624ee69032SzhanglyGit            val old_vd = if (j == 0) {
11634ee69032SzhanglyGit              dest + lmul - 1.U - i.U
1164fc85f18fSZiyue Zhang            } else (VECTOR_TMP_REG_LMUL + j).U
11654ee69032SzhanglyGit            val vd = if (j == i) {
11664ee69032SzhanglyGit              dest + lmul - 1.U - i.U
1167fc85f18fSZiyue Zhang            } else (VECTOR_TMP_REG_LMUL + j + 1).U
1168fc85f18fSZiyue Zhang            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).srcType(0) := SrcType.vp
1169fc85f18fSZiyue Zhang            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(0) := VECTOR_TMP_REG_LMUL.U
1170d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(1) := src2 + lmul - 1.U - j.U
1171d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(2) := old_vd
1172d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).ldest := vd
1173d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).uopIdx := numOfUop - (i * (i + 1) / 2 + i - j + 2).U
1174d91483a6Sfdy          }
1175d91483a6Sfdy        }
1176d91483a6Sfdy    }
1177d91483a6Sfdy
117817ec87f2SXuan Hu    is(UopSplitType.VEC_M0X) {
1179d91483a6Sfdy      // LMUL
1180d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
1181d91483a6Sfdy        val srcType0 = if (i == 0) SrcType.DC else SrcType.vp
1182d91483a6Sfdy        val ldest = (VECTOR_TMP_REG_LMUL + i).U
1183d91483a6Sfdy        csBundle(i).srcType(0) := srcType0
1184d91483a6Sfdy        csBundle(i).srcType(1) := SrcType.vp
1185d91483a6Sfdy        csBundle(i).rfWen := false.B
1186d91483a6Sfdy        csBundle(i).vecWen := true.B
1187d91483a6Sfdy        csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U
1188d91483a6Sfdy        csBundle(i).lsrc(1) := src2
1189d91483a6Sfdy        // csBundle(i).lsrc(2) := dest + i.U  DontCare
1190d91483a6Sfdy        csBundle(i).ldest := ldest
1191d91483a6Sfdy        csBundle(i).uopIdx := i.U
1192d91483a6Sfdy      }
1193d91483a6Sfdy      csBundle(lmul - 1.U).vecWen := false.B
1194d91483a6Sfdy      csBundle(lmul - 1.U).fpWen := true.B
1195d91483a6Sfdy      csBundle(lmul - 1.U).ldest := FP_TMP_REG_MV.U
1196d91483a6Sfdy      // FMV_X_D
1197d91483a6Sfdy      csBundle(lmul).srcType(0) := SrcType.fp
1198d91483a6Sfdy      csBundle(lmul).srcType(1) := SrcType.imm
1199d91483a6Sfdy      csBundle(lmul).lsrc(0) := FP_TMP_REG_MV.U
1200d91483a6Sfdy      csBundle(lmul).lsrc(1) := 0.U
1201d91483a6Sfdy      csBundle(lmul).ldest := dest
1202d91483a6Sfdy      csBundle(lmul).fuType := FuType.fmisc.U
1203d91483a6Sfdy      csBundle(lmul).rfWen := true.B
1204d91483a6Sfdy      csBundle(lmul).fpWen := false.B
1205d91483a6Sfdy      csBundle(lmul).vecWen := false.B
1206d91483a6Sfdy      csBundle(lmul).fpu.isAddSub := false.B
1207d91483a6Sfdy      csBundle(lmul).fpu.typeTagIn := FPU.D
1208d91483a6Sfdy      csBundle(lmul).fpu.typeTagOut := FPU.D
1209d91483a6Sfdy      csBundle(lmul).fpu.fromInt := false.B
1210d91483a6Sfdy      csBundle(lmul).fpu.wflags := false.B
1211d91483a6Sfdy      csBundle(lmul).fpu.fpWen := false.B
1212d91483a6Sfdy      csBundle(lmul).fpu.div := false.B
1213d91483a6Sfdy      csBundle(lmul).fpu.sqrt := false.B
1214d91483a6Sfdy      csBundle(lmul).fpu.fcvt := false.B
1215d91483a6Sfdy    }
1216d91483a6Sfdy
121717ec87f2SXuan Hu    is(UopSplitType.VEC_MVV) {
1218d91483a6Sfdy      // LMUL
1219d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
1220d91483a6Sfdy        val srcType0 = if (i == 0) SrcType.DC else SrcType.vp
1221d91483a6Sfdy        csBundle(i * 2 + 0).srcType(0) := srcType0
1222d91483a6Sfdy        csBundle(i * 2 + 0).srcType(1) := SrcType.vp
1223d91483a6Sfdy        csBundle(i * 2 + 0).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U
1224d91483a6Sfdy        csBundle(i * 2 + 0).lsrc(1) := src2
1225d91483a6Sfdy        csBundle(i * 2 + 0).lsrc(2) := dest + i.U
1226d91483a6Sfdy        csBundle(i * 2 + 0).ldest := dest + i.U
1227d91483a6Sfdy        csBundle(i * 2 + 0).uopIdx := (i * 2 + 0).U
1228d91483a6Sfdy
1229d91483a6Sfdy        csBundle(i * 2 + 1).srcType(0) := srcType0
1230d91483a6Sfdy        csBundle(i * 2 + 1).srcType(1) := SrcType.vp
1231d91483a6Sfdy        csBundle(i * 2 + 1).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U
1232d91483a6Sfdy        csBundle(i * 2 + 1).lsrc(1) := src2
1233d91483a6Sfdy        // csBundle(i).lsrc(2) := dest + i.U  DontCare
1234d91483a6Sfdy        csBundle(i * 2 + 1).ldest := (VECTOR_TMP_REG_LMUL + i).U
1235d91483a6Sfdy        csBundle(i * 2 + 1).uopIdx := (i * 2 + 1).U
1236d91483a6Sfdy      }
1237d91483a6Sfdy    }
1238d91483a6Sfdy
123917ec87f2SXuan Hu    is(UopSplitType.VEC_M0X_VFIRST) {
1240d91483a6Sfdy      // LMUL
1241d91483a6Sfdy      csBundle(0).rfWen := false.B
1242d91483a6Sfdy      csBundle(0).fpWen := true.B
1243d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
1244d91483a6Sfdy      // FMV_X_D
1245d91483a6Sfdy      csBundle(1).srcType(0) := SrcType.fp
1246d91483a6Sfdy      csBundle(1).srcType(1) := SrcType.imm
1247d91483a6Sfdy      csBundle(1).lsrc(0) := FP_TMP_REG_MV.U
1248d91483a6Sfdy      csBundle(1).lsrc(1) := 0.U
1249d91483a6Sfdy      csBundle(1).ldest := dest
1250d91483a6Sfdy      csBundle(1).fuType := FuType.fmisc.U
1251d91483a6Sfdy      csBundle(1).rfWen := true.B
1252d91483a6Sfdy      csBundle(1).fpWen := false.B
1253d91483a6Sfdy      csBundle(1).vecWen := false.B
1254d91483a6Sfdy      csBundle(1).fpu.isAddSub := false.B
1255d91483a6Sfdy      csBundle(1).fpu.typeTagIn := FPU.D
1256d91483a6Sfdy      csBundle(1).fpu.typeTagOut := FPU.D
1257d91483a6Sfdy      csBundle(1).fpu.fromInt := false.B
1258d91483a6Sfdy      csBundle(1).fpu.wflags := false.B
1259d91483a6Sfdy      csBundle(1).fpu.fpWen := false.B
1260d91483a6Sfdy      csBundle(1).fpu.div := false.B
1261d91483a6Sfdy      csBundle(1).fpu.sqrt := false.B
1262d91483a6Sfdy      csBundle(1).fpu.fcvt := false.B
1263d91483a6Sfdy    }
1264189ec863SzhanglyGit    is(UopSplitType.VEC_VWW) {
1265189ec863SzhanglyGit      for (i <- 0 until MAX_VLMUL*2) {
1266189ec863SzhanglyGit        when(i.U < lmul){
1267189ec863SzhanglyGit          csBundle(i).srcType(2) := SrcType.DC
1268189ec863SzhanglyGit          csBundle(i).lsrc(0) := src2 + i.U
1269189ec863SzhanglyGit          csBundle(i).lsrc(1) := src2 + i.U
1270189ec863SzhanglyGit          // csBundle(i).lsrc(2) := dest + (2 * i).U
1271189ec863SzhanglyGit          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
1272189ec863SzhanglyGit          csBundle(i).uopIdx :=  i.U
1273189ec863SzhanglyGit        } otherwise {
1274189ec863SzhanglyGit          csBundle(i).srcType(2) := SrcType.DC
1275189ec863SzhanglyGit          csBundle(i).lsrc(0) := VECTOR_TMP_REG_LMUL.U + Cat((i.U-lmul),0.U(1.W)) + 1.U
1276189ec863SzhanglyGit          csBundle(i).lsrc(1) := VECTOR_TMP_REG_LMUL.U + Cat((i.U-lmul),0.U(1.W))
1277189ec863SzhanglyGit          // csBundle(i).lsrc(2) := dest + (2 * i).U
1278189ec863SzhanglyGit          csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
1279189ec863SzhanglyGit          csBundle(i).uopIdx := i.U
1280189ec863SzhanglyGit        }
1281189ec863SzhanglyGit        csBundle(numOfUop-1.U).srcType(2) := SrcType.vp
1282189ec863SzhanglyGit        csBundle(numOfUop-1.U).lsrc(0) := src1
1283189ec863SzhanglyGit        csBundle(numOfUop-1.U).lsrc(2) := dest
1284189ec863SzhanglyGit        csBundle(numOfUop-1.U).ldest := dest
1285189ec863SzhanglyGit      }
1286189ec863SzhanglyGit    }
1287189ec863SzhanglyGit    is(UopSplitType.VEC_RGATHER) {
1288189ec863SzhanglyGit      def genCsBundle_VEC_RGATHER(len:Int): Unit ={
1289189ec863SzhanglyGit        for (i <- 0 until len)
1290189ec863SzhanglyGit          for (j <- 0 until len) {
1291189ec863SzhanglyGit            // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm
1292189ec863SzhanglyGit            // csBundle(i * len + j).srcType(1) := SrcType.vp
1293189ec863SzhanglyGit            // csBundle(i * len + j).srcType(2) := SrcType.vp
1294189ec863SzhanglyGit            csBundle(i * len + j).lsrc(0) := src1 + i.U
1295189ec863SzhanglyGit            csBundle(i * len + j).lsrc(1) := src2 + j.U
1296189ec863SzhanglyGit            val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j - 1).U
1297189ec863SzhanglyGit            csBundle(i * len + j).lsrc(2) := vd_old
1298189ec863SzhanglyGit            val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U
1299189ec863SzhanglyGit            csBundle(i * len + j).ldest := vd
1300189ec863SzhanglyGit            csBundle(i * len + j).uopIdx := (i * len + j).U
1301189ec863SzhanglyGit          }
1302189ec863SzhanglyGit      }
1303aaa08c5aSxiaofeibao-xjtu      switch(vlmulReg) {
1304189ec863SzhanglyGit        is("b001".U ){
1305189ec863SzhanglyGit          genCsBundle_VEC_RGATHER(2)
1306189ec863SzhanglyGit        }
1307189ec863SzhanglyGit        is("b010".U ){
1308189ec863SzhanglyGit          genCsBundle_VEC_RGATHER(4)
1309189ec863SzhanglyGit        }
1310189ec863SzhanglyGit        is("b011".U ){
1311189ec863SzhanglyGit          genCsBundle_VEC_RGATHER(8)
1312189ec863SzhanglyGit        }
1313189ec863SzhanglyGit      }
1314189ec863SzhanglyGit    }
1315189ec863SzhanglyGit    is(UopSplitType.VEC_RGATHER_VX) {
1316189ec863SzhanglyGit      def genCsBundle_RGATHER_VX(len:Int): Unit ={
1317189ec863SzhanglyGit        for (i <- 0 until len)
1318189ec863SzhanglyGit          for (j <- 0 until len) {
1319fc85f18fSZiyue Zhang            csBundle(i * len + j + 1).srcType(0) := SrcType.vp
1320189ec863SzhanglyGit            // csBundle(i * len + j + 1).srcType(1) := SrcType.vp
1321189ec863SzhanglyGit            // csBundle(i * len + j + 1).srcType(2) := SrcType.vp
1322fc85f18fSZiyue Zhang            csBundle(i * len + j + 1).lsrc(0) := VECTOR_TMP_REG_LMUL.U
1323189ec863SzhanglyGit            csBundle(i * len + j + 1).lsrc(1) := src2 + j.U
1324fc85f18fSZiyue Zhang            val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U
1325189ec863SzhanglyGit            csBundle(i * len + j + 1).lsrc(2) := vd_old
1326fc85f18fSZiyue Zhang            val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j + 1).U
1327189ec863SzhanglyGit            csBundle(i * len + j + 1).ldest := vd
1328189ec863SzhanglyGit            csBundle(i * len + j + 1).uopIdx := (i * len + j).U
1329189ec863SzhanglyGit          }
1330189ec863SzhanglyGit      }
1331*d6059658SZiyue Zhang      // i to vector move
1332189ec863SzhanglyGit      csBundle(0).srcType(0) := SrcType.reg
1333189ec863SzhanglyGit      csBundle(0).srcType(1) := SrcType.imm
1334189ec863SzhanglyGit      csBundle(0).lsrc(1) := 0.U
1335fc85f18fSZiyue Zhang      csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
1336fc85f18fSZiyue Zhang      csBundle(0).fuType := FuType.i2v.U
1337*d6059658SZiyue Zhang      csBundle(0).fuOpType := Cat(Mux(src1IsImm, IF2VectorType.permImm2vector(2, 0), IF2VectorType.i2vector(2, 0)), vsewReg)
1338fc85f18fSZiyue Zhang      csBundle(0).vecWen := true.B
1339aaa08c5aSxiaofeibao-xjtu      switch(vlmulReg) {
1340189ec863SzhanglyGit        is("b000".U ){
1341189ec863SzhanglyGit          genCsBundle_RGATHER_VX(1)
1342189ec863SzhanglyGit        }
1343189ec863SzhanglyGit        is("b001".U ){
1344189ec863SzhanglyGit          genCsBundle_RGATHER_VX(2)
1345189ec863SzhanglyGit        }
1346189ec863SzhanglyGit        is("b010".U ){
1347189ec863SzhanglyGit          genCsBundle_RGATHER_VX(4)
1348189ec863SzhanglyGit        }
1349189ec863SzhanglyGit        is("b011".U ){
1350189ec863SzhanglyGit          genCsBundle_RGATHER_VX(8)
1351189ec863SzhanglyGit        }
1352189ec863SzhanglyGit      }
1353189ec863SzhanglyGit    }
1354189ec863SzhanglyGit    is(UopSplitType.VEC_RGATHEREI16) {
1355189ec863SzhanglyGit      def genCsBundle_VEC_RGATHEREI16_SEW8(len:Int): Unit ={
1356189ec863SzhanglyGit        for (i <- 0 until len)
1357189ec863SzhanglyGit          for (j <- 0 until len) {
1358189ec863SzhanglyGit            val vd_old0 = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j*2-1).U
1359189ec863SzhanglyGit            val vd0 = (VECTOR_TMP_REG_LMUL + j*2 ).U
1360189ec863SzhanglyGit            // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm
1361189ec863SzhanglyGit            // csBundle(i * len + j).srcType(1) := SrcType.vp
1362189ec863SzhanglyGit            // csBundle(i * len + j).srcType(2) := SrcType.vp
1363189ec863SzhanglyGit            csBundle((i * len + j)*2+0).lsrc(0) := src1 + (i*2+0).U
1364189ec863SzhanglyGit            csBundle((i * len + j)*2+0).lsrc(1) := src2 + j.U
1365189ec863SzhanglyGit            csBundle((i * len + j)*2+0).lsrc(2) := vd_old0
1366189ec863SzhanglyGit            csBundle((i * len + j)*2+0).ldest := vd0
1367189ec863SzhanglyGit            csBundle((i * len + j)*2+0).uopIdx := ((i * len + j)*2+0).U
1368189ec863SzhanglyGit            val vd_old1 = (VECTOR_TMP_REG_LMUL + j*2).U
1369189ec863SzhanglyGit            val vd1 = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j*2+1 ).U
1370189ec863SzhanglyGit            csBundle((i * len + j)*2+1).lsrc(0) := src1 + (i*2+1).U
1371189ec863SzhanglyGit            csBundle((i * len + j)*2+1).lsrc(1) := src2 + j.U
1372189ec863SzhanglyGit            csBundle((i * len + j)*2+1).lsrc(2) := vd_old1
1373189ec863SzhanglyGit            csBundle((i * len + j)*2+1).ldest := vd1
1374189ec863SzhanglyGit            csBundle((i * len + j)*2+1).uopIdx := ((i * len + j)*2+1).U
1375189ec863SzhanglyGit          }
1376189ec863SzhanglyGit      }
1377189ec863SzhanglyGit      def genCsBundle_VEC_RGATHEREI16(len:Int): Unit ={
1378189ec863SzhanglyGit        for (i <- 0 until len)
1379189ec863SzhanglyGit          for (j <- 0 until len) {
1380189ec863SzhanglyGit            val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j-1).U
1381189ec863SzhanglyGit            val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U
1382189ec863SzhanglyGit            // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm
1383189ec863SzhanglyGit            // csBundle(i * len + j).srcType(1) := SrcType.vp
1384189ec863SzhanglyGit            // csBundle(i * len + j).srcType(2) := SrcType.vp
1385189ec863SzhanglyGit            csBundle(i * len + j).lsrc(0) := src1 + i.U
1386189ec863SzhanglyGit            csBundle(i * len + j).lsrc(1) := src2 + j.U
1387189ec863SzhanglyGit            csBundle(i * len + j).lsrc(2) := vd_old
1388189ec863SzhanglyGit            csBundle(i * len + j).ldest := vd
1389189ec863SzhanglyGit            csBundle(i * len + j).uopIdx := (i * len + j).U
1390189ec863SzhanglyGit          }
1391189ec863SzhanglyGit      }
1392aaa08c5aSxiaofeibao-xjtu      switch(vlmulReg) {
1393189ec863SzhanglyGit        is("b000".U ){
1394aaa08c5aSxiaofeibao-xjtu          when(!vsewReg.orR){
1395189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16_SEW8(1)
1396189ec863SzhanglyGit          } .otherwise{
1397189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16(1)
1398189ec863SzhanglyGit          }
1399189ec863SzhanglyGit        }
1400189ec863SzhanglyGit        is("b001".U) {
1401aaa08c5aSxiaofeibao-xjtu          when(!vsewReg.orR) {
1402189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16_SEW8(2)
1403189ec863SzhanglyGit          }.otherwise {
1404189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16(2)
1405189ec863SzhanglyGit          }
1406189ec863SzhanglyGit        }
1407189ec863SzhanglyGit        is("b010".U) {
1408aaa08c5aSxiaofeibao-xjtu          when(!vsewReg.orR) {
1409189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16_SEW8(4)
1410189ec863SzhanglyGit          }.otherwise {
1411189ec863SzhanglyGit            genCsBundle_VEC_RGATHEREI16(4)
1412189ec863SzhanglyGit          }
1413189ec863SzhanglyGit        }
1414189ec863SzhanglyGit        is("b011".U) {
1415189ec863SzhanglyGit          genCsBundle_VEC_RGATHEREI16(8)
1416189ec863SzhanglyGit        }
1417189ec863SzhanglyGit      }
1418189ec863SzhanglyGit    }
1419189ec863SzhanglyGit    is(UopSplitType.VEC_COMPRESS) {
1420189ec863SzhanglyGit      def genCsBundle_VEC_COMPRESS(len:Int): Unit ={
1421189ec863SzhanglyGit        for (i <- 0 until len){
1422189ec863SzhanglyGit          val jlen = if (i == len-1) i+1 else i+2
1423189ec863SzhanglyGit          for (j <- 0 until jlen) {
1424189ec863SzhanglyGit            val vd_old = if(i==j) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j + 1).U
1425189ec863SzhanglyGit            val vd = if(i==len-1) (dest + j.U) else{
1426189ec863SzhanglyGit              if (j == i+1) VECTOR_TMP_REG_LMUL.U else (VECTOR_TMP_REG_LMUL + j + 1).U
1427189ec863SzhanglyGit            }
1428189ec863SzhanglyGit            val src23Type = if (j == i+1) DontCare else SrcType.vp
1429189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).srcType(0) := SrcType.vp
1430189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).srcType(1) := src23Type
1431189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).srcType(2) := src23Type
1432189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).lsrc(0) := src1
1433189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).lsrc(1) := src2 + i.U
1434189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).lsrc(2) := vd_old
1435189ec863SzhanglyGit            // csBundle(i*(i+3)/2 + j).lsrc(3) := VECTOR_TMP_REG_LMUL.U
1436189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).ldest := vd
1437189ec863SzhanglyGit            csBundle(i*(i+3)/2 + j).uopIdx := (i*(i+3)/2 + j).U
1438189ec863SzhanglyGit          }
1439189ec863SzhanglyGit        }
1440189ec863SzhanglyGit      }
1441aaa08c5aSxiaofeibao-xjtu      switch(vlmulReg) {
1442189ec863SzhanglyGit        is("b001".U ){
1443189ec863SzhanglyGit          genCsBundle_VEC_COMPRESS(2)
1444189ec863SzhanglyGit        }
1445189ec863SzhanglyGit        is("b010".U ){
1446189ec863SzhanglyGit          genCsBundle_VEC_COMPRESS(4)
1447189ec863SzhanglyGit        }
1448189ec863SzhanglyGit        is("b011".U ){
1449189ec863SzhanglyGit          genCsBundle_VEC_COMPRESS(8)
1450189ec863SzhanglyGit        }
1451189ec863SzhanglyGit      }
1452189ec863SzhanglyGit    }
14530a34fc22SZiyue Zhang    is(UopSplitType.VEC_MVNR) {
14540a34fc22SZiyue Zhang      for (i <- 0 until MAX_VLMUL) {
14550a34fc22SZiyue Zhang        csBundle(i).lsrc(0) := src1 + i.U
14560a34fc22SZiyue Zhang        csBundle(i).lsrc(1) := src2 + i.U
14570a34fc22SZiyue Zhang        csBundle(i).lsrc(2) := dest + i.U
14580a34fc22SZiyue Zhang        csBundle(i).ldest := dest + i.U
14590a34fc22SZiyue Zhang        csBundle(i).uopIdx := i.U
14600a34fc22SZiyue Zhang      }
14610a34fc22SZiyue Zhang    }
14624ee69032SzhanglyGit    is(UopSplitType.VEC_US_LD) {
14634ee69032SzhanglyGit      /*
14644ee69032SzhanglyGit      FMV.D.X
14654ee69032SzhanglyGit       */
14664ee69032SzhanglyGit      csBundle(0).srcType(0) := SrcType.reg
14674ee69032SzhanglyGit      csBundle(0).srcType(1) := SrcType.imm
14684ee69032SzhanglyGit      csBundle(0).lsrc(1) := 0.U
14694ee69032SzhanglyGit      csBundle(0).ldest := FP_TMP_REG_MV.U
14704ee69032SzhanglyGit      csBundle(0).fuType := FuType.i2f.U
14714ee69032SzhanglyGit      csBundle(0).rfWen := false.B
14724ee69032SzhanglyGit      csBundle(0).fpWen := true.B
14734ee69032SzhanglyGit      csBundle(0).vecWen := false.B
14744ee69032SzhanglyGit      csBundle(0).fpu.isAddSub := false.B
14754ee69032SzhanglyGit      csBundle(0).fpu.typeTagIn := FPU.D
14764ee69032SzhanglyGit      csBundle(0).fpu.typeTagOut := FPU.D
14774ee69032SzhanglyGit      csBundle(0).fpu.fromInt := true.B
14784ee69032SzhanglyGit      csBundle(0).fpu.wflags := false.B
14794ee69032SzhanglyGit      csBundle(0).fpu.fpWen := true.B
14804ee69032SzhanglyGit      csBundle(0).fpu.div := false.B
14814ee69032SzhanglyGit      csBundle(0).fpu.sqrt := false.B
14824ee69032SzhanglyGit      csBundle(0).fpu.fcvt := false.B
14834ee69032SzhanglyGit      //LMUL
14844ee69032SzhanglyGit      for (i <- 0 until MAX_VLMUL) {
14854ee69032SzhanglyGit        csBundle(i + 1).srcType(0) := SrcType.fp
14864ee69032SzhanglyGit        csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U
14874ee69032SzhanglyGit        csBundle(i + 1).ldest := dest + i.U
14884ee69032SzhanglyGit        csBundle(i + 1).uopIdx := i.U
14894ee69032SzhanglyGit      }
14904ee69032SzhanglyGit    }
1491d91483a6Sfdy  }
1492d91483a6Sfdy
1493d91483a6Sfdy  //uops dispatch
1494189ec863SzhanglyGit  val s_normal :: s_ext :: Nil = Enum(2)
1495189ec863SzhanglyGit  val state = RegInit(s_normal)
1496189ec863SzhanglyGit  val state_next = WireDefault(state)
1497d91483a6Sfdy  val uopRes = RegInit(0.U)
1498d91483a6Sfdy
1499d91483a6Sfdy  //readyFromRename Counter
1500d91483a6Sfdy  val readyCounter = PriorityMuxDefault(io.readyFromRename.map(x => !x).zip((0 to (RenameWidth - 1)).map(_.U)), RenameWidth.U)
1501d91483a6Sfdy
1502189ec863SzhanglyGit  switch(state) {
1503189ec863SzhanglyGit    is(s_normal) {
1504189ec863SzhanglyGit      state_next := Mux(io.validFromIBuf(0) && (numOfUop > readyCounter) && (readyCounter =/= 0.U), s_ext, s_normal)
1505d91483a6Sfdy    }
1506189ec863SzhanglyGit    is(s_ext) {
1507189ec863SzhanglyGit      state_next := Mux(io.validFromIBuf(0) && (uopRes > readyCounter), s_ext, s_normal)
1508d91483a6Sfdy    }
1509d91483a6Sfdy  }
1510d91483a6Sfdy
1511189ec863SzhanglyGit  state := state_next
1512189ec863SzhanglyGit
1513189ec863SzhanglyGit  val uopRes0 = Mux(state === s_normal, numOfUop, uopRes)
1514189ec863SzhanglyGit  val uopResJudge = Mux(state === s_normal,
1515d91483a6Sfdy    io.validFromIBuf(0) && (readyCounter =/= 0.U) && (uopRes0 > readyCounter),
1516d91483a6Sfdy    io.validFromIBuf(0) && (uopRes0 > readyCounter))
1517d91483a6Sfdy  uopRes := Mux(uopResJudge, uopRes0 - readyCounter, 0.U)
1518d91483a6Sfdy
1519d91483a6Sfdy  for(i <- 0 until RenameWidth) {
1520d91483a6Sfdy    decodedInsts(i) := MuxCase(csBundle(i), Seq(
1521189ec863SzhanglyGit      (state === s_normal) -> csBundle(i),
1522189ec863SzhanglyGit      (state === s_ext) -> Mux((i.U + numOfUop -uopRes) < maxUopSize.U, csBundle(i.U + numOfUop - uopRes), csBundle(maxUopSize - 1))
152383ba63b3SXuan Hu    ).toSeq)
1524d91483a6Sfdy  }
1525d91483a6Sfdy
1526aaa08c5aSxiaofeibao-xjtu  val validSimple = Wire(Vec(DecodeWidth, Bool()))
1527aaa08c5aSxiaofeibao-xjtu  validSimple.zip(io.validFromIBuf.zip(io.isComplex)).map{ case (dst, (src1, src2)) => dst := src1 && !src2 }
1528aaa08c5aSxiaofeibao-xjtu  val notInf = Wire(Vec(DecodeWidth, Bool()))
1529aaa08c5aSxiaofeibao-xjtu  notInf.drop(1).zip(io.validFromIBuf.drop(1).zip(validSimple.drop(1))).map{ case (dst, (src1, src2)) => dst := !src1 || src2 }
1530aaa08c5aSxiaofeibao-xjtu  notInf(0) := !io.validFromIBuf(0) || validSimple(0) || (io.isComplex(0) && io.in0pc === io.simple.decodedInst.pc)
1531d91483a6Sfdy  val notInfVec = Wire(Vec(DecodeWidth, Bool()))
1532aaa08c5aSxiaofeibao-xjtu  notInfVec.zipWithIndex.map{ case (dst, i) => dst := Cat(notInf.take(i + 1)).andR}
1533d91483a6Sfdy
1534d91483a6Sfdy  complexNum := Mux(io.validFromIBuf(0) && readyCounter.orR ,
1535d91483a6Sfdy    Mux(uopRes0 > readyCounter, readyCounter, uopRes0),
1536aaa08c5aSxiaofeibao-xjtu    0.U)
1537d91483a6Sfdy  validToRename.zipWithIndex.foreach{
1538d91483a6Sfdy    case(dst, i) =>
1539aaa08c5aSxiaofeibao-xjtu      val validFix = Mux(complexNum.orR, validSimple((i+1).U - complexNum), validSimple(i))
1540d91483a6Sfdy      dst := MuxCase(false.B, Seq(
1541aaa08c5aSxiaofeibao-xjtu        (io.validFromIBuf(0) && readyCounter.orR && uopRes0 > readyCounter) -> Mux(readyCounter > i.U, true.B, false.B),
1542aaa08c5aSxiaofeibao-xjtu        (io.validFromIBuf(0) && readyCounter.orR && !(uopRes0 > readyCounter)) -> Mux(complexNum > i.U, true.B, validFix && notInfVec(i.U - complexNum) && io.readyFromRename(i)),
1543aaa08c5aSxiaofeibao-xjtu      ).toSeq)
1544d91483a6Sfdy  }
1545d91483a6Sfdy
1546d91483a6Sfdy  readyToIBuf.zipWithIndex.foreach {
1547d91483a6Sfdy    case (dst, i) =>
1548aaa08c5aSxiaofeibao-xjtu      val readyToIBuf0 = Mux(io.isComplex(0), io.in0pc === io.simple.decodedInst.pc, true.B)
1549d91483a6Sfdy      dst := MuxCase(true.B, Seq(
1550aaa08c5aSxiaofeibao-xjtu        (io.validFromIBuf(0) && uopRes0 > readyCounter || !readyCounter.orR) -> false.B,
1551aaa08c5aSxiaofeibao-xjtu        (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))
1552aaa08c5aSxiaofeibao-xjtu      ).toSeq)
1553d91483a6Sfdy  }
1554d91483a6Sfdy
1555d91483a6Sfdy  io.deq.decodedInsts := decodedInsts
1556189ec863SzhanglyGit  io.deq.isVset := isVsetSimple
1557d91483a6Sfdy  io.deq.complexNum := complexNum
1558d91483a6Sfdy  io.deq.validToRename := validToRename
1559d91483a6Sfdy  io.deq.readyToIBuf := readyToIBuf
1560d91483a6Sfdy
1561d91483a6Sfdy}
1562