xref: /XiangShan/src/main/scala/xiangshan/backend/decode/UopInfoGen.scala (revision e25c13fa2780b64c5c0511a27e35a31c4bf61b22)
17f9f0a79SzhanglyGit/***************************************************************************************
27f9f0a79SzhanglyGit  * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
37f9f0a79SzhanglyGit  * Copyright (c) 2020-2021 Peng Cheng Laboratory
47f9f0a79SzhanglyGit  *
57f9f0a79SzhanglyGit  * XiangShan is licensed under Mulan PSL v2.
67f9f0a79SzhanglyGit  * You can use this software according to the terms and conditions of the Mulan PSL v2.
77f9f0a79SzhanglyGit  * You may obtain a copy of Mulan PSL v2 at:
87f9f0a79SzhanglyGit  *          http://license.coscl.org.cn/MulanPSL2
97f9f0a79SzhanglyGit  *
107f9f0a79SzhanglyGit  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
117f9f0a79SzhanglyGit  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
127f9f0a79SzhanglyGit  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
137f9f0a79SzhanglyGit  *
147f9f0a79SzhanglyGit  * See the Mulan PSL v2 for more details.
157f9f0a79SzhanglyGit  ***************************************************************************************/
167f9f0a79SzhanglyGit
177f9f0a79SzhanglyGitpackage xiangshan.backend.decode
187f9f0a79SzhanglyGit
1983ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
207f9f0a79SzhanglyGitimport chisel3._
217f9f0a79SzhanglyGitimport chisel3.util._
227f9f0a79SzhanglyGitimport freechips.rocketchip.rocket.Instructions
237f9f0a79SzhanglyGitimport freechips.rocketchip.util.uintToBitPat
247f9f0a79SzhanglyGitimport utils._
257f9f0a79SzhanglyGitimport utility._
267f9f0a79SzhanglyGitimport xiangshan.ExceptionNO.illegalInstr
277f9f0a79SzhanglyGitimport xiangshan._
287f9f0a79SzhanglyGitimport xiangshan.backend.fu.fpu.FPU
297f9f0a79SzhanglyGitimport xiangshan.backend.fu.FuType
307f9f0a79SzhanglyGitimport freechips.rocketchip.rocket.Instructions._
317f9f0a79SzhanglyGitimport xiangshan.backend.Bundles.{DecodedInst, StaticInst}
327f9f0a79SzhanglyGitimport xiangshan.backend.fu.vector.Bundles.{VType, VLmul, VSew}
337f9f0a79SzhanglyGitimport yunsuan.VpermType
34c4501a6fSZiyue-Zhangimport chisel3.util.experimental.decode.{QMCMinimizer, TruthTable, decoder}
35c4501a6fSZiyue-Zhang
36c4501a6fSZiyue-Zhangclass strdiedLSNumOfUopTable() extends Module {
37c4501a6fSZiyue-Zhang  val src = IO(Input(UInt(5.W)))
38c4501a6fSZiyue-Zhang  val out = IO(Output(UInt(4.W)))
39c4501a6fSZiyue-Zhang  // strided load/store
40c4501a6fSZiyue-Zhang  var combVemulNf : Seq[(Int, Int, Int)] = Seq()
41c4501a6fSZiyue-Zhang  for (emul <- 0 until 4) {
42c4501a6fSZiyue-Zhang    for (nf <- 0 until 8) {
43c4501a6fSZiyue-Zhang      if ((1 << emul) * (nf + 1) <= 8) {
44c4501a6fSZiyue-Zhang        combVemulNf :+= (emul, nf, (1 << emul) * (nf + 1))
45c4501a6fSZiyue-Zhang      } else {
46c4501a6fSZiyue-Zhang        combVemulNf :+= (emul, nf, 0)
47c4501a6fSZiyue-Zhang      }
48c4501a6fSZiyue-Zhang    }
49c4501a6fSZiyue-Zhang  }
50c4501a6fSZiyue-Zhang  out := decoder(QMCMinimizer, src, TruthTable(combVemulNf.map {
51c4501a6fSZiyue-Zhang    case (emul, nf, uopNum) => (BitPat((emul << 3 | nf).U(5.W)), BitPat(uopNum.U(4.W)))
52c4501a6fSZiyue-Zhang  }, BitPat.N(4)))
53c4501a6fSZiyue-Zhang}
54c4501a6fSZiyue-Zhang
55c4501a6fSZiyue-Zhangclass indexedLSNumOfUopTable() extends Module {
56c4501a6fSZiyue-Zhang  val src = IO(Input(UInt(7.W)))
57c4501a6fSZiyue-Zhang  val out = IO(Output(UInt(7.W)))
58c4501a6fSZiyue-Zhang  // strided load/store
59c4501a6fSZiyue-Zhang  var combVemulNf : Seq[(Int, Int, Int, Int)] = Seq()
60c4501a6fSZiyue-Zhang  for (emul <- 0 until 4) {
61c4501a6fSZiyue-Zhang    for (lmul <- 0 until 4) {
62c4501a6fSZiyue-Zhang      var max_mul = if (lmul > emul) lmul else emul
63c4501a6fSZiyue-Zhang      for (nf <- 0 until 8) {
64c4501a6fSZiyue-Zhang        if ((1 << lmul) * (nf + 1) <= 8) {    // indexed load/store must ensure that the lmul * nf is less or equal to 8
65c4501a6fSZiyue-Zhang          combVemulNf :+= (emul, lmul, nf, (1 << max_mul) * (nf + 1))
66c4501a6fSZiyue-Zhang        } else {
67c4501a6fSZiyue-Zhang          combVemulNf :+= (emul, lmul, nf, 0)
68c4501a6fSZiyue-Zhang        }
69c4501a6fSZiyue-Zhang      }
70c4501a6fSZiyue-Zhang    }
71c4501a6fSZiyue-Zhang  }
72c4501a6fSZiyue-Zhang  out := decoder(QMCMinimizer, src, TruthTable(combVemulNf.map {
73c4501a6fSZiyue-Zhang    case (emul, lmul, nf, uopNum) => (BitPat((emul << 5 | lmul << 3 | nf).U(7.W)), BitPat(uopNum.U(7.W)))
74c4501a6fSZiyue-Zhang  }, BitPat.N(7)))
75c4501a6fSZiyue-Zhang}
767f9f0a79SzhanglyGit
777f9f0a79SzhanglyGitclass UopInfoGen (implicit p: Parameters) extends XSModule {
787f9f0a79SzhanglyGit  val io = IO(new UopInfoGenIO)
797f9f0a79SzhanglyGit
80c4501a6fSZiyue-Zhang  val stridedLSTable = Module(new strdiedLSNumOfUopTable)     // decoder for strided load/store
81c4501a6fSZiyue-Zhang  val indexedLSTable = Module(new indexedLSNumOfUopTable)     // decoder for indexed load/store
823235a9d8SZiyue-Zhang  val indexedLSWBTable = Module(new indexedLSNumOfUopTable)   // decoder for indexed load/store WB
83c4501a6fSZiyue-Zhang
8487dd4e0dSzhanglyGit  val typeOfSplit = io.in.preInfo.typeOfSplit
8587dd4e0dSzhanglyGit  val vsew = Cat(0.U(1.W), io.in.preInfo.vsew)
8687dd4e0dSzhanglyGit  val veew = Cat(0.U(1.W), io.in.preInfo.vwidth(1, 0))
870a34fc22SZiyue Zhang  val vmvn = io.in.preInfo.vmvn
8806cb2bc1Sweidingliu  val isVlsr = io.in.preInfo.isVlsr
8987dd4e0dSzhanglyGit  val vlmul = io.in.preInfo.vlmul
90c4501a6fSZiyue-Zhang  val nf = io.in.preInfo.nf
917f9f0a79SzhanglyGit  val isComplex = io.out.isComplex
927f9f0a79SzhanglyGit
937f9f0a79SzhanglyGit  val lmul = MuxLookup(vlmul, 1.U(4.W), Array(
947f9f0a79SzhanglyGit    "b001".U -> 2.U,
957f9f0a79SzhanglyGit    "b010".U -> 4.U,
967f9f0a79SzhanglyGit    "b011".U -> 8.U
977f9f0a79SzhanglyGit  ))
98c4501a6fSZiyue-Zhang  val simple_lmul = MuxLookup(vlmul, 0.U(2.W), Array(
99c4501a6fSZiyue-Zhang    "b001".U -> 1.U,
100c4501a6fSZiyue-Zhang    "b010".U -> 2.U,
101c4501a6fSZiyue-Zhang    "b011".U -> 3.U
102c4501a6fSZiyue-Zhang  ))
1037f9f0a79SzhanglyGit
1047f9f0a79SzhanglyGit  val vemul: UInt = veew.asUInt + 1.U + vlmul.asUInt + ~vsew.asUInt
1057f9f0a79SzhanglyGit
1067f9f0a79SzhanglyGit  val emul = MuxLookup(vemul, 1.U(4.W), Array(
1077f9f0a79SzhanglyGit    "b001".U -> 2.U,
1087f9f0a79SzhanglyGit    "b010".U -> 4.U,
1097f9f0a79SzhanglyGit    "b011".U -> 8.U
1107f9f0a79SzhanglyGit  ))                                                              //TODO : eew and emul illegal exception need to be handled
111c4501a6fSZiyue-Zhang  val simple_emul = MuxLookup(vemul, 0.U(2.W), Array(
112c4501a6fSZiyue-Zhang    "b001".U -> 1.U,
113c4501a6fSZiyue-Zhang    "b010".U -> 2.U,
114c4501a6fSZiyue-Zhang    "b011".U -> 3.U
115c4501a6fSZiyue-Zhang  ))
1167f9f0a79SzhanglyGit
1177f9f0a79SzhanglyGit  val numOfUopVslide = MuxLookup(vlmul, 1.U(log2Up(MaxUopSize + 1).W), Array(
1187f9f0a79SzhanglyGit    "b001".U -> 3.U,
1197f9f0a79SzhanglyGit    "b010".U -> 10.U,
1207f9f0a79SzhanglyGit    "b011".U -> 36.U
1217f9f0a79SzhanglyGit  ))
1227f9f0a79SzhanglyGit  val numOfUopVrgather = MuxLookup(vlmul, 1.U(log2Up(MaxUopSize + 1).W), Array(
1237f9f0a79SzhanglyGit    "b001".U -> 4.U,
1247f9f0a79SzhanglyGit    "b010".U -> 16.U,
1257f9f0a79SzhanglyGit    "b011".U -> 64.U
1267f9f0a79SzhanglyGit  ))
1277f9f0a79SzhanglyGit  val numOfUopVrgatherei16 = Mux((!vsew.orR) && (vlmul =/= "b011".U),
1287f9f0a79SzhanglyGit    Cat(numOfUopVrgather, 0.U(1.W)),
1297f9f0a79SzhanglyGit    numOfUopVrgather
1307f9f0a79SzhanglyGit  )
1317f9f0a79SzhanglyGit  val numOfUopVcompress = MuxLookup(vlmul, 1.U(4.W), Array(
1327f9f0a79SzhanglyGit    "b001".U -> 4.U,
1337f9f0a79SzhanglyGit    "b010".U -> 13.U,
1347f9f0a79SzhanglyGit    "b011".U -> 43.U
1357f9f0a79SzhanglyGit  ))
136582849ffSxiaofeibao-xjtu  val numOfUopVFRED = {
137582849ffSxiaofeibao-xjtu    // addTime include add frs1
138582849ffSxiaofeibao-xjtu     val addTime = MuxLookup(vlmul, 1.U(4.W), Array(
139582849ffSxiaofeibao-xjtu       VLmul.m2 -> 2.U,
140582849ffSxiaofeibao-xjtu       VLmul.m4 -> 4.U,
141582849ffSxiaofeibao-xjtu       VLmul.m8 -> 8.U,
142582849ffSxiaofeibao-xjtu     ))
143582849ffSxiaofeibao-xjtu    val foldLastVlmul = MuxLookup(vsew, "b000".U, Array(
144582849ffSxiaofeibao-xjtu      VSew.e16 -> VLmul.mf8,
145582849ffSxiaofeibao-xjtu      VSew.e32 -> VLmul.mf4,
146582849ffSxiaofeibao-xjtu      VSew.e64 -> VLmul.mf2,
147582849ffSxiaofeibao-xjtu    ))
148582849ffSxiaofeibao-xjtu    // lmul < 1, foldTime = vlmul - foldFastVlmul
149582849ffSxiaofeibao-xjtu    // lmul >= 1, foldTime = 0.U - foldFastVlmul
150582849ffSxiaofeibao-xjtu    val foldTime = Mux(vlmul(2), vlmul, 0.U) - foldLastVlmul
151582849ffSxiaofeibao-xjtu    addTime + foldTime
152582849ffSxiaofeibao-xjtu  }
153b94b1889Sxiaofeibao-xjtu  val numOfUopVFREDOSUM = {
154b94b1889Sxiaofeibao-xjtu    val uvlMax = MuxLookup(vsew, 0.U, Array(
155b94b1889Sxiaofeibao-xjtu      VSew.e16 -> 8.U,
156b94b1889Sxiaofeibao-xjtu      VSew.e32 -> 4.U,
157b94b1889Sxiaofeibao-xjtu      VSew.e64 -> 2.U,
158b94b1889Sxiaofeibao-xjtu    ))
159b94b1889Sxiaofeibao-xjtu    val vlMax = Wire(UInt(7.W))
160b94b1889Sxiaofeibao-xjtu    vlMax := Mux(vlmul(2), uvlMax >> (-vlmul)(1,0), uvlMax << vlmul(1,0)).asUInt
161b94b1889Sxiaofeibao-xjtu    vlMax
162b94b1889Sxiaofeibao-xjtu  }
1637f9f0a79SzhanglyGit
164c4501a6fSZiyue-Zhang  stridedLSTable.src := Cat(simple_emul, nf)
165c4501a6fSZiyue-Zhang  val numOfUopVLoadStoreStrided = stridedLSTable.out
166c4501a6fSZiyue-Zhang  indexedLSTable.src := Cat(simple_emul, simple_lmul, nf)
167c4501a6fSZiyue-Zhang  val numOfUopVLoadStoreIndexed = indexedLSTable.out
1683235a9d8SZiyue-Zhang  indexedLSWBTable.src := Cat(simple_lmul, nf)
1693235a9d8SZiyue-Zhang  val numOfWBVLoadStoreIndexed = indexedLSWBTable.out
170c4501a6fSZiyue-Zhang
1717f9f0a79SzhanglyGit  //number of uop
1727f9f0a79SzhanglyGit  val numOfUop = MuxLookup(typeOfSplit, 1.U(log2Up(MaxUopSize + 1).W), Array(
173*e25c13faSXuan Hu    UopSplitType.VSET -> 2.U,
1747f9f0a79SzhanglyGit    UopSplitType.VEC_0XV -> 2.U,
1757f9f0a79SzhanglyGit    UopSplitType.VEC_VVV -> lmul,
176684d7aceSxiaofeibao-xjtu    UopSplitType.VEC_VFV -> lmul,
1777f9f0a79SzhanglyGit    UopSplitType.VEC_EXT2 -> lmul,
1787f9f0a79SzhanglyGit    UopSplitType.VEC_EXT4 -> lmul,
1797f9f0a79SzhanglyGit    UopSplitType.VEC_EXT8 -> lmul,
1807f9f0a79SzhanglyGit    UopSplitType.VEC_VVM -> lmul,
181f06d6d60Sxiaofeibao-xjtu    UopSplitType.VEC_VFM -> lmul,
182582849ffSxiaofeibao-xjtu    UopSplitType.VEC_VFRED -> numOfUopVFRED,
183b94b1889Sxiaofeibao-xjtu    UopSplitType.VEC_VFREDOSUM -> numOfUopVFREDOSUM,
1847f9f0a79SzhanglyGit    UopSplitType.VEC_VXM -> (lmul +& 1.U),
1857f9f0a79SzhanglyGit    UopSplitType.VEC_VXV -> (lmul +& 1.U),
1863748ec56Sxiaofeibao-xjtu    UopSplitType.VEC_VFW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
1873748ec56Sxiaofeibao-xjtu    UopSplitType.VEC_WFW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
1887f9f0a79SzhanglyGit    UopSplitType.VEC_VVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
1897f9f0a79SzhanglyGit    UopSplitType.VEC_WVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
1907f9f0a79SzhanglyGit    UopSplitType.VEC_VXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4
1917f9f0a79SzhanglyGit    UopSplitType.VEC_WXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4
1927f9f0a79SzhanglyGit    UopSplitType.VEC_WVV -> Cat(lmul, 0.U(1.W)), // lmul <= 4
1937f9f0a79SzhanglyGit    UopSplitType.VEC_WXV -> Cat(lmul, 1.U(1.W)), // lmul <= 4
1947f9f0a79SzhanglyGit    UopSplitType.VEC_SLIDE1UP -> (lmul +& 1.U),
1957f9f0a79SzhanglyGit    UopSplitType.VEC_FSLIDE1UP -> lmul,
1967f9f0a79SzhanglyGit    UopSplitType.VEC_SLIDE1DOWN -> Cat(lmul, 0.U(1.W)),
1977f9f0a79SzhanglyGit    UopSplitType.VEC_FSLIDE1DOWN -> (Cat(lmul, 0.U(1.W)) - 1.U),
1987f9f0a79SzhanglyGit    UopSplitType.VEC_VRED -> lmul,
1997f9f0a79SzhanglyGit    UopSplitType.VEC_SLIDEUP -> (numOfUopVslide + 1.U),
2007f9f0a79SzhanglyGit    UopSplitType.VEC_SLIDEDOWN -> (numOfUopVslide + 1.U),
2017f9f0a79SzhanglyGit    UopSplitType.VEC_M0X -> (lmul +& 1.U),
2027f9f0a79SzhanglyGit    UopSplitType.VEC_MVV -> (Cat(lmul, 0.U(1.W)) - 1.U),
2037f9f0a79SzhanglyGit    UopSplitType.VEC_M0X_VFIRST -> 2.U,
2047f9f0a79SzhanglyGit    UopSplitType.VEC_VWW -> Cat(lmul, 0.U(1.W)),
2057f9f0a79SzhanglyGit    UopSplitType.VEC_RGATHER -> numOfUopVrgather,
2067f9f0a79SzhanglyGit    UopSplitType.VEC_RGATHER_VX -> (numOfUopVrgather +& 1.U),
2077f9f0a79SzhanglyGit    UopSplitType.VEC_RGATHEREI16 -> numOfUopVrgatherei16,
2080a34fc22SZiyue Zhang    UopSplitType.VEC_MVNR -> (vmvn +& 1.U),
20906cb2bc1Sweidingliu    UopSplitType.VEC_US_LDST -> Mux(isVlsr, nf +& 2.U, (numOfUopVLoadStoreStrided +& 1.U)),   // with one move instruction
210c4501a6fSZiyue-Zhang    UopSplitType.VEC_S_LDST -> (numOfUopVLoadStoreStrided +& 2.U),    // with two move instructions
211c4501a6fSZiyue-Zhang    UopSplitType.VEC_I_LDST -> (numOfUopVLoadStoreIndexed +& 1.U),
2127f9f0a79SzhanglyGit  ))
2137f9f0a79SzhanglyGit
2143235a9d8SZiyue-Zhang  // number of writeback num
2153235a9d8SZiyue-Zhang  val numOfWB = MuxLookup(typeOfSplit, 1.U(log2Up(MaxUopSize + 1).W), Array(
216*e25c13faSXuan Hu    UopSplitType.VSET -> 2.U,
2173235a9d8SZiyue-Zhang    UopSplitType.VEC_0XV -> 2.U,
2183235a9d8SZiyue-Zhang    UopSplitType.VEC_VVV -> lmul,
2193235a9d8SZiyue-Zhang    UopSplitType.VEC_VFV -> lmul,
2203235a9d8SZiyue-Zhang    UopSplitType.VEC_EXT2 -> lmul,
2213235a9d8SZiyue-Zhang    UopSplitType.VEC_EXT4 -> lmul,
2223235a9d8SZiyue-Zhang    UopSplitType.VEC_EXT8 -> lmul,
2233235a9d8SZiyue-Zhang    UopSplitType.VEC_VVM -> lmul,
2243235a9d8SZiyue-Zhang    UopSplitType.VEC_VFM -> lmul,
2253235a9d8SZiyue-Zhang    UopSplitType.VEC_VFRED -> numOfUopVFRED,
2263235a9d8SZiyue-Zhang    UopSplitType.VEC_VFREDOSUM -> numOfUopVFREDOSUM,
2273235a9d8SZiyue-Zhang    UopSplitType.VEC_VXM -> (lmul +& 1.U),
2283235a9d8SZiyue-Zhang    UopSplitType.VEC_VXV -> (lmul +& 1.U),
2293235a9d8SZiyue-Zhang    UopSplitType.VEC_VFW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
2303235a9d8SZiyue-Zhang    UopSplitType.VEC_WFW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
2313235a9d8SZiyue-Zhang    UopSplitType.VEC_VVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
2323235a9d8SZiyue-Zhang    UopSplitType.VEC_WVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
2333235a9d8SZiyue-Zhang    UopSplitType.VEC_VXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4
2343235a9d8SZiyue-Zhang    UopSplitType.VEC_WXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4
2353235a9d8SZiyue-Zhang    UopSplitType.VEC_WVV -> Cat(lmul, 0.U(1.W)), // lmul <= 4
2363235a9d8SZiyue-Zhang    UopSplitType.VEC_WXV -> Cat(lmul, 1.U(1.W)), // lmul <= 4
2373235a9d8SZiyue-Zhang    UopSplitType.VEC_SLIDE1UP -> (lmul +& 1.U),
2383235a9d8SZiyue-Zhang    UopSplitType.VEC_FSLIDE1UP -> lmul,
2393235a9d8SZiyue-Zhang    UopSplitType.VEC_SLIDE1DOWN -> Cat(lmul, 0.U(1.W)),
2403235a9d8SZiyue-Zhang    UopSplitType.VEC_FSLIDE1DOWN -> (Cat(lmul, 0.U(1.W)) - 1.U),
2413235a9d8SZiyue-Zhang    UopSplitType.VEC_VRED -> lmul,
2423235a9d8SZiyue-Zhang    UopSplitType.VEC_SLIDEUP -> (numOfUopVslide + 1.U),
2433235a9d8SZiyue-Zhang    UopSplitType.VEC_SLIDEDOWN -> (numOfUopVslide + 1.U),
2443235a9d8SZiyue-Zhang    UopSplitType.VEC_M0X -> (lmul +& 1.U),
2453235a9d8SZiyue-Zhang    UopSplitType.VEC_MVV -> (Cat(lmul, 0.U(1.W)) - 1.U),
2463235a9d8SZiyue-Zhang    UopSplitType.VEC_M0X_VFIRST -> 2.U,
2473235a9d8SZiyue-Zhang    UopSplitType.VEC_VWW -> Cat(lmul, 0.U(1.W)),
2483235a9d8SZiyue-Zhang    UopSplitType.VEC_RGATHER -> numOfUopVrgather,
2493235a9d8SZiyue-Zhang    UopSplitType.VEC_RGATHER_VX -> (numOfUopVrgather +& 1.U),
2503235a9d8SZiyue-Zhang    UopSplitType.VEC_RGATHEREI16 -> numOfUopVrgatherei16,
25106cb2bc1Sweidingliu    UopSplitType.VEC_US_LDST -> Mux(isVlsr, nf +& 2.U, (numOfUopVLoadStoreStrided +& 1.U)),   // with one move instruction
2523235a9d8SZiyue-Zhang    UopSplitType.VEC_S_LDST -> (numOfUopVLoadStoreStrided +& 2.U),    // with two move instructions
2533235a9d8SZiyue-Zhang    UopSplitType.VEC_I_LDST -> (numOfWBVLoadStoreIndexed +& 1.U),
2543235a9d8SZiyue-Zhang    UopSplitType.VEC_MVNR -> (vmvn +& 1.U),
2553235a9d8SZiyue-Zhang  ))
2563235a9d8SZiyue-Zhang
257*e25c13faSXuan Hu  isComplex := typeOfSplit =/= UopSplitType.SCA_SIM
2587f9f0a79SzhanglyGit  io.out.uopInfo.numOfUop := numOfUop
2593235a9d8SZiyue-Zhang  io.out.uopInfo.numOfWB := numOfWB
2607f9f0a79SzhanglyGit  io.out.uopInfo.lmul := lmul
2617f9f0a79SzhanglyGit
2627f9f0a79SzhanglyGit}
2637f9f0a79SzhanglyGit
2647f9f0a79SzhanglyGitclass UopInfoGenIO(implicit p: Parameters) extends XSBundle {
2657f9f0a79SzhanglyGit  val in = new Bundle {
26687dd4e0dSzhanglyGit    val preInfo = Input(new PreInfo)
2677f9f0a79SzhanglyGit  }
2687f9f0a79SzhanglyGit  val out = new Bundle {
2697f9f0a79SzhanglyGit    val isComplex = Output(Bool())
2707f9f0a79SzhanglyGit    val uopInfo = Output(new UopInfo)
2717f9f0a79SzhanglyGit  }
2727f9f0a79SzhanglyGit}
2737f9f0a79SzhanglyGit
27487dd4e0dSzhanglyGitclass PreInfo(implicit p: Parameters) extends XSBundle {
2757f9f0a79SzhanglyGit  val typeOfSplit = UopSplitType()
2767f9f0a79SzhanglyGit  val vsew = VSew()          //2 bit
2777f9f0a79SzhanglyGit  val vlmul = VLmul()
2787f9f0a79SzhanglyGit  val vwidth = UInt(3.W)     //eew
279c4501a6fSZiyue-Zhang  val nf = UInt(3.W)
2800a34fc22SZiyue Zhang  val vmvn = UInt(3.W)       // vmvnr
28106cb2bc1Sweidingliu  val isVlsr = Bool()        // is vector whole register load/store
2827f9f0a79SzhanglyGit}
2837f9f0a79SzhanglyGit
2847f9f0a79SzhanglyGitclass UopInfo(implicit p: Parameters) extends XSBundle {
2857f9f0a79SzhanglyGit  val numOfUop = UInt(log2Up(MaxUopSize + 1).W)
2863235a9d8SZiyue-Zhang  val numOfWB = UInt(log2Up(MaxUopSize + 1).W)
2877f9f0a79SzhanglyGit  val lmul = UInt(4.W)
2887f9f0a79SzhanglyGit}