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 19*83ba63b3SXuan 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 347f9f0a79SzhanglyGit 357f9f0a79SzhanglyGitclass UopInfoGen (implicit p: Parameters) extends XSModule { 367f9f0a79SzhanglyGit val io = IO(new UopInfoGenIO) 377f9f0a79SzhanglyGit 3887dd4e0dSzhanglyGit val typeOfSplit = io.in.preInfo.typeOfSplit 3987dd4e0dSzhanglyGit val vsew = Cat(0.U(1.W), io.in.preInfo.vsew) 4087dd4e0dSzhanglyGit val veew = Cat(0.U(1.W), io.in.preInfo.vwidth(1, 0)) 4187dd4e0dSzhanglyGit val vlmul = io.in.preInfo.vlmul 427f9f0a79SzhanglyGit val isComplex = io.out.isComplex 437f9f0a79SzhanglyGit 447f9f0a79SzhanglyGit val lmul = MuxLookup(vlmul, 1.U(4.W), Array( 457f9f0a79SzhanglyGit "b001".U -> 2.U, 467f9f0a79SzhanglyGit "b010".U -> 4.U, 477f9f0a79SzhanglyGit "b011".U -> 8.U 487f9f0a79SzhanglyGit )) 497f9f0a79SzhanglyGit 507f9f0a79SzhanglyGit val vemul: UInt = veew.asUInt + 1.U + vlmul.asUInt + ~vsew.asUInt 517f9f0a79SzhanglyGit 527f9f0a79SzhanglyGit val emul = MuxLookup(vemul, 1.U(4.W), Array( 537f9f0a79SzhanglyGit "b001".U -> 2.U, 547f9f0a79SzhanglyGit "b010".U -> 4.U, 557f9f0a79SzhanglyGit "b011".U -> 8.U 567f9f0a79SzhanglyGit )) //TODO : eew and emul illegal exception need to be handled 577f9f0a79SzhanglyGit 587f9f0a79SzhanglyGit val numOfUopVslide = MuxLookup(vlmul, 1.U(log2Up(MaxUopSize + 1).W), Array( 597f9f0a79SzhanglyGit "b001".U -> 3.U, 607f9f0a79SzhanglyGit "b010".U -> 10.U, 617f9f0a79SzhanglyGit "b011".U -> 36.U 627f9f0a79SzhanglyGit )) 637f9f0a79SzhanglyGit val numOfUopVrgather = MuxLookup(vlmul, 1.U(log2Up(MaxUopSize + 1).W), Array( 647f9f0a79SzhanglyGit "b001".U -> 4.U, 657f9f0a79SzhanglyGit "b010".U -> 16.U, 667f9f0a79SzhanglyGit "b011".U -> 64.U 677f9f0a79SzhanglyGit )) 687f9f0a79SzhanglyGit val numOfUopVrgatherei16 = Mux((!vsew.orR) && (vlmul =/= "b011".U), 697f9f0a79SzhanglyGit Cat(numOfUopVrgather, 0.U(1.W)), 707f9f0a79SzhanglyGit numOfUopVrgather 717f9f0a79SzhanglyGit ) 727f9f0a79SzhanglyGit val numOfUopVcompress = MuxLookup(vlmul, 1.U(4.W), Array( 737f9f0a79SzhanglyGit "b001".U -> 4.U, 747f9f0a79SzhanglyGit "b010".U -> 13.U, 757f9f0a79SzhanglyGit "b011".U -> 43.U 767f9f0a79SzhanglyGit )) 77582849ffSxiaofeibao-xjtu val numOfUopVFRED = { 78582849ffSxiaofeibao-xjtu // addTime include add frs1 79582849ffSxiaofeibao-xjtu val addTime = MuxLookup(vlmul, 1.U(4.W), Array( 80582849ffSxiaofeibao-xjtu VLmul.m2 -> 2.U, 81582849ffSxiaofeibao-xjtu VLmul.m4 -> 4.U, 82582849ffSxiaofeibao-xjtu VLmul.m8 -> 8.U, 83582849ffSxiaofeibao-xjtu )) 84582849ffSxiaofeibao-xjtu val foldLastVlmul = MuxLookup(vsew, "b000".U, Array( 85582849ffSxiaofeibao-xjtu VSew.e16 -> VLmul.mf8, 86582849ffSxiaofeibao-xjtu VSew.e32 -> VLmul.mf4, 87582849ffSxiaofeibao-xjtu VSew.e64 -> VLmul.mf2, 88582849ffSxiaofeibao-xjtu )) 89582849ffSxiaofeibao-xjtu // lmul < 1, foldTime = vlmul - foldFastVlmul 90582849ffSxiaofeibao-xjtu // lmul >= 1, foldTime = 0.U - foldFastVlmul 91582849ffSxiaofeibao-xjtu val foldTime = Mux(vlmul(2), vlmul, 0.U) - foldLastVlmul 92582849ffSxiaofeibao-xjtu addTime + foldTime 93582849ffSxiaofeibao-xjtu } 94b94b1889Sxiaofeibao-xjtu val numOfUopVFREDOSUM = { 95b94b1889Sxiaofeibao-xjtu val uvlMax = MuxLookup(vsew, 0.U, Array( 96b94b1889Sxiaofeibao-xjtu VSew.e16 -> 8.U, 97b94b1889Sxiaofeibao-xjtu VSew.e32 -> 4.U, 98b94b1889Sxiaofeibao-xjtu VSew.e64 -> 2.U, 99b94b1889Sxiaofeibao-xjtu )) 100b94b1889Sxiaofeibao-xjtu val vlMax = Wire(UInt(7.W)) 101b94b1889Sxiaofeibao-xjtu vlMax := Mux(vlmul(2), uvlMax >> (-vlmul)(1,0), uvlMax << vlmul(1,0)).asUInt 102b94b1889Sxiaofeibao-xjtu vlMax 103b94b1889Sxiaofeibao-xjtu } 1047f9f0a79SzhanglyGit 1057f9f0a79SzhanglyGit //number of uop 1067f9f0a79SzhanglyGit val numOfUop = MuxLookup(typeOfSplit, 1.U(log2Up(MaxUopSize + 1).W), Array( 1077f9f0a79SzhanglyGit UopSplitType.VEC_0XV -> 2.U, 1087f9f0a79SzhanglyGit UopSplitType.VEC_VVV -> lmul, 109684d7aceSxiaofeibao-xjtu UopSplitType.VEC_VFV -> lmul, 1107f9f0a79SzhanglyGit UopSplitType.VEC_EXT2 -> lmul, 1117f9f0a79SzhanglyGit UopSplitType.VEC_EXT4 -> lmul, 1127f9f0a79SzhanglyGit UopSplitType.VEC_EXT8 -> lmul, 1137f9f0a79SzhanglyGit UopSplitType.VEC_VVM -> lmul, 114f06d6d60Sxiaofeibao-xjtu UopSplitType.VEC_VFM -> lmul, 115582849ffSxiaofeibao-xjtu UopSplitType.VEC_VFRED -> numOfUopVFRED, 116b94b1889Sxiaofeibao-xjtu UopSplitType.VEC_VFREDOSUM -> numOfUopVFREDOSUM, 1177f9f0a79SzhanglyGit UopSplitType.VEC_VXM -> (lmul +& 1.U), 1187f9f0a79SzhanglyGit UopSplitType.VEC_VXV -> (lmul +& 1.U), 1193748ec56Sxiaofeibao-xjtu UopSplitType.VEC_VFW -> Cat(lmul, 0.U(1.W)), // lmul <= 4 1203748ec56Sxiaofeibao-xjtu UopSplitType.VEC_WFW -> Cat(lmul, 0.U(1.W)), // lmul <= 4 1217f9f0a79SzhanglyGit UopSplitType.VEC_VVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4 1227f9f0a79SzhanglyGit UopSplitType.VEC_WVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4 1237f9f0a79SzhanglyGit UopSplitType.VEC_VXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4 1247f9f0a79SzhanglyGit UopSplitType.VEC_WXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4 1257f9f0a79SzhanglyGit UopSplitType.VEC_WVV -> Cat(lmul, 0.U(1.W)), // lmul <= 4 1267f9f0a79SzhanglyGit UopSplitType.VEC_WXV -> Cat(lmul, 1.U(1.W)), // lmul <= 4 1277f9f0a79SzhanglyGit UopSplitType.VEC_SLIDE1UP -> (lmul +& 1.U), 1287f9f0a79SzhanglyGit UopSplitType.VEC_FSLIDE1UP -> lmul, 1297f9f0a79SzhanglyGit UopSplitType.VEC_SLIDE1DOWN -> Cat(lmul, 0.U(1.W)), 1307f9f0a79SzhanglyGit UopSplitType.VEC_FSLIDE1DOWN -> (Cat(lmul, 0.U(1.W)) - 1.U), 1317f9f0a79SzhanglyGit UopSplitType.VEC_VRED -> lmul, 1327f9f0a79SzhanglyGit UopSplitType.VEC_SLIDEUP -> (numOfUopVslide + 1.U), 1337f9f0a79SzhanglyGit UopSplitType.VEC_ISLIDEUP -> numOfUopVslide, 1347f9f0a79SzhanglyGit UopSplitType.VEC_SLIDEDOWN -> (numOfUopVslide + 1.U), 1357f9f0a79SzhanglyGit UopSplitType.VEC_ISLIDEDOWN -> numOfUopVslide, 1367f9f0a79SzhanglyGit UopSplitType.VEC_M0X -> (lmul +& 1.U), 1377f9f0a79SzhanglyGit UopSplitType.VEC_MVV -> (Cat(lmul, 0.U(1.W)) - 1.U), 1387f9f0a79SzhanglyGit UopSplitType.VEC_M0X_VFIRST -> 2.U, 1397f9f0a79SzhanglyGit UopSplitType.VEC_VWW -> Cat(lmul, 0.U(1.W)), 1407f9f0a79SzhanglyGit UopSplitType.VEC_RGATHER -> numOfUopVrgather, 1417f9f0a79SzhanglyGit UopSplitType.VEC_RGATHER_VX -> (numOfUopVrgather +& 1.U), 1427f9f0a79SzhanglyGit UopSplitType.VEC_RGATHEREI16 -> numOfUopVrgatherei16, 1437f9f0a79SzhanglyGit UopSplitType.VEC_US_LD -> (emul +& 1.U), 1447f9f0a79SzhanglyGit )) 1457f9f0a79SzhanglyGit 1467f9f0a79SzhanglyGit isComplex := (numOfUop > 1.U) || (typeOfSplit === UopSplitType.DIR) 1477f9f0a79SzhanglyGit io.out.uopInfo.numOfUop := numOfUop 1487f9f0a79SzhanglyGit io.out.uopInfo.lmul := lmul 1497f9f0a79SzhanglyGit 1507f9f0a79SzhanglyGit} 1517f9f0a79SzhanglyGit 1527f9f0a79SzhanglyGitclass UopInfoGenIO(implicit p: Parameters) extends XSBundle { 1537f9f0a79SzhanglyGit val in = new Bundle { 15487dd4e0dSzhanglyGit val preInfo = Input(new PreInfo) 1557f9f0a79SzhanglyGit } 1567f9f0a79SzhanglyGit val out = new Bundle { 1577f9f0a79SzhanglyGit val isComplex = Output(Bool()) 1587f9f0a79SzhanglyGit val uopInfo = Output(new UopInfo) 1597f9f0a79SzhanglyGit } 1607f9f0a79SzhanglyGit} 1617f9f0a79SzhanglyGit 16287dd4e0dSzhanglyGitclass PreInfo(implicit p: Parameters) extends XSBundle { 1637f9f0a79SzhanglyGit val typeOfSplit = UopSplitType() 1647f9f0a79SzhanglyGit val vsew = VSew() //2 bit 1657f9f0a79SzhanglyGit val vlmul = VLmul() 1667f9f0a79SzhanglyGit val vwidth = UInt(3.W) //eew 1677f9f0a79SzhanglyGit} 1687f9f0a79SzhanglyGit 1697f9f0a79SzhanglyGitclass UopInfo(implicit p: Parameters) extends XSBundle { 1707f9f0a79SzhanglyGit val numOfUop = UInt(log2Up(MaxUopSize + 1).W) 1717f9f0a79SzhanglyGit val lmul = UInt(4.W) 1727f9f0a79SzhanglyGit}