xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnitComp.scala (revision 98cfe81bc227fcb004cb17eeba2f56f63cf1dde9)
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
19d91483a6Sfdyimport chipsalliance.rocketchip.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}
32*98cfe81bSxgkiriimport xiangshan.backend.decode.isa.bitfield.XSInstBitFields
33b52d4755SXuan Huimport xiangshan.backend.fu.vector.Bundles.VType
34d91483a6Sfdyimport yunsuan.VpermType
35d91483a6Sfdy
36d91483a6Sfdyimport scala.collection.Seq
37d91483a6Sfdy
38d91483a6Sfdytrait VectorConstants {
39d91483a6Sfdy  val MAX_VLMUL = 8
40d91483a6Sfdy  val FP_TMP_REG_MV = 32
41d91483a6Sfdy  val VECTOR_TMP_REG_LMUL = 32 // 32~38  ->  7
42d91483a6Sfdy}
43d91483a6Sfdy
44d91483a6Sfdyclass DecodeUnitCompIO(implicit p: Parameters) extends XSBundle {
45d91483a6Sfdy  val enq = new Bundle { val staticInst = Input(new StaticInst) }
46d91483a6Sfdy  val vtype = Input(new VType)
47d91483a6Sfdy  val isComplex = Input(Vec(DecodeWidth - 1, Bool()))
48d91483a6Sfdy  val validFromIBuf = Input(Vec(DecodeWidth, Bool()))
49d91483a6Sfdy  val readyFromRename = Input(Vec(RenameWidth, Bool()))
50d91483a6Sfdy  val deq = new Bundle {
51d91483a6Sfdy    val decodedInsts = Output(Vec(RenameWidth, new DecodedInst))
52d91483a6Sfdy    val isVset = Output(Bool())
53d91483a6Sfdy    val readyToIBuf = Output(Vec(DecodeWidth, Bool()))
54d91483a6Sfdy    val validToRename = Output(Vec(RenameWidth, Bool()))
55d91483a6Sfdy    val complexNum = Output(UInt(3.W))
56d91483a6Sfdy  }
57d91483a6Sfdy  val csrCtrl = Input(new CustomCSRCtrlIO)
58d91483a6Sfdy}
5917ec87f2SXuan Hu
60d91483a6Sfdy/**
61d91483a6Sfdy  * @author zly
62d91483a6Sfdy  */
63d91483a6Sfdyclass DecodeUnitComp()(implicit p : Parameters) extends XSModule with DecodeUnitConstants with VectorConstants {
64d91483a6Sfdy  val io = IO(new DecodeUnitCompIO)
65d91483a6Sfdy
66d91483a6Sfdy  val maxUopSize = MaxUopSize
67d91483a6Sfdy  //input bits
68d91483a6Sfdy  val staticInst = Wire(new StaticInst)
69*98cfe81bSxgkiri  private val inst: XSInstBitFields = staticInst.asTypeOf(new XSInstBitFields)
70d91483a6Sfdy
71d91483a6Sfdy  staticInst := io.enq.staticInst
72d91483a6Sfdy
73*98cfe81bSxgkiri  val src1 = Cat(0.U(1.W), inst.RS1)
74*98cfe81bSxgkiri  val src2 = Cat(0.U(1.W), inst.RS2)
75*98cfe81bSxgkiri  val dest = Cat(0.U(1.W), inst.RD)
76*98cfe81bSxgkiri  val width = inst.RM //Vector LS eew
774ee69032SzhanglyGit  val eew = Cat(0.U(1.W), width(1, 0))
78d91483a6Sfdy
79d91483a6Sfdy  //output bits
80d91483a6Sfdy  val decodedInsts = Wire(Vec(RenameWidth, new DecodedInst))
81d91483a6Sfdy  val validToRename = Wire(Vec(RenameWidth, Bool()))
82d91483a6Sfdy  val readyToIBuf = Wire(Vec(DecodeWidth, Bool()))
83d91483a6Sfdy  val complexNum = Wire(UInt(3.W))
84d91483a6Sfdy
85d91483a6Sfdy  //output of DecodeUnit
86d91483a6Sfdy  val decodedInsts_u = Wire(new DecodedInst)
87d91483a6Sfdy  val isVset_u = Wire(Bool())
88d91483a6Sfdy
89d91483a6Sfdy  //pre decode
90d91483a6Sfdy  val simple = Module(new DecodeUnit)
91d91483a6Sfdy  simple.io.enq.ctrlFlow := staticInst
92d91483a6Sfdy  simple.io.enq.vtype := io.vtype
93d91483a6Sfdy  simple.io.csrCtrl := io.csrCtrl
94d91483a6Sfdy  decodedInsts_u := simple.io.deq.decodedInst
95d91483a6Sfdy  isVset_u := simple.io.deq.decodedInst.isVset
96d91483a6Sfdy  when(isVset_u) {
97d91483a6Sfdy    when(dest === 0.U && src1 === 0.U) {
98a8db15d8Sfdy      decodedInsts_u.fuOpType := VSETOpType.keepVl(simple.io.deq.decodedInst.fuOpType)
99d91483a6Sfdy    }.elsewhen(src1 === 0.U) {
100a8db15d8Sfdy      decodedInsts_u.fuOpType := VSETOpType.setVlmax(simple.io.deq.decodedInst.fuOpType)
101a8db15d8Sfdy    }
102a8db15d8Sfdy    when(io.vtype.illegal){
103a8db15d8Sfdy      decodedInsts_u.flushPipe := true.B
104d91483a6Sfdy    }
105d91483a6Sfdy  }
106d91483a6Sfdy  //Type of uop Div
10717ec87f2SXuan Hu  val typeOfDiv = decodedInsts_u.uopSplitType
108d91483a6Sfdy
1094ee69032SzhanglyGit  val sew = Cat(0.U(1.W), simple.io.enq.vtype.vsew)
1104ee69032SzhanglyGit  val vlmul = simple.io.enq.vtype.vlmul
1114ee69032SzhanglyGit
112d91483a6Sfdy  //LMUL
113d91483a6Sfdy  val lmul = MuxLookup(simple.io.enq.vtype.vlmul, 1.U(4.W), Array(
114d91483a6Sfdy    "b001".U -> 2.U,
115d91483a6Sfdy    "b010".U -> 4.U,
116d91483a6Sfdy    "b011".U -> 8.U
117d91483a6Sfdy  ))
118d91483a6Sfdy  val numOfUopVslide = MuxLookup(simple.io.enq.vtype.vlmul, 1.U(log2Up(maxUopSize+1).W), Array(
119d91483a6Sfdy    "b001".U -> 3.U,
120d91483a6Sfdy    "b010".U -> 10.U,
121d91483a6Sfdy    "b011".U -> 36.U
122d91483a6Sfdy  ))
1234ee69032SzhanglyGit  val vemul : UInt = eew.asUInt + 1.U + vlmul.asUInt + ~sew.asUInt
1244ee69032SzhanglyGit  val emul = MuxLookup(vemul, 1.U(4.W), Array(
1254ee69032SzhanglyGit    "b001".U -> 2.U,
1264ee69032SzhanglyGit    "b010".U -> 4.U,
1274ee69032SzhanglyGit    "b011".U -> 8.U
1284ee69032SzhanglyGit  ))                                                                                //TODO : eew and emul illegal exception need to be handled
1294ee69032SzhanglyGit
130d91483a6Sfdy  //number of uop
131d91483a6Sfdy  val numOfUop = MuxLookup(typeOfDiv, 1.U(log2Up(maxUopSize+1).W), Array(
13217ec87f2SXuan Hu    UopSplitType.VEC_0XV         -> 2.U,
13317ec87f2SXuan Hu    UopSplitType.DIR -> Mux(dest =/= 0.U, 2.U,
134d91483a6Sfdy                        Mux(src1 =/= 0.U, 1.U,
135d91483a6Sfdy                          Mux(VSETOpType.isVsetvl(decodedInsts_u.fuOpType), 2.U, 1.U))),
13617ec87f2SXuan Hu    UopSplitType.VEC_VVV         -> lmul,
13717ec87f2SXuan Hu    UopSplitType.VEC_EXT2        -> lmul,
13817ec87f2SXuan Hu    UopSplitType.VEC_EXT4        -> lmul,
13917ec87f2SXuan Hu    UopSplitType.VEC_EXT8        -> lmul,
14017ec87f2SXuan Hu    UopSplitType.VEC_VVM         -> lmul,
14117ec87f2SXuan Hu    UopSplitType.VEC_VXM         -> (lmul +& 1.U),
14217ec87f2SXuan Hu    UopSplitType.VEC_VXV         -> (lmul +& 1.U),
14317ec87f2SXuan Hu    UopSplitType.VEC_VVW         -> Cat(lmul, 0.U(1.W)),     // lmul <= 4
14417ec87f2SXuan Hu    UopSplitType.VEC_WVW         -> Cat(lmul, 0.U(1.W)),     // lmul <= 4
14517ec87f2SXuan Hu    UopSplitType.VEC_VXW         -> Cat(lmul, 1.U(1.W)),     // lmul <= 4
14617ec87f2SXuan Hu    UopSplitType.VEC_WXW         -> Cat(lmul, 1.U(1.W)),     // lmul <= 4
14717ec87f2SXuan Hu    UopSplitType.VEC_WVV         -> Cat(lmul, 0.U(1.W)),     // lmul <= 4
14817ec87f2SXuan Hu    UopSplitType.VEC_WXV         -> Cat(lmul, 1.U(1.W)),     // lmul <= 4
14917ec87f2SXuan Hu    UopSplitType.VEC_SLIDE1UP    -> (lmul +& 1.U),
15017ec87f2SXuan Hu    UopSplitType.VEC_FSLIDE1UP   -> lmul,
15117ec87f2SXuan Hu    UopSplitType.VEC_SLIDE1DOWN  -> Cat(lmul, 0.U(1.W)),
15217ec87f2SXuan Hu    UopSplitType.VEC_FSLIDE1DOWN -> (Cat(lmul, 0.U(1.W)) -1.U),
15317ec87f2SXuan Hu    UopSplitType.VEC_VRED        -> lmul,
15417ec87f2SXuan Hu    UopSplitType.VEC_SLIDEUP     -> (numOfUopVslide + 1.U),
15517ec87f2SXuan Hu    UopSplitType.VEC_ISLIDEUP    -> numOfUopVslide,
15617ec87f2SXuan Hu    UopSplitType.VEC_SLIDEDOWN   -> (numOfUopVslide + 1.U),
15717ec87f2SXuan Hu    UopSplitType.VEC_ISLIDEDOWN  -> numOfUopVslide,
15817ec87f2SXuan Hu    UopSplitType.VEC_M0X         -> (lmul +& 1.U),
15917ec87f2SXuan Hu    UopSplitType.VEC_MVV         -> (Cat(lmul, 0.U(1.W)) -1.U),
16017ec87f2SXuan Hu    UopSplitType.VEC_M0X_VFIRST  -> 2.U,
1614ee69032SzhanglyGit    UopSplitType.VEC_US_LD       -> (emul +& 1.U),
162d91483a6Sfdy  ))
163d91483a6Sfdy
164d91483a6Sfdy  //uop div up to maxUopSize
165d91483a6Sfdy  val csBundle = Wire(Vec(maxUopSize, new DecodedInst))
166d91483a6Sfdy  csBundle.map { case dst =>
167d91483a6Sfdy    dst := decodedInsts_u
168d91483a6Sfdy    dst.firstUop := false.B
169d91483a6Sfdy    dst.lastUop := false.B
170d91483a6Sfdy  }
171d91483a6Sfdy
172f1e8fcb2SXuan Hu  csBundle(0).numUops := numOfUop
173d91483a6Sfdy  csBundle(0).firstUop := true.B
174d91483a6Sfdy  csBundle(numOfUop - 1.U).lastUop := true.B
175d91483a6Sfdy
176d91483a6Sfdy  switch(typeOfDiv) {
17717ec87f2SXuan Hu    is(UopSplitType.DIR) {
178d91483a6Sfdy      when(isVset_u) {
179d91483a6Sfdy        when(dest =/= 0.U) {
180d91483a6Sfdy          csBundle(0).fuType := FuType.vsetiwi.U
181a8db15d8Sfdy          csBundle(0).fuOpType := VSETOpType.switchDest(decodedInsts_u.fuOpType)
182d91483a6Sfdy          csBundle(0).flushPipe := false.B
183d91483a6Sfdy          csBundle(0).rfWen := true.B
184d91483a6Sfdy          csBundle(0).vecWen := false.B
185cb10a55bSXuan Hu          csBundle(1).ldest := VCONFIG_IDX.U
186fe60541bSXuan Hu          csBundle(1).rfWen := false.B
187fe60541bSXuan Hu          csBundle(1).vecWen := true.B
188d91483a6Sfdy        }.elsewhen(src1 =/= 0.U) {
189cb10a55bSXuan Hu          csBundle(0).ldest := VCONFIG_IDX.U
190d91483a6Sfdy        }.elsewhen(VSETOpType.isVsetvli(decodedInsts_u.fuOpType)) {
191d91483a6Sfdy          csBundle(0).fuType := FuType.vsetfwf.U
192d91483a6Sfdy          csBundle(0).srcType(0) := SrcType.vp
193cb10a55bSXuan Hu          csBundle(0).lsrc(0) := VCONFIG_IDX.U
194d91483a6Sfdy        }.elsewhen(VSETOpType.isVsetvl(decodedInsts_u.fuOpType)) {
195d91483a6Sfdy          csBundle(0).srcType(0) := SrcType.reg
196d91483a6Sfdy          csBundle(0).srcType(1) := SrcType.imm
197d91483a6Sfdy          csBundle(0).lsrc(1) := 0.U
198d91483a6Sfdy          csBundle(0).ldest := FP_TMP_REG_MV.U
199d91483a6Sfdy          csBundle(0).fuType := FuType.i2f.U
200d91483a6Sfdy          csBundle(0).rfWen := false.B
201d91483a6Sfdy          csBundle(0).fpWen := true.B
202d91483a6Sfdy          csBundle(0).vecWen := false.B
203d91483a6Sfdy          csBundle(0).fpu.isAddSub := false.B
204d91483a6Sfdy          csBundle(0).fpu.typeTagIn := FPU.D
205d91483a6Sfdy          csBundle(0).fpu.typeTagOut := FPU.D
206d91483a6Sfdy          csBundle(0).fpu.fromInt := true.B
207d91483a6Sfdy          csBundle(0).fpu.wflags := false.B
208d91483a6Sfdy          csBundle(0).fpu.fpWen := true.B
209d91483a6Sfdy          csBundle(0).fpu.div := false.B
210d91483a6Sfdy          csBundle(0).fpu.sqrt := false.B
211d91483a6Sfdy          csBundle(0).fpu.fcvt := false.B
212d91483a6Sfdy          csBundle(0).flushPipe := false.B
213d91483a6Sfdy          csBundle(1).fuType := FuType.vsetfwf.U
214d91483a6Sfdy          csBundle(1).srcType(0) := SrcType.vp
215cb10a55bSXuan Hu          csBundle(1).lsrc(0) := VCONFIG_IDX.U
216d91483a6Sfdy          csBundle(1).srcType(1) := SrcType.fp
217d91483a6Sfdy          csBundle(1).lsrc(1) := FP_TMP_REG_MV.U
218cb10a55bSXuan Hu          csBundle(1).ldest := VCONFIG_IDX.U
219d91483a6Sfdy        }
220d91483a6Sfdy      }
221d91483a6Sfdy    }
22217ec87f2SXuan Hu    is(UopSplitType.VEC_VVV) {
223d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
224d91483a6Sfdy        csBundle(i).lsrc(0) := src1 + i.U
225d91483a6Sfdy        csBundle(i).lsrc(1) := src2 + i.U
226d91483a6Sfdy        csBundle(i).lsrc(2) := dest + i.U
227d91483a6Sfdy        csBundle(i).ldest := dest + i.U
228d91483a6Sfdy        csBundle(i).uopIdx := i.U
229d91483a6Sfdy      }
230d91483a6Sfdy    }
23117ec87f2SXuan Hu    is(UopSplitType.VEC_EXT2) {
232d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
233d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + i.U
234d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
235d91483a6Sfdy        csBundle(2 * i).ldest := dest + (2 * i).U
236d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
237d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
238d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
239d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
240d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
241d91483a6Sfdy      }
242d91483a6Sfdy    }
24317ec87f2SXuan Hu    is(UopSplitType.VEC_EXT4) {
244d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 4) {
245d91483a6Sfdy        csBundle(4 * i).lsrc(1) := src2 + i.U
246d91483a6Sfdy        csBundle(4 * i).lsrc(2) := dest + (4 * i).U
247d91483a6Sfdy        csBundle(4 * i).ldest := dest + (4 * i).U
248d91483a6Sfdy        csBundle(4 * i).uopIdx := (4 * i).U
249d91483a6Sfdy        csBundle(4 * i + 1).lsrc(1) := src2 + i.U
250d91483a6Sfdy        csBundle(4 * i + 1).lsrc(2) := dest + (4 * i + 1).U
251d91483a6Sfdy        csBundle(4 * i + 1).ldest := dest + (4 * i + 1).U
252d91483a6Sfdy        csBundle(4 * i + 1).uopIdx := (4 * i + 1).U
253d91483a6Sfdy        csBundle(4 * i + 2).lsrc(1) := src2 + i.U
254d91483a6Sfdy        csBundle(4 * i + 2).lsrc(2) := dest + (4 * i + 2).U
255d91483a6Sfdy        csBundle(4 * i + 2).ldest := dest + (4 * i + 2).U
256d91483a6Sfdy        csBundle(4 * i + 2).uopIdx := (4 * i + 2).U
257d91483a6Sfdy        csBundle(4 * i + 3).lsrc(1) := src2 + i.U
258d91483a6Sfdy        csBundle(4 * i + 3).lsrc(2) := dest + (4 * i + 3).U
259d91483a6Sfdy        csBundle(4 * i + 3).ldest := dest + (4 * i + 3).U
260d91483a6Sfdy        csBundle(4 * i + 3).uopIdx := (4 * i + 3).U
261d91483a6Sfdy      }
262d91483a6Sfdy    }
26317ec87f2SXuan Hu    is(UopSplitType.VEC_EXT8) {
264d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
265d91483a6Sfdy        csBundle(i).lsrc(1) := src2
266d91483a6Sfdy        csBundle(i).lsrc(2) := dest + i.U
267d91483a6Sfdy        csBundle(i).ldest := dest + i.U
268d91483a6Sfdy        csBundle(i).uopIdx := i.U
269d91483a6Sfdy      }
270d91483a6Sfdy    }
27117ec87f2SXuan Hu    is(UopSplitType.VEC_0XV) {
272d91483a6Sfdy      /*
273d91483a6Sfdy      FMV.D.X
274d91483a6Sfdy       */
275d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
276d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
277d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
278d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
279d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
280d91483a6Sfdy      csBundle(0).rfWen := false.B
281d91483a6Sfdy      csBundle(0).fpWen := true.B
282d91483a6Sfdy      csBundle(0).vecWen := false.B
283d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
284d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
285d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
286d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
287d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
288d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
289d91483a6Sfdy      csBundle(0).fpu.div := false.B
290d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
291d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
292d91483a6Sfdy      /*
293d91483a6Sfdy      vfmv.s.f
294d91483a6Sfdy       */
295d91483a6Sfdy      csBundle(1).srcType(0) := SrcType.fp
296d91483a6Sfdy      csBundle(1).srcType(1) := SrcType.vp
297d91483a6Sfdy      csBundle(1).srcType(2) := SrcType.vp
298d91483a6Sfdy      csBundle(1).lsrc(0) := FP_TMP_REG_MV.U
299d91483a6Sfdy      csBundle(1).lsrc(1) := 0.U
300d91483a6Sfdy      csBundle(1).lsrc(2) := dest
301d91483a6Sfdy      csBundle(1).ldest := dest
302d91483a6Sfdy      csBundle(1).fuType := FuType.vppu.U
30317ec87f2SXuan Hu      csBundle(1).fuOpType := VpermType.dummy
304d91483a6Sfdy      csBundle(1).rfWen := false.B
305d91483a6Sfdy      csBundle(1).fpWen := false.B
306d91483a6Sfdy      csBundle(1).vecWen := true.B
307d91483a6Sfdy    }
30817ec87f2SXuan Hu    is(UopSplitType.VEC_VXV) {
309d91483a6Sfdy      /*
310d91483a6Sfdy      FMV.D.X
311d91483a6Sfdy       */
312d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
313d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
314d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
315d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
316d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
317d91483a6Sfdy      csBundle(0).rfWen := false.B
318d91483a6Sfdy      csBundle(0).fpWen := true.B
319d91483a6Sfdy      csBundle(0).vecWen := false.B
320d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
321d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
322d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
323d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
324d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
325d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
326d91483a6Sfdy      csBundle(0).fpu.div := false.B
327d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
328d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
329d91483a6Sfdy      /*
330d91483a6Sfdy      LMUL
331d91483a6Sfdy       */
332d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
333d91483a6Sfdy        csBundle(i + 1).srcType(0) := SrcType.fp
334d91483a6Sfdy        csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U
335d91483a6Sfdy        csBundle(i + 1).lsrc(1) := src2 + i.U
336d91483a6Sfdy        csBundle(i + 1).lsrc(2) := dest + i.U
337d91483a6Sfdy        csBundle(i + 1).ldest := dest + i.U
338d91483a6Sfdy        csBundle(i + 1).uopIdx := i.U
339d91483a6Sfdy      }
340d91483a6Sfdy    }
34117ec87f2SXuan Hu    is(UopSplitType.VEC_VVW) {
342d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
343d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src1 + i.U
344d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + i.U
345d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
346d91483a6Sfdy        csBundle(2 * i).ldest := dest + (2 * i).U
347d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
348d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1 + i.U
349d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
350d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
351d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
352d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
353d91483a6Sfdy      }
354d91483a6Sfdy    }
35517ec87f2SXuan Hu    is(UopSplitType.VEC_WVW) {
356d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
357d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src1 + i.U
358d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + (2 * i).U
359d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + (2 * i).U
360d91483a6Sfdy        csBundle(2 * i).ldest := dest + (2 * i).U
361d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
362d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1 + i.U
363d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U
364d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U
365d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U
366d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
367d91483a6Sfdy      }
368d91483a6Sfdy    }
36917ec87f2SXuan Hu    is(UopSplitType.VEC_VXW) {
370d91483a6Sfdy      /*
371d91483a6Sfdy      FMV.D.X
372d91483a6Sfdy       */
373d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
374d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
375d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
376d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
377d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
378d91483a6Sfdy      csBundle(0).rfWen := false.B
379d91483a6Sfdy      csBundle(0).fpWen := true.B
380d91483a6Sfdy      csBundle(0).vecWen := false.B
381d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
382d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
383d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
384d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
385d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
386d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
387d91483a6Sfdy      csBundle(0).fpu.div := false.B
388d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
389d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
390d91483a6Sfdy
391d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
392d91483a6Sfdy        csBundle(2 * i + 1).srcType(0) := SrcType.fp
393d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := FP_TMP_REG_MV.U
394d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
395d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U
396d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i).U
397d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
398d91483a6Sfdy        csBundle(2 * i + 2).srcType(0) := SrcType.fp
399d91483a6Sfdy        csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U
400d91483a6Sfdy        csBundle(2 * i + 2).lsrc(1) := src2 + i.U
401d91483a6Sfdy        csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U
402d91483a6Sfdy        csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U
403d91483a6Sfdy        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
404d91483a6Sfdy      }
405d91483a6Sfdy    }
40617ec87f2SXuan Hu    is(UopSplitType.VEC_WXW) {
407d91483a6Sfdy      /*
408d91483a6Sfdy      FMV.D.X
409d91483a6Sfdy       */
410d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
411d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
412d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
413d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
414d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
415d91483a6Sfdy      csBundle(0).rfWen := false.B
416d91483a6Sfdy      csBundle(0).fpWen := true.B
417d91483a6Sfdy      csBundle(0).vecWen := false.B
418d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
419d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
420d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
421d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
422d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
423d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
424d91483a6Sfdy      csBundle(0).fpu.div := false.B
425d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
426d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
427d91483a6Sfdy
428d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
429d91483a6Sfdy        csBundle(2 * i + 1).srcType(0) := SrcType.fp
430d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := FP_TMP_REG_MV.U
431d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U
432d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U
433d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + (2 * i).U
434d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
435d91483a6Sfdy        csBundle(2 * i + 2).srcType(0) := SrcType.fp
436d91483a6Sfdy        csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U
437d91483a6Sfdy        csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U
438d91483a6Sfdy        csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U
439d91483a6Sfdy        csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U
440d91483a6Sfdy        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
441d91483a6Sfdy      }
442d91483a6Sfdy    }
44317ec87f2SXuan Hu    is(UopSplitType.VEC_WVV) {
444d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
445d91483a6Sfdy
446d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src1 + i.U
447d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + (2 * i).U
448d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + i.U
449d6f9198fSXuan Hu        csBundle(2 * i).ldest := dest + i.U
450d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
451d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1 + i.U
452d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U
453d6f9198fSXuan Hu        csBundle(2 * i + 1).lsrc(2) := dest + i.U
454d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + i.U
455d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
456d91483a6Sfdy      }
457d91483a6Sfdy    }
45817ec87f2SXuan Hu    is(UopSplitType.VEC_WXV) {
459d91483a6Sfdy      /*
460d91483a6Sfdy      FMV.D.X
461d91483a6Sfdy       */
462d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
463d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
464d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
465d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
466d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
467d91483a6Sfdy      csBundle(0).rfWen := false.B
468d91483a6Sfdy      csBundle(0).fpWen := true.B
469d91483a6Sfdy      csBundle(0).vecWen := false.B
470d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
471d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
472d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
473d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
474d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
475d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
476d91483a6Sfdy      csBundle(0).fpu.div := false.B
477d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
478d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
479d91483a6Sfdy
480d91483a6Sfdy      for (i <- 0 until MAX_VLMUL / 2) {
481d91483a6Sfdy        csBundle(2 * i + 1).srcType(0) := SrcType.fp
482d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := FP_TMP_REG_MV.U
483d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U
484d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + i.U
485d6f9198fSXuan Hu        csBundle(2 * i + 1).ldest := dest + i.U
486d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
487d91483a6Sfdy        csBundle(2 * i + 2).srcType(0) := SrcType.fp
488d91483a6Sfdy        csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U
489d91483a6Sfdy        csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U
490d6f9198fSXuan Hu        csBundle(2 * i + 2).lsrc(2) := dest + i.U
491d91483a6Sfdy        csBundle(2 * i + 2).ldest := dest + i.U
492d91483a6Sfdy        csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
493d91483a6Sfdy      }
494d91483a6Sfdy    }
49517ec87f2SXuan Hu    is(UopSplitType.VEC_VVM) {
496d91483a6Sfdy      csBundle(0).lsrc(2) := dest
497d6f9198fSXuan Hu      csBundle(0).ldest := dest
498d91483a6Sfdy      csBundle(0).uopIdx := 0.U
499d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
500d91483a6Sfdy        csBundle(i).lsrc(0) := src1 + i.U
501d91483a6Sfdy        csBundle(i).lsrc(1) := src2 + i.U
502d6f9198fSXuan Hu        csBundle(i).lsrc(2) := dest
503d6f9198fSXuan Hu        csBundle(i).ldest := dest
504d91483a6Sfdy        csBundle(i).uopIdx := i.U
505d91483a6Sfdy      }
506d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest
507d91483a6Sfdy    }
50817ec87f2SXuan Hu    is(UopSplitType.VEC_VXM) {
509d91483a6Sfdy      /*
510d91483a6Sfdy      FMV.D.X
511d91483a6Sfdy       */
512d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
513d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
514d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
515d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
516d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
517d91483a6Sfdy      csBundle(0).rfWen := false.B
518d91483a6Sfdy      csBundle(0).fpWen := true.B
519d91483a6Sfdy      csBundle(0).vecWen := false.B
520d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
521d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
522d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
523d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
524d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
525d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
526d91483a6Sfdy      csBundle(0).fpu.div := false.B
527d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
528d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
529d91483a6Sfdy      //LMUL
530d91483a6Sfdy      csBundle(1).srcType(0) := SrcType.fp
531d91483a6Sfdy      csBundle(1).lsrc(0) := FP_TMP_REG_MV.U
532d91483a6Sfdy      csBundle(1).lsrc(2) := dest
533d6f9198fSXuan Hu      csBundle(1).ldest := dest
534d91483a6Sfdy      csBundle(1).uopIdx := 0.U
535d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
536d91483a6Sfdy        csBundle(i + 1).srcType(0) := SrcType.fp
537d91483a6Sfdy        csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U
538d91483a6Sfdy        csBundle(i + 1).lsrc(1) := src2 + i.U
539d6f9198fSXuan Hu        csBundle(i + 1).lsrc(2) := dest
540d6f9198fSXuan Hu        csBundle(i + 1).ldest := dest
541d91483a6Sfdy        csBundle(i + 1).uopIdx := i.U
542d91483a6Sfdy      }
543d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest
544d91483a6Sfdy    }
54517ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDE1UP) {
546d91483a6Sfdy      /*
547d91483a6Sfdy      FMV.D.X
548d91483a6Sfdy       */
549d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
550d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
551d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
552d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
553d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
554d91483a6Sfdy      csBundle(0).rfWen := false.B
555d91483a6Sfdy      csBundle(0).fpWen := true.B
556d91483a6Sfdy      csBundle(0).vecWen := false.B
557d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
558d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
559d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
560d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
561d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
562d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
563d91483a6Sfdy      csBundle(0).fpu.div := false.B
564d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
565d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
566d91483a6Sfdy      //LMUL
567d91483a6Sfdy      csBundle(1).srcType(0) := SrcType.fp
568d91483a6Sfdy      csBundle(1).lsrc(0) := FP_TMP_REG_MV.U
569d91483a6Sfdy      csBundle(1).lsrc(2) := dest
570d91483a6Sfdy      csBundle(1).ldest := dest
571d91483a6Sfdy      csBundle(1).uopIdx := 0.U
572d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
573d91483a6Sfdy        csBundle(i + 1).srcType(0) := SrcType.vp
574d91483a6Sfdy        csBundle(i + 1).lsrc(0) := src2 + (i - 1).U
575d91483a6Sfdy        csBundle(i + 1).lsrc(1) := src2 + i.U
576d91483a6Sfdy        csBundle(i + 1).lsrc(2) := dest + i.U
577d91483a6Sfdy        csBundle(i + 1).ldest := dest + i.U
578d91483a6Sfdy        csBundle(i + 1).uopIdx := i.U
579d91483a6Sfdy      }
580d91483a6Sfdy    }
58117ec87f2SXuan Hu    is(UopSplitType.VEC_FSLIDE1UP) {
582d91483a6Sfdy      //LMUL
583d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.fp
584d91483a6Sfdy      csBundle(0).lsrc(0) := src1
585d91483a6Sfdy      csBundle(0).lsrc(1) := src2
586d91483a6Sfdy      csBundle(0).lsrc(2) := dest
587d91483a6Sfdy      csBundle(0).ldest := dest
588d91483a6Sfdy      csBundle(0).uopIdx := 0.U
589d91483a6Sfdy      for (i <- 1 until MAX_VLMUL) {
590d91483a6Sfdy        csBundle(i).srcType(0) := SrcType.vp
591d91483a6Sfdy        csBundle(i).lsrc(0) := src2 + (i - 1).U
592d91483a6Sfdy        csBundle(i).lsrc(1) := src2 + i.U
593d91483a6Sfdy        csBundle(i).lsrc(2) := dest + i.U
594d91483a6Sfdy        csBundle(i).ldest := dest + i.U
595d91483a6Sfdy        csBundle(i).uopIdx := i.U
596d91483a6Sfdy      }
597d91483a6Sfdy    }
59817ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDE1DOWN) { // lmul+lmul = 16
599d91483a6Sfdy      /*
600d91483a6Sfdy      FMV.D.X
601d91483a6Sfdy       */
602d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
603d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
604d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
605d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
606d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
607d91483a6Sfdy      csBundle(0).rfWen := false.B
608d91483a6Sfdy      csBundle(0).fpWen := true.B
609d91483a6Sfdy      csBundle(0).vecWen := false.B
610d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
611d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
612d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
613d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
614d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
615d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
616d91483a6Sfdy      csBundle(0).fpu.div := false.B
617d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
618d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
619d91483a6Sfdy      //LMUL
620d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
621d91483a6Sfdy        csBundle(2 * i + 1).srcType(0) := SrcType.vp
622d91483a6Sfdy        csBundle(2 * i + 1).srcType(1) := SrcType.vp
623d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src2 + (i + 1).U
624d91483a6Sfdy        csBundle(2 * i + 1).lsrc(1) := src2 + i.U
625d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := dest + i.U
626d91483a6Sfdy        csBundle(2 * i + 1).ldest := VECTOR_TMP_REG_LMUL.U
627d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i).U
628d91483a6Sfdy        if (2 * i + 2 < MAX_VLMUL * 2) {
629d91483a6Sfdy          csBundle(2 * i + 2).srcType(0) := SrcType.fp
630d91483a6Sfdy          csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U
631d91483a6Sfdy          // csBundle(2 * i + 2).lsrc(1) := src2 + i.U         // DontCare
632d91483a6Sfdy          csBundle(2 * i + 2).lsrc(2) := VECTOR_TMP_REG_LMUL.U
633d91483a6Sfdy          csBundle(2 * i + 2).ldest := dest + i.U
634d91483a6Sfdy          csBundle(2 * i + 2).uopIdx := (2 * i + 1).U
635d91483a6Sfdy        }
636d91483a6Sfdy      }
637d91483a6Sfdy      csBundle(numOfUop - 1.U).srcType(0) := SrcType.fp
638d91483a6Sfdy      csBundle(numOfUop - 1.U).lsrc(0) := FP_TMP_REG_MV.U
639d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U
640d91483a6Sfdy    }
64117ec87f2SXuan Hu    is(UopSplitType.VEC_FSLIDE1DOWN) {
642d91483a6Sfdy      //LMUL
643d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
644d91483a6Sfdy        csBundle(2 * i).srcType(0) := SrcType.vp
645d91483a6Sfdy        csBundle(2 * i).srcType(1) := SrcType.vp
646d91483a6Sfdy        csBundle(2 * i).lsrc(0) := src2 + (i + 1).U
647d91483a6Sfdy        csBundle(2 * i).lsrc(1) := src2 + i.U
648d91483a6Sfdy        csBundle(2 * i).lsrc(2) := dest + i.U
649d91483a6Sfdy        csBundle(2 * i).ldest := VECTOR_TMP_REG_LMUL.U
650d91483a6Sfdy        csBundle(2 * i).uopIdx := (2 * i).U
651d91483a6Sfdy        csBundle(2 * i + 1).srcType(0) := SrcType.fp
652d91483a6Sfdy        csBundle(2 * i + 1).lsrc(0) := src1
653d91483a6Sfdy        csBundle(2 * i + 1).lsrc(2) := VECTOR_TMP_REG_LMUL.U
654d91483a6Sfdy        csBundle(2 * i + 1).ldest := dest + i.U
655d91483a6Sfdy        csBundle(2 * i + 1).uopIdx := (2 * i + 1).U
656d91483a6Sfdy      }
657d91483a6Sfdy      csBundle(numOfUop - 1.U).srcType(0) := SrcType.fp
658d91483a6Sfdy      csBundle(numOfUop - 1.U).lsrc(0) := src1
659d91483a6Sfdy      csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U
660d91483a6Sfdy    }
66117ec87f2SXuan Hu    is(UopSplitType.VEC_VRED) {
662d91483a6Sfdy      when(simple.io.enq.vtype.vlmul === "b001".U) {
663d91483a6Sfdy        csBundle(0).srcType(2) := SrcType.DC
664d91483a6Sfdy        csBundle(0).lsrc(0) := src2 + 1.U
665d91483a6Sfdy        csBundle(0).lsrc(1) := src2
666d91483a6Sfdy        csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
667d91483a6Sfdy        csBundle(0).uopIdx := 0.U
668d91483a6Sfdy      }
669d91483a6Sfdy      when(simple.io.enq.vtype.vlmul === "b010".U) {
670d91483a6Sfdy        csBundle(0).srcType(2) := SrcType.DC
671d91483a6Sfdy        csBundle(0).lsrc(0) := src2 + 1.U
672d91483a6Sfdy        csBundle(0).lsrc(1) := src2
673d91483a6Sfdy        csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U
674d91483a6Sfdy        csBundle(0).uopIdx := 0.U
675d91483a6Sfdy
676d91483a6Sfdy        csBundle(1).srcType(2) := SrcType.DC
677d91483a6Sfdy        csBundle(1).lsrc(0) := src2 + 3.U
678d91483a6Sfdy        csBundle(1).lsrc(1) := src2 + 2.U
679d91483a6Sfdy        csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U
680d91483a6Sfdy        csBundle(1).uopIdx := 1.U
681d91483a6Sfdy
682d91483a6Sfdy        csBundle(2).srcType(2) := SrcType.DC
683d91483a6Sfdy        csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U
684d91483a6Sfdy        csBundle(2).lsrc(1) := VECTOR_TMP_REG_LMUL.U
685d91483a6Sfdy        csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U
686d91483a6Sfdy        csBundle(2).uopIdx := 2.U
687d91483a6Sfdy      }
688d91483a6Sfdy      when(simple.io.enq.vtype.vlmul === "b011".U) {
689d91483a6Sfdy        for (i <- 0 until MAX_VLMUL) {
690d91483a6Sfdy          if (i < MAX_VLMUL - MAX_VLMUL / 2) {
691d91483a6Sfdy            csBundle(i).lsrc(0) := src2 + (i * 2 + 1).U
692d91483a6Sfdy            csBundle(i).lsrc(1) := src2 + (i * 2).U
693d91483a6Sfdy            csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
694d91483a6Sfdy          } else if (i < MAX_VLMUL - MAX_VLMUL / 4) {
695d91483a6Sfdy            csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2 + 1).U
696d91483a6Sfdy            csBundle(i).lsrc(1) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2).U
697d91483a6Sfdy            csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U
698d91483a6Sfdy          } else if (i < MAX_VLMUL - MAX_VLMUL / 8) {
699d91483a6Sfdy            csBundle(6).lsrc(0) := (VECTOR_TMP_REG_LMUL + 5).U
700d91483a6Sfdy            csBundle(6).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U
701d91483a6Sfdy            csBundle(6).ldest := (VECTOR_TMP_REG_LMUL + 6).U
702d91483a6Sfdy          }
703d91483a6Sfdy          csBundle(i).srcType(2) := SrcType.DC
704d91483a6Sfdy          csBundle(i).uopIdx := i.U
705d91483a6Sfdy        }
706d91483a6Sfdy      }
707d91483a6Sfdy      when(simple.io.enq.vtype.vlmul.orR()) {
708d91483a6Sfdy        csBundle(numOfUop - 1.U).srcType(2) := SrcType.vp
709d91483a6Sfdy        csBundle(numOfUop - 1.U).lsrc(0) := src1
710d91483a6Sfdy        csBundle(numOfUop - 1.U).lsrc(1) := VECTOR_TMP_REG_LMUL.U + numOfUop - 2.U
711d91483a6Sfdy        csBundle(numOfUop - 1.U).lsrc(2) := dest
712d91483a6Sfdy        csBundle(numOfUop - 1.U).ldest := dest
713d91483a6Sfdy        csBundle(numOfUop - 1.U).uopIdx := numOfUop - 1.U
714d91483a6Sfdy      }
715d91483a6Sfdy    }
716d91483a6Sfdy
71717ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDEUP) {
718d91483a6Sfdy      // FMV.D.X
719d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
720d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
721d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
722d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
723d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
724d91483a6Sfdy      csBundle(0).rfWen := false.B
725d91483a6Sfdy      csBundle(0).fpWen := true.B
726d91483a6Sfdy      csBundle(0).vecWen := false.B
727d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
728d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
729d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
730d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
731d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
732d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
733d91483a6Sfdy      csBundle(0).fpu.div := false.B
734d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
735d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
736d91483a6Sfdy      // LMUL
737d91483a6Sfdy      for (i <- 0 until MAX_VLMUL)
738d91483a6Sfdy        for (j <- 0 to i) {
7394ee69032SzhanglyGit          val old_vd = if (j == 0) {
7404ee69032SzhanglyGit            dest + i.U
7414ee69032SzhanglyGit          } else (VECTOR_TMP_REG_LMUL + j - 1).U
7424ee69032SzhanglyGit          val vd = if (j == i) {
7434ee69032SzhanglyGit            dest + i.U
7444ee69032SzhanglyGit          } else (VECTOR_TMP_REG_LMUL + j).U
745d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).srcType(0) := SrcType.fp
746d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).lsrc(0) := FP_TMP_REG_MV.U
747d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).lsrc(1) := src2 + j.U
748d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).lsrc(2) := old_vd
749d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).ldest := vd
750d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j + 1).uopIdx := (i * (i + 1) / 2 + j).U
751d91483a6Sfdy        }
752d91483a6Sfdy    }
753d91483a6Sfdy
75417ec87f2SXuan Hu    is(UopSplitType.VEC_ISLIDEUP) {
755d91483a6Sfdy      // LMUL
756d91483a6Sfdy      for (i <- 0 until MAX_VLMUL)
757d91483a6Sfdy        for (j <- 0 to i) {
7584ee69032SzhanglyGit          val old_vd = if (j == 0) {
7594ee69032SzhanglyGit            dest + i.U
7604ee69032SzhanglyGit          } else (VECTOR_TMP_REG_LMUL + j - 1).U
7614ee69032SzhanglyGit          val vd = if (j == i) {
7624ee69032SzhanglyGit            dest + i.U
7634ee69032SzhanglyGit          } else (VECTOR_TMP_REG_LMUL + j).U
764d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j).lsrc(1) := src2 + j.U
765d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j).lsrc(2) := old_vd
766d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j).ldest := vd
767d91483a6Sfdy          csBundle(i * (i + 1) / 2 + j).uopIdx := (i * (i + 1) / 2 + j).U
768d91483a6Sfdy        }
769d91483a6Sfdy    }
770d91483a6Sfdy
77117ec87f2SXuan Hu    is(UopSplitType.VEC_SLIDEDOWN) {
772d91483a6Sfdy      // FMV.D.X
773d91483a6Sfdy      csBundle(0).srcType(0) := SrcType.reg
774d91483a6Sfdy      csBundle(0).srcType(1) := SrcType.imm
775d91483a6Sfdy      csBundle(0).lsrc(1) := 0.U
776d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
777d91483a6Sfdy      csBundle(0).fuType := FuType.i2f.U
778d91483a6Sfdy      csBundle(0).rfWen := false.B
779d91483a6Sfdy      csBundle(0).fpWen := true.B
780d91483a6Sfdy      csBundle(0).vecWen := false.B
781d91483a6Sfdy      csBundle(0).fpu.isAddSub := false.B
782d91483a6Sfdy      csBundle(0).fpu.typeTagIn := FPU.D
783d91483a6Sfdy      csBundle(0).fpu.typeTagOut := FPU.D
784d91483a6Sfdy      csBundle(0).fpu.fromInt := true.B
785d91483a6Sfdy      csBundle(0).fpu.wflags := false.B
786d91483a6Sfdy      csBundle(0).fpu.fpWen := true.B
787d91483a6Sfdy      csBundle(0).fpu.div := false.B
788d91483a6Sfdy      csBundle(0).fpu.sqrt := false.B
789d91483a6Sfdy      csBundle(0).fpu.fcvt := false.B
790d91483a6Sfdy      // LMUL
791d91483a6Sfdy      for (i <- 0 until MAX_VLMUL)
792d91483a6Sfdy        for (j <- (0 to i).reverse) {
793d91483a6Sfdy          when(i.U < lmul) {
7944ee69032SzhanglyGit            val old_vd = if (j == 0) {
7954ee69032SzhanglyGit              dest + lmul - 1.U - i.U
7964ee69032SzhanglyGit            } else (VECTOR_TMP_REG_LMUL + j - 1).U
7974ee69032SzhanglyGit            val vd = if (j == i) {
7984ee69032SzhanglyGit              dest + lmul - 1.U - i.U
7994ee69032SzhanglyGit            } else (VECTOR_TMP_REG_LMUL + j).U
800d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).srcType(0) := SrcType.fp
801d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(0) := FP_TMP_REG_MV.U
802d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(1) := src2 + lmul - 1.U - j.U
803d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(2) := old_vd
804d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).ldest := vd
805d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).uopIdx := numOfUop - (i * (i + 1) / 2 + i - j + 2).U
806d91483a6Sfdy          }
807d91483a6Sfdy        }
808d91483a6Sfdy    }
809d91483a6Sfdy
81017ec87f2SXuan Hu    is(UopSplitType.VEC_ISLIDEDOWN) {
811d91483a6Sfdy      // LMUL
812d91483a6Sfdy      for (i <- 0 until MAX_VLMUL)
813d91483a6Sfdy        for (j <- (0 to i).reverse) {
814d91483a6Sfdy          when(i.U < lmul) {
8154ee69032SzhanglyGit            val old_vd = if (j == 0) {
8164ee69032SzhanglyGit              dest + lmul - 1.U - i.U
8174ee69032SzhanglyGit            } else (VECTOR_TMP_REG_LMUL + j - 1).U
8184ee69032SzhanglyGit            val vd = if (j == i) {
8194ee69032SzhanglyGit              dest + lmul - 1.U - i.U
8204ee69032SzhanglyGit            } else (VECTOR_TMP_REG_LMUL + j).U
821d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(1) := src2 + lmul - 1.U - j.U
822d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(2) := old_vd
823d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).ldest := vd
824d91483a6Sfdy            csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).uopIdx := numOfUop - (i * (i + 1) / 2 + i - j + 1).U
825d91483a6Sfdy          }
826d91483a6Sfdy        }
827d91483a6Sfdy    }
828d91483a6Sfdy
82917ec87f2SXuan Hu    is(UopSplitType.VEC_M0X) {
830d91483a6Sfdy      // LMUL
831d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
832d91483a6Sfdy        val srcType0 = if (i == 0) SrcType.DC else SrcType.vp
833d91483a6Sfdy        val ldest = (VECTOR_TMP_REG_LMUL + i).U
834d91483a6Sfdy        csBundle(i).srcType(0) := srcType0
835d91483a6Sfdy        csBundle(i).srcType(1) := SrcType.vp
836d91483a6Sfdy        csBundle(i).rfWen := false.B
837d91483a6Sfdy        csBundle(i).vecWen := true.B
838d91483a6Sfdy        csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U
839d91483a6Sfdy        csBundle(i).lsrc(1) := src2
840d91483a6Sfdy        // csBundle(i).lsrc(2) := dest + i.U  DontCare
841d91483a6Sfdy        csBundle(i).ldest := ldest
842d91483a6Sfdy        csBundle(i).uopIdx := i.U
843d91483a6Sfdy      }
844d91483a6Sfdy      csBundle(lmul - 1.U).vecWen := false.B
845d91483a6Sfdy      csBundle(lmul - 1.U).fpWen := true.B
846d91483a6Sfdy      csBundle(lmul - 1.U).ldest := FP_TMP_REG_MV.U
847d91483a6Sfdy      // FMV_X_D
848d91483a6Sfdy      csBundle(lmul).srcType(0) := SrcType.fp
849d91483a6Sfdy      csBundle(lmul).srcType(1) := SrcType.imm
850d91483a6Sfdy      csBundle(lmul).lsrc(0) := FP_TMP_REG_MV.U
851d91483a6Sfdy      csBundle(lmul).lsrc(1) := 0.U
852d91483a6Sfdy      csBundle(lmul).ldest := dest
853d91483a6Sfdy      csBundle(lmul).fuType := FuType.fmisc.U
854d91483a6Sfdy      csBundle(lmul).rfWen := true.B
855d91483a6Sfdy      csBundle(lmul).fpWen := false.B
856d91483a6Sfdy      csBundle(lmul).vecWen := false.B
857d91483a6Sfdy      csBundle(lmul).fpu.isAddSub := false.B
858d91483a6Sfdy      csBundle(lmul).fpu.typeTagIn := FPU.D
859d91483a6Sfdy      csBundle(lmul).fpu.typeTagOut := FPU.D
860d91483a6Sfdy      csBundle(lmul).fpu.fromInt := false.B
861d91483a6Sfdy      csBundle(lmul).fpu.wflags := false.B
862d91483a6Sfdy      csBundle(lmul).fpu.fpWen := false.B
863d91483a6Sfdy      csBundle(lmul).fpu.div := false.B
864d91483a6Sfdy      csBundle(lmul).fpu.sqrt := false.B
865d91483a6Sfdy      csBundle(lmul).fpu.fcvt := false.B
866d91483a6Sfdy    }
867d91483a6Sfdy
86817ec87f2SXuan Hu    is(UopSplitType.VEC_MVV) {
869d91483a6Sfdy      // LMUL
870d91483a6Sfdy      for (i <- 0 until MAX_VLMUL) {
871d91483a6Sfdy        val srcType0 = if (i == 0) SrcType.DC else SrcType.vp
872d91483a6Sfdy        csBundle(i * 2 + 0).srcType(0) := srcType0
873d91483a6Sfdy        csBundle(i * 2 + 0).srcType(1) := SrcType.vp
874d91483a6Sfdy        csBundle(i * 2 + 0).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U
875d91483a6Sfdy        csBundle(i * 2 + 0).lsrc(1) := src2
876d91483a6Sfdy        csBundle(i * 2 + 0).lsrc(2) := dest + i.U
877d91483a6Sfdy        csBundle(i * 2 + 0).ldest := dest + i.U
878d91483a6Sfdy        csBundle(i * 2 + 0).uopIdx := (i * 2 + 0).U
879d91483a6Sfdy
880d91483a6Sfdy        csBundle(i * 2 + 1).srcType(0) := srcType0
881d91483a6Sfdy        csBundle(i * 2 + 1).srcType(1) := SrcType.vp
882d91483a6Sfdy        csBundle(i * 2 + 1).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U
883d91483a6Sfdy        csBundle(i * 2 + 1).lsrc(1) := src2
884d91483a6Sfdy        // csBundle(i).lsrc(2) := dest + i.U  DontCare
885d91483a6Sfdy        csBundle(i * 2 + 1).ldest := (VECTOR_TMP_REG_LMUL + i).U
886d91483a6Sfdy        csBundle(i * 2 + 1).uopIdx := (i * 2 + 1).U
887d91483a6Sfdy      }
888d91483a6Sfdy    }
889d91483a6Sfdy
89017ec87f2SXuan Hu    is(UopSplitType.VEC_M0X_VFIRST) {
891d91483a6Sfdy      // LMUL
892d91483a6Sfdy      csBundle(0).rfWen := false.B
893d91483a6Sfdy      csBundle(0).fpWen := true.B
894d91483a6Sfdy      csBundle(0).ldest := FP_TMP_REG_MV.U
895d91483a6Sfdy      // FMV_X_D
896d91483a6Sfdy      csBundle(1).srcType(0) := SrcType.fp
897d91483a6Sfdy      csBundle(1).srcType(1) := SrcType.imm
898d91483a6Sfdy      csBundle(1).lsrc(0) := FP_TMP_REG_MV.U
899d91483a6Sfdy      csBundle(1).lsrc(1) := 0.U
900d91483a6Sfdy      csBundle(1).ldest := dest
901d91483a6Sfdy      csBundle(1).fuType := FuType.fmisc.U
902d91483a6Sfdy      csBundle(1).rfWen := true.B
903d91483a6Sfdy      csBundle(1).fpWen := false.B
904d91483a6Sfdy      csBundle(1).vecWen := false.B
905d91483a6Sfdy      csBundle(1).fpu.isAddSub := false.B
906d91483a6Sfdy      csBundle(1).fpu.typeTagIn := FPU.D
907d91483a6Sfdy      csBundle(1).fpu.typeTagOut := FPU.D
908d91483a6Sfdy      csBundle(1).fpu.fromInt := false.B
909d91483a6Sfdy      csBundle(1).fpu.wflags := false.B
910d91483a6Sfdy      csBundle(1).fpu.fpWen := false.B
911d91483a6Sfdy      csBundle(1).fpu.div := false.B
912d91483a6Sfdy      csBundle(1).fpu.sqrt := false.B
913d91483a6Sfdy      csBundle(1).fpu.fcvt := false.B
914d91483a6Sfdy    }
9154ee69032SzhanglyGit    is(UopSplitType.VEC_US_LD) {
9164ee69032SzhanglyGit      /*
9174ee69032SzhanglyGit      FMV.D.X
9184ee69032SzhanglyGit       */
9194ee69032SzhanglyGit      csBundle(0).srcType(0) := SrcType.reg
9204ee69032SzhanglyGit      csBundle(0).srcType(1) := SrcType.imm
9214ee69032SzhanglyGit      csBundle(0).lsrc(1) := 0.U
9224ee69032SzhanglyGit      csBundle(0).ldest := FP_TMP_REG_MV.U
9234ee69032SzhanglyGit      csBundle(0).fuType := FuType.i2f.U
9244ee69032SzhanglyGit      csBundle(0).rfWen := false.B
9254ee69032SzhanglyGit      csBundle(0).fpWen := true.B
9264ee69032SzhanglyGit      csBundle(0).vecWen := false.B
9274ee69032SzhanglyGit      csBundle(0).fpu.isAddSub := false.B
9284ee69032SzhanglyGit      csBundle(0).fpu.typeTagIn := FPU.D
9294ee69032SzhanglyGit      csBundle(0).fpu.typeTagOut := FPU.D
9304ee69032SzhanglyGit      csBundle(0).fpu.fromInt := true.B
9314ee69032SzhanglyGit      csBundle(0).fpu.wflags := false.B
9324ee69032SzhanglyGit      csBundle(0).fpu.fpWen := true.B
9334ee69032SzhanglyGit      csBundle(0).fpu.div := false.B
9344ee69032SzhanglyGit      csBundle(0).fpu.sqrt := false.B
9354ee69032SzhanglyGit      csBundle(0).fpu.fcvt := false.B
9364ee69032SzhanglyGit      //LMUL
9374ee69032SzhanglyGit      for (i <- 0 until MAX_VLMUL) {
9384ee69032SzhanglyGit        csBundle(i + 1).srcType(0) := SrcType.fp
9394ee69032SzhanglyGit        csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U
9404ee69032SzhanglyGit        csBundle(i + 1).ldest := dest + i.U
9414ee69032SzhanglyGit        csBundle(i + 1).uopIdx := i.U
9424ee69032SzhanglyGit      }
9434ee69032SzhanglyGit    }
944d91483a6Sfdy  }
945d91483a6Sfdy
946d91483a6Sfdy  //uops dispatch
947d91483a6Sfdy  val normal :: ext :: Nil = Enum(2)
948d91483a6Sfdy  val stateReg = RegInit(normal)
949d91483a6Sfdy  val uopRes = RegInit(0.U)
950d91483a6Sfdy
951d91483a6Sfdy  //readyFromRename Counter
952d91483a6Sfdy  val readyCounter = PriorityMuxDefault(io.readyFromRename.map(x => !x).zip((0 to (RenameWidth - 1)).map(_.U)), RenameWidth.U)
953d91483a6Sfdy
954d91483a6Sfdy  switch(stateReg) {
955d91483a6Sfdy    is(normal) {
956d91483a6Sfdy      stateReg := Mux(io.validFromIBuf(0) && (numOfUop > readyCounter) && (readyCounter =/= 0.U), ext, normal)
957d91483a6Sfdy    }
958d91483a6Sfdy    is(ext) {
959d91483a6Sfdy      stateReg := Mux(io.validFromIBuf(0) && (uopRes > readyCounter), ext, normal)
960d91483a6Sfdy    }
961d91483a6Sfdy  }
962d91483a6Sfdy
963d91483a6Sfdy  val uopRes0 = Mux(stateReg === normal, numOfUop, uopRes)
964d91483a6Sfdy  val uopResJudge = Mux(stateReg === normal,
965d91483a6Sfdy    io.validFromIBuf(0) && (readyCounter =/= 0.U) && (uopRes0 > readyCounter),
966d91483a6Sfdy    io.validFromIBuf(0) && (uopRes0 > readyCounter))
967d91483a6Sfdy  uopRes := Mux(uopResJudge, uopRes0 - readyCounter, 0.U)
968d91483a6Sfdy
969d91483a6Sfdy  for(i <- 0 until RenameWidth) {
970d91483a6Sfdy    decodedInsts(i) := MuxCase(csBundle(i), Seq(
971d91483a6Sfdy      (stateReg === normal) -> csBundle(i),
972d91483a6Sfdy      (stateReg === ext) -> Mux((i.U + numOfUop -uopRes) < maxUopSize.U, csBundle(i.U + numOfUop - uopRes), csBundle(maxUopSize - 1))
973d91483a6Sfdy    ))
974d91483a6Sfdy  }
975d91483a6Sfdy
976d91483a6Sfdy
977d91483a6Sfdy  val validSimple = Wire(Vec(DecodeWidth - 1, Bool()))
978d91483a6Sfdy  validSimple.zip(io.validFromIBuf.drop(1).zip(io.isComplex)).map{ case (dst, (src1, src2)) => dst := src1 && !src2 }
979d91483a6Sfdy  val notInf = Wire(Vec(DecodeWidth - 1, Bool()))
980d91483a6Sfdy  notInf.zip(io.validFromIBuf.drop(1).zip(validSimple)).map{ case (dst, (src1, src2)) => dst := !src1 || src2 }
981d91483a6Sfdy  val notInfVec = Wire(Vec(DecodeWidth, Bool()))
982d91483a6Sfdy  notInfVec.drop(1).zip(0 until DecodeWidth - 1).map{ case (dst, i) => dst := Cat(notInf.take(i + 1)).andR}
983d91483a6Sfdy  notInfVec(0) := true.B
984d91483a6Sfdy
985d91483a6Sfdy  complexNum := Mux(io.validFromIBuf(0) && readyCounter.orR ,
986d91483a6Sfdy    Mux(uopRes0 > readyCounter, readyCounter, uopRes0),
987d91483a6Sfdy    1.U)
988d91483a6Sfdy  validToRename.zipWithIndex.foreach{
989d91483a6Sfdy    case(dst, i) =>
990d91483a6Sfdy      dst := MuxCase(false.B, Seq(
991d91483a6Sfdy        (io.validFromIBuf(0) && uopRes0 > readyCounter   ) -> Mux(readyCounter > i.U, true.B, false.B),
992d91483a6Sfdy        (io.validFromIBuf(0) && !(uopRes0 > readyCounter)) -> Mux(complexNum > i.U, true.B, validSimple(i.U - complexNum) && notInfVec(i.U - complexNum) && io.readyFromRename(i)),
993d91483a6Sfdy      ))
994d91483a6Sfdy  }
995d91483a6Sfdy
996d91483a6Sfdy  readyToIBuf.zipWithIndex.foreach {
997d91483a6Sfdy    case (dst, i) =>
998d91483a6Sfdy      dst := MuxCase(true.B, Seq(
999d91483a6Sfdy        (io.validFromIBuf(0) && uopRes0 > readyCounter) -> false.B,
1000d91483a6Sfdy        (io.validFromIBuf(0) && !(uopRes0 > readyCounter)) -> (if (i==0) true.B else Mux(RenameWidth.U - complexNum >= i.U, notInfVec(i - 1) && validSimple(i - 1) && io.readyFromRename(i), false.B)),
1001d91483a6Sfdy      ))
1002d91483a6Sfdy  }
1003d91483a6Sfdy
1004d91483a6Sfdy  io.deq.decodedInsts := decodedInsts
1005d91483a6Sfdy  io.deq.isVset := isVset_u
1006d91483a6Sfdy  io.deq.complexNum := complexNum
1007d91483a6Sfdy  io.deq.validToRename := validToRename
1008d91483a6Sfdy  io.deq.readyToIBuf := readyToIBuf
1009d91483a6Sfdy
1010d91483a6Sfdy}
1011