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}