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}