xref: /XiangShan/src/main/scala/xiangshan/backend/decode/UopInfoGen.scala (revision 7f9f0a79d63443582a90160c09167edd5f6f3db8)
1*7f9f0a79SzhanglyGit/***************************************************************************************
2*7f9f0a79SzhanglyGit  * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3*7f9f0a79SzhanglyGit  * Copyright (c) 2020-2021 Peng Cheng Laboratory
4*7f9f0a79SzhanglyGit  *
5*7f9f0a79SzhanglyGit  * XiangShan is licensed under Mulan PSL v2.
6*7f9f0a79SzhanglyGit  * You can use this software according to the terms and conditions of the Mulan PSL v2.
7*7f9f0a79SzhanglyGit  * You may obtain a copy of Mulan PSL v2 at:
8*7f9f0a79SzhanglyGit  *          http://license.coscl.org.cn/MulanPSL2
9*7f9f0a79SzhanglyGit  *
10*7f9f0a79SzhanglyGit  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11*7f9f0a79SzhanglyGit  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12*7f9f0a79SzhanglyGit  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13*7f9f0a79SzhanglyGit  *
14*7f9f0a79SzhanglyGit  * See the Mulan PSL v2 for more details.
15*7f9f0a79SzhanglyGit  ***************************************************************************************/
16*7f9f0a79SzhanglyGit
17*7f9f0a79SzhanglyGitpackage xiangshan.backend.decode
18*7f9f0a79SzhanglyGit
19*7f9f0a79SzhanglyGitimport chipsalliance.rocketchip.config.Parameters
20*7f9f0a79SzhanglyGitimport chisel3._
21*7f9f0a79SzhanglyGitimport chisel3.util._
22*7f9f0a79SzhanglyGitimport freechips.rocketchip.rocket.Instructions
23*7f9f0a79SzhanglyGitimport freechips.rocketchip.util.uintToBitPat
24*7f9f0a79SzhanglyGitimport utils._
25*7f9f0a79SzhanglyGitimport utility._
26*7f9f0a79SzhanglyGitimport xiangshan.ExceptionNO.illegalInstr
27*7f9f0a79SzhanglyGitimport xiangshan._
28*7f9f0a79SzhanglyGitimport xiangshan.backend.fu.fpu.FPU
29*7f9f0a79SzhanglyGitimport xiangshan.backend.fu.FuType
30*7f9f0a79SzhanglyGitimport freechips.rocketchip.rocket.Instructions._
31*7f9f0a79SzhanglyGitimport xiangshan.backend.Bundles.{DecodedInst, StaticInst}
32*7f9f0a79SzhanglyGitimport xiangshan.backend.fu.vector.Bundles.{VType, VLmul, VSew}
33*7f9f0a79SzhanglyGitimport yunsuan.VpermType
34*7f9f0a79SzhanglyGit
35*7f9f0a79SzhanglyGitclass UopInfoGen (implicit p: Parameters) extends XSModule {
36*7f9f0a79SzhanglyGit  val io = IO(new UopInfoGenIO)
37*7f9f0a79SzhanglyGit
38*7f9f0a79SzhanglyGit  val typeOfSplit = io.in.preDecodeInfo.typeOfSplit
39*7f9f0a79SzhanglyGit  val vsew = Cat(0.U(1.W), io.in.preDecodeInfo.vsew)
40*7f9f0a79SzhanglyGit  val veew = Cat(0.U(1.W), io.in.preDecodeInfo.vwidth(1, 0))
41*7f9f0a79SzhanglyGit  val vlmul = io.in.preDecodeInfo.vlmul
42*7f9f0a79SzhanglyGit  val isComplex = io.out.isComplex
43*7f9f0a79SzhanglyGit
44*7f9f0a79SzhanglyGit  val lmul = MuxLookup(vlmul, 1.U(4.W), Array(
45*7f9f0a79SzhanglyGit    "b001".U -> 2.U,
46*7f9f0a79SzhanglyGit    "b010".U -> 4.U,
47*7f9f0a79SzhanglyGit    "b011".U -> 8.U
48*7f9f0a79SzhanglyGit  ))
49*7f9f0a79SzhanglyGit
50*7f9f0a79SzhanglyGit  val vemul: UInt = veew.asUInt + 1.U + vlmul.asUInt + ~vsew.asUInt
51*7f9f0a79SzhanglyGit
52*7f9f0a79SzhanglyGit  val emul = MuxLookup(vemul, 1.U(4.W), Array(
53*7f9f0a79SzhanglyGit    "b001".U -> 2.U,
54*7f9f0a79SzhanglyGit    "b010".U -> 4.U,
55*7f9f0a79SzhanglyGit    "b011".U -> 8.U
56*7f9f0a79SzhanglyGit  ))                                                              //TODO : eew and emul illegal exception need to be handled
57*7f9f0a79SzhanglyGit
58*7f9f0a79SzhanglyGit  val numOfUopVslide = MuxLookup(vlmul, 1.U(log2Up(MaxUopSize + 1).W), Array(
59*7f9f0a79SzhanglyGit    "b001".U -> 3.U,
60*7f9f0a79SzhanglyGit    "b010".U -> 10.U,
61*7f9f0a79SzhanglyGit    "b011".U -> 36.U
62*7f9f0a79SzhanglyGit  ))
63*7f9f0a79SzhanglyGit  val numOfUopVrgather = MuxLookup(vlmul, 1.U(log2Up(MaxUopSize + 1).W), Array(
64*7f9f0a79SzhanglyGit    "b001".U -> 4.U,
65*7f9f0a79SzhanglyGit    "b010".U -> 16.U,
66*7f9f0a79SzhanglyGit    "b011".U -> 64.U
67*7f9f0a79SzhanglyGit  ))
68*7f9f0a79SzhanglyGit  val numOfUopVrgatherei16 = Mux((!vsew.orR) && (vlmul =/= "b011".U),
69*7f9f0a79SzhanglyGit    Cat(numOfUopVrgather, 0.U(1.W)),
70*7f9f0a79SzhanglyGit    numOfUopVrgather
71*7f9f0a79SzhanglyGit  )
72*7f9f0a79SzhanglyGit  val numOfUopVcompress = MuxLookup(vlmul, 1.U(4.W), Array(
73*7f9f0a79SzhanglyGit    "b001".U -> 4.U,
74*7f9f0a79SzhanglyGit    "b010".U -> 13.U,
75*7f9f0a79SzhanglyGit    "b011".U -> 43.U
76*7f9f0a79SzhanglyGit  ))
77*7f9f0a79SzhanglyGit
78*7f9f0a79SzhanglyGit  //number of uop
79*7f9f0a79SzhanglyGit  val numOfUop = MuxLookup(typeOfSplit, 1.U(log2Up(MaxUopSize + 1).W), Array(
80*7f9f0a79SzhanglyGit    UopSplitType.VEC_0XV -> 2.U,
81*7f9f0a79SzhanglyGit    UopSplitType.VEC_VVV -> lmul,
82*7f9f0a79SzhanglyGit    UopSplitType.VEC_EXT2 -> lmul,
83*7f9f0a79SzhanglyGit    UopSplitType.VEC_EXT4 -> lmul,
84*7f9f0a79SzhanglyGit    UopSplitType.VEC_EXT8 -> lmul,
85*7f9f0a79SzhanglyGit    UopSplitType.VEC_VVM -> lmul,
86*7f9f0a79SzhanglyGit    UopSplitType.VEC_VXM -> (lmul +& 1.U),
87*7f9f0a79SzhanglyGit    UopSplitType.VEC_VXV -> (lmul +& 1.U),
88*7f9f0a79SzhanglyGit    UopSplitType.VEC_VVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
89*7f9f0a79SzhanglyGit    UopSplitType.VEC_WVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4
90*7f9f0a79SzhanglyGit    UopSplitType.VEC_VXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4
91*7f9f0a79SzhanglyGit    UopSplitType.VEC_WXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4
92*7f9f0a79SzhanglyGit    UopSplitType.VEC_WVV -> Cat(lmul, 0.U(1.W)), // lmul <= 4
93*7f9f0a79SzhanglyGit    UopSplitType.VEC_WXV -> Cat(lmul, 1.U(1.W)), // lmul <= 4
94*7f9f0a79SzhanglyGit    UopSplitType.VEC_SLIDE1UP -> (lmul +& 1.U),
95*7f9f0a79SzhanglyGit    UopSplitType.VEC_FSLIDE1UP -> lmul,
96*7f9f0a79SzhanglyGit    UopSplitType.VEC_SLIDE1DOWN -> Cat(lmul, 0.U(1.W)),
97*7f9f0a79SzhanglyGit    UopSplitType.VEC_FSLIDE1DOWN -> (Cat(lmul, 0.U(1.W)) - 1.U),
98*7f9f0a79SzhanglyGit    UopSplitType.VEC_VRED -> lmul,
99*7f9f0a79SzhanglyGit    UopSplitType.VEC_SLIDEUP -> (numOfUopVslide + 1.U),
100*7f9f0a79SzhanglyGit    UopSplitType.VEC_ISLIDEUP -> numOfUopVslide,
101*7f9f0a79SzhanglyGit    UopSplitType.VEC_SLIDEDOWN -> (numOfUopVslide + 1.U),
102*7f9f0a79SzhanglyGit    UopSplitType.VEC_ISLIDEDOWN -> numOfUopVslide,
103*7f9f0a79SzhanglyGit    UopSplitType.VEC_M0X -> (lmul +& 1.U),
104*7f9f0a79SzhanglyGit    UopSplitType.VEC_MVV -> (Cat(lmul, 0.U(1.W)) - 1.U),
105*7f9f0a79SzhanglyGit    UopSplitType.VEC_M0X_VFIRST -> 2.U,
106*7f9f0a79SzhanglyGit    UopSplitType.VEC_VWW -> Cat(lmul, 0.U(1.W)),
107*7f9f0a79SzhanglyGit    UopSplitType.VEC_RGATHER -> numOfUopVrgather,
108*7f9f0a79SzhanglyGit    UopSplitType.VEC_RGATHER_VX -> (numOfUopVrgather +& 1.U),
109*7f9f0a79SzhanglyGit    UopSplitType.VEC_RGATHEREI16 -> numOfUopVrgatherei16,
110*7f9f0a79SzhanglyGit    UopSplitType.VEC_US_LD -> (emul +& 1.U),
111*7f9f0a79SzhanglyGit  ))
112*7f9f0a79SzhanglyGit
113*7f9f0a79SzhanglyGit  isComplex := (numOfUop > 1.U) || (typeOfSplit === UopSplitType.DIR)
114*7f9f0a79SzhanglyGit  io.out.uopInfo.numOfUop := numOfUop
115*7f9f0a79SzhanglyGit  io.out.uopInfo.lmul := lmul
116*7f9f0a79SzhanglyGit
117*7f9f0a79SzhanglyGit}
118*7f9f0a79SzhanglyGit
119*7f9f0a79SzhanglyGitclass UopInfoGenIO(implicit p: Parameters) extends XSBundle {
120*7f9f0a79SzhanglyGit  val in = new Bundle {
121*7f9f0a79SzhanglyGit    val preDecodeInfo = Input(new PreDecodeInfo)
122*7f9f0a79SzhanglyGit  }
123*7f9f0a79SzhanglyGit  val out = new Bundle {
124*7f9f0a79SzhanglyGit    val isComplex = Output(Bool())
125*7f9f0a79SzhanglyGit    val uopInfo = Output(new UopInfo)
126*7f9f0a79SzhanglyGit  }
127*7f9f0a79SzhanglyGit}
128*7f9f0a79SzhanglyGit
129*7f9f0a79SzhanglyGitclass PreDecodeInfo(implicit p: Parameters) extends XSBundle {
130*7f9f0a79SzhanglyGit  val typeOfSplit = UopSplitType()
131*7f9f0a79SzhanglyGit  val vsew = VSew()          //2 bit
132*7f9f0a79SzhanglyGit  val vlmul = VLmul()
133*7f9f0a79SzhanglyGit  val vwidth = UInt(3.W)     //eew
134*7f9f0a79SzhanglyGit}
135*7f9f0a79SzhanglyGit
136*7f9f0a79SzhanglyGitclass UopInfo(implicit p: Parameters) extends XSBundle {
137*7f9f0a79SzhanglyGit  val numOfUop = UInt(log2Up(MaxUopSize + 1).W)
138*7f9f0a79SzhanglyGit  val lmul = UInt(4.W)
139*7f9f0a79SzhanglyGit}