xref: /XiangShan/src/main/scala/xiangshan/backend/decode/UopInfoGen.scala (revision 83ba63b34cf09b33c0a9e1b3203138e51af4491b)
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}