xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 9eaaa75dcad8a8d34b2382c2c1fc06046f339895)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
17be25371aSYikeZhoupackage xiangshan.backend.decode
18be25371aSYikeZhou
192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters
20be25371aSYikeZhouimport chisel3._
21be25371aSYikeZhouimport chisel3.util._
223b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._
236ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat
243c02ee8fSwakafaimport utility._
253b739f49SXuan Huimport utils._
266ab6918fSYinan Xuimport xiangshan.ExceptionNO.illegalInstr
276ab6918fSYinan Xuimport xiangshan._
28730cfbc0SXuan Huimport xiangshan.backend.fu.FuType
29730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst}
305c1681d0SXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, XSInstBitFields}
3142475509SXuan Huimport xiangshan.backend.fu.vector.Bundles.{Category, VType}
32be25371aSYikeZhou
33be25371aSYikeZhou/**
34be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
35be25371aSYikeZhou */
36be25371aSYikeZhouabstract trait DecodeConstants {
37361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
3857a10886SXuan Hu  def X = BitPat("b0")
394d24c305SYikeZhou  def N = BitPat("b0")
404d24c305SYikeZhou  def Y = BitPat("b1")
4157a10886SXuan Hu  def T = true
4257a10886SXuan Hu  def F = false
434d24c305SYikeZhou
44c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
4520e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
464d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
4757a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
4857a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
4957a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5057a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5157a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
52d91483a6Sfdy    //   |          |          |          |         |           |  |  |  |  |  |  |  uopDivType
53d91483a6Sfdy    //   |          |          |          |         |           |  |  |  |  |  |  |  |             selImm
5417ec87f2SXuan Hu    List(SrcType.X, SrcType.X, SrcType.X, FuType.X, FuOpType.X, N, N, N, N, N, N, N, UopSplitType.X, SelImm.INVALID_INSTR) // Use SelImm to indicate invalid instr
554d24c305SYikeZhou
5657a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
5757a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
58be25371aSYikeZhou}
59be25371aSYikeZhou
60c2a8ae00SYikeZhoutrait DecodeUnitConstants
614d24c305SYikeZhou{
624d24c305SYikeZhou  // abstract out instruction decode magic numbers
634d24c305SYikeZhou  val RD_MSB  = 11
644d24c305SYikeZhou  val RD_LSB  = 7
654d24c305SYikeZhou  val RS1_MSB = 19
664d24c305SYikeZhou  val RS1_LSB = 15
674d24c305SYikeZhou  val RS2_MSB = 24
684d24c305SYikeZhou  val RS2_LSB = 20
694d24c305SYikeZhou  val RS3_MSB = 31
704d24c305SYikeZhou  val RS3_LSB = 27
714d24c305SYikeZhou}
724d24c305SYikeZhou
73be25371aSYikeZhou/**
74be25371aSYikeZhou * Decoded control signals
754d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
76be25371aSYikeZhou */
77c2a8ae00SYikeZhou
7857a10886SXuan Huabstract class XSDecodeBase {
7957a10886SXuan Hu  def X = BitPat("b?")
8057a10886SXuan Hu  def N = BitPat("b0")
8157a10886SXuan Hu  def Y = BitPat("b1")
8257a10886SXuan Hu  def T = true
8357a10886SXuan Hu  def F = false
8457a10886SXuan Hu  def generate() : List[BitPat]
8557a10886SXuan Hu}
8657a10886SXuan Hu
8757a10886SXuan Hucase class XSDecode(
8857a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
893b739f49SXuan Hu  fu: Int, fuOp: BitPat, selImm: BitPat,
90e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9157a10886SXuan Hu  xWen: Boolean = false,
9257a10886SXuan Hu  fWen: Boolean = false,
9357a10886SXuan Hu  vWen: Boolean = false,
9457a10886SXuan Hu  mWen: Boolean = false,
9557a10886SXuan Hu  xsTrap: Boolean = false,
9657a10886SXuan Hu  noSpec: Boolean = false,
9757a10886SXuan Hu  blockBack: Boolean = false,
9857a10886SXuan Hu  flushPipe: Boolean = false,
9957a10886SXuan Hu) extends XSDecodeBase {
10057a10886SXuan Hu  def generate() : List[BitPat] = {
1013f6c8c2cSXuan Hu    List (src1, src2, src3, BitPat(fu.U(FuType.num.W)), fuOp, xWen.B, fWen.B, (vWen || mWen).B, xsTrap.B, noSpec.B, blockBack.B, flushPipe.B, uopSplitType, selImm)
10257a10886SXuan Hu  }
10357a10886SXuan Hu}
10457a10886SXuan Hu
10557a10886SXuan Hucase class FDecode(
10657a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
1073b739f49SXuan Hu  fu: Int, fuOp: BitPat, selImm: BitPat = SelImm.X,
10817ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
10957a10886SXuan Hu  xWen: Boolean = false,
11057a10886SXuan Hu  fWen: Boolean = false,
11157a10886SXuan Hu  vWen: Boolean = false,
11257a10886SXuan Hu  mWen: Boolean = false,
11357a10886SXuan Hu  xsTrap: Boolean = false,
11457a10886SXuan Hu  noSpec: Boolean = false,
11557a10886SXuan Hu  blockBack: Boolean = false,
11657a10886SXuan Hu  flushPipe: Boolean = false,
11757a10886SXuan Hu) extends XSDecodeBase {
11857a10886SXuan Hu  def generate() : List[BitPat] = {
119e2695e90SzhanglyGit    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe).generate()
12057a10886SXuan Hu  }
12157a10886SXuan Hu}
12257a10886SXuan Hu
123be25371aSYikeZhou/**
124be25371aSYikeZhou * Decode constants for RV64
125be25371aSYikeZhou */
126be25371aSYikeZhouobject X64Decode extends DecodeConstants {
12757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
12857a10886SXuan Hu    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
12957a10886SXuan Hu    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
13057a10886SXuan Hu    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
1314d24c305SYikeZhou
13257a10886SXuan Hu    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T),
13357a10886SXuan Hu    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T),
13457a10886SXuan Hu    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T),
1354d24c305SYikeZhou
13657a10886SXuan Hu    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T),
13757a10886SXuan Hu    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T),
13857a10886SXuan Hu    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T),
13957a10886SXuan Hu    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T),
1404d24c305SYikeZhou
14157a10886SXuan Hu    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T),
14257a10886SXuan Hu    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T),
14357a10886SXuan Hu    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T),
14457a10886SXuan Hu    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T),
14557a10886SXuan Hu    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T),
146ee8ff153Szfw
14757a10886SXuan Hu    RORW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw, SelImm.X    , xWen = T),
14857a10886SXuan Hu    RORIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw, SelImm.IMM_I, xWen = T),
14957a10886SXuan Hu    ROLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw, SelImm.X    , xWen = T),
1504d24c305SYikeZhou  )
151be25371aSYikeZhou}
152be25371aSYikeZhou
153be25371aSYikeZhou/**
154be25371aSYikeZhou * Overall Decode constants
155be25371aSYikeZhou */
156be25371aSYikeZhouobject XDecode extends DecodeConstants {
15757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
15857a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
15957a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
16057a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
16157a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
16257a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
16357a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
16457a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
16557a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
16657a10886SXuan Hu    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T),
16757a10886SXuan Hu    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T),
16857a10886SXuan Hu    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T),
16957a10886SXuan Hu    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T),
17057a10886SXuan Hu    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T),
17157a10886SXuan Hu    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T),
17257a10886SXuan Hu    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T),
17357a10886SXuan Hu    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T),
17457a10886SXuan Hu    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T),
17557a10886SXuan Hu    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T),
17657a10886SXuan Hu    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T),
17757a10886SXuan Hu    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T),
17857a10886SXuan Hu    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T),
17957a10886SXuan Hu    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T),
18057a10886SXuan Hu    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T),
18157a10886SXuan Hu    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T),
18257a10886SXuan Hu    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T),
1834d24c305SYikeZhou
18457a10886SXuan Hu    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T),
18557a10886SXuan Hu    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T),
18657a10886SXuan Hu    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T),
18757a10886SXuan Hu    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T),
18857a10886SXuan Hu    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T),
1894d24c305SYikeZhou
19057a10886SXuan Hu    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T),
19157a10886SXuan Hu    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T),
19257a10886SXuan Hu    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T),
19357a10886SXuan Hu    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T),
19457a10886SXuan Hu    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T),
19557a10886SXuan Hu    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T),
19657a10886SXuan Hu    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T),
19757a10886SXuan Hu    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T),
1984d24c305SYikeZhou
19957a10886SXuan Hu    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
20057a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
201e2695e90SzhanglyGit    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , uopSplitType = UopSplitType.SCA_SIM, xWen = T),
2023b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
2033b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
2043b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2053b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2063b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2073b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2084d24c305SYikeZhou
2093b739f49SXuan Hu    // I-type, the immediate12 holds the CSR register.
21057a10886SXuan Hu    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21157a10886SXuan Hu    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21257a10886SXuan Hu    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2134d24c305SYikeZhou
21457a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21557a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21657a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2174d24c305SYikeZhou
21857a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21957a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22057a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22157a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22257a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22357a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2244d24c305SYikeZhou
22557a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22657a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22757a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2284d24c305SYikeZhou
2294d24c305SYikeZhou    // A-type
23057a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23157a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23257a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23357a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23457a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23557a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23657a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23757a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23857a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2394d24c305SYikeZhou
24057a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
24157a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
24257a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24357a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
24457a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d,   SelImm.X, xWen = T, noSpec = T, blockBack = T),
24557a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24757a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
24857a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2494d24c305SYikeZhou
25057a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25157a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25257a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25357a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
254ee8ff153Szfw
25557a10886SXuan Hu    ANDN    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn, SelImm.X, xWen = T),
25657a10886SXuan Hu    ORN     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X, xWen = T),
25757a10886SXuan Hu    XNOR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor, SelImm.X, xWen = T),
25857a10886SXuan Hu    ORC_B   -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb, SelImm.X, xWen = T),
259ee8ff153Szfw
26057a10886SXuan Hu    MIN     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X, xWen = T),
26157a10886SXuan Hu    MINU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu, SelImm.X, xWen = T),
26257a10886SXuan Hu    MAX     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X, xWen = T),
26357a10886SXuan Hu    MAXU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu, SelImm.X, xWen = T),
264ee8ff153Szfw
26557a10886SXuan Hu    SEXT_B  -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb, SelImm.X, xWen = T),
26657a10886SXuan Hu    PACKH   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh, SelImm.X, xWen = T),
26757a10886SXuan Hu    SEXT_H  -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth, SelImm.X, xWen = T),
26857a10886SXuan Hu    PACKW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw, SelImm.X, xWen = T),
26957a10886SXuan Hu    BREV8   -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X, xWen = T),
27057a10886SXuan Hu    REV8    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X, xWen = T),
27157a10886SXuan Hu    PACK    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X, xWen = T),
272ee8ff153Szfw
27357a10886SXuan Hu    BSET    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset, SelImm.X    , xWen = T),
27457a10886SXuan Hu    BSETI   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset, SelImm.IMM_I, xWen = T),
27557a10886SXuan Hu    BCLR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr, SelImm.X    , xWen = T),
27657a10886SXuan Hu    BCLRI   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr, SelImm.IMM_I, xWen = T),
27757a10886SXuan Hu    BINV    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv, SelImm.X    , xWen = T),
27857a10886SXuan Hu    BINVI   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv, SelImm.IMM_I, xWen = T),
27957a10886SXuan Hu    BEXT    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext, SelImm.X    , xWen = T),
28057a10886SXuan Hu    BEXTI   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext, SelImm.IMM_I, xWen = T),
281ee8ff153Szfw
28257a10886SXuan Hu    ROR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror, SelImm.X     , xWen = T),
28357a10886SXuan Hu    RORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror, SelImm.IMM_I , xWen = T),
28457a10886SXuan Hu    ROL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol, SelImm.X     , xWen = T),
285ee8ff153Szfw
28657a10886SXuan Hu    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T),
28757a10886SXuan Hu    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T),
28857a10886SXuan Hu    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T),
28957a10886SXuan Hu    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T),
29057a10886SXuan Hu    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T),
29157a10886SXuan Hu    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T),
29257a10886SXuan Hu    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T),
29357a10886SXuan Hu    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T),
2944d24c305SYikeZhou  )
295be25371aSYikeZhou}
296be25371aSYikeZhou
297be25371aSYikeZhou/**
298be25371aSYikeZhou * FP Decode constants
299be25371aSYikeZhou */
30057a10886SXuan Huobject FpDecode extends DecodeConstants{
30157a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
30257a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
30357a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
30457a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
30557a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3064d24c305SYikeZhou
30757a10886SXuan Hu    FCLASS_S-> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
30857a10886SXuan Hu    FCLASS_D-> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3094d24c305SYikeZhou
31057a10886SXuan Hu    FMV_X_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
31157a10886SXuan Hu    FMV_X_W -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3124d24c305SYikeZhou
31357a10886SXuan Hu    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f,   FuOpType.X, fWen = T),
31457a10886SXuan Hu    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f,   FuOpType.X, fWen = T),
315c2a8ae00SYikeZhou
31657a10886SXuan Hu    FSGNJ_S  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
31757a10886SXuan Hu    FSGNJ_D  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
31857a10886SXuan Hu    FSGNJX_S -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
31957a10886SXuan Hu    FSGNJX_D -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
32057a10886SXuan Hu    FSGNJN_S -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
32157a10886SXuan Hu    FSGNJN_D -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
3224d24c305SYikeZhou
3234d24c305SYikeZhou    // FP to FP
32457a10886SXuan Hu    FCVT_S_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
32557a10886SXuan Hu    FCVT_D_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
3264d24c305SYikeZhou
3274d24c305SYikeZhou    // Int to FP
32857a10886SXuan Hu    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
32957a10886SXuan Hu    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
33057a10886SXuan Hu    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
33157a10886SXuan Hu    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
3324d24c305SYikeZhou
33357a10886SXuan Hu    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
33457a10886SXuan Hu    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
33557a10886SXuan Hu    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
33657a10886SXuan Hu    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
3374d24c305SYikeZhou
3384d24c305SYikeZhou    // FP to Int
33957a10886SXuan Hu    FCVT_W_S  -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
34057a10886SXuan Hu    FCVT_WU_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
34157a10886SXuan Hu    FCVT_L_S  -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
34257a10886SXuan Hu    FCVT_LU_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3434d24c305SYikeZhou
34457a10886SXuan Hu    FCVT_W_D  -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
34557a10886SXuan Hu    FCVT_WU_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
34657a10886SXuan Hu    FCVT_L_D  -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
34757a10886SXuan Hu    FCVT_LU_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3484d24c305SYikeZhou
34957a10886SXuan Hu    FEQ_S    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
35057a10886SXuan Hu    FLT_S    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
35157a10886SXuan Hu    FLE_S    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3524d24c305SYikeZhou
35357a10886SXuan Hu    FEQ_D    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
35457a10886SXuan Hu    FLT_D    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
35557a10886SXuan Hu    FLE_D    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3564d24c305SYikeZhou
35757a10886SXuan Hu    FMIN_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
35857a10886SXuan Hu    FMAX_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
35957a10886SXuan Hu    FMIN_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
36057a10886SXuan Hu    FMAX_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
3614d24c305SYikeZhou
36257a10886SXuan Hu    FADD_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
36357a10886SXuan Hu    FSUB_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
36457a10886SXuan Hu    FMUL_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
36557a10886SXuan Hu    FADD_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
36657a10886SXuan Hu    FSUB_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
36757a10886SXuan Hu    FMUL_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
3684d24c305SYikeZhou
36957a10886SXuan Hu    FMADD_S  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
37057a10886SXuan Hu    FMSUB_S  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
37157a10886SXuan Hu    FNMADD_S -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
37257a10886SXuan Hu    FNMSUB_S -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
37357a10886SXuan Hu    FMADD_D  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
37457a10886SXuan Hu    FMSUB_D  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
37557a10886SXuan Hu    FNMADD_D -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
37657a10886SXuan Hu    FNMSUB_D -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
3774d24c305SYikeZhou  )
378be25371aSYikeZhou}
379be25371aSYikeZhou
380be25371aSYikeZhou/**
381ee8ff153Szfw  * Bit Manipulation Decode
382ee8ff153Szfw  */
383ee8ff153Szfwobject BDecode extends DecodeConstants{
38457a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
385ee8ff153Szfw    // Basic bit manipulation
38657a10886SXuan Hu    CLZ     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.clz,    SelImm.X, xWen = T),
38757a10886SXuan Hu    CTZ     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.ctz,    SelImm.X, xWen = T),
38857a10886SXuan Hu    CPOP    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop,   SelImm.X, xWen = T),
38957a10886SXuan Hu    XPERM8  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb, SelImm.X, xWen = T),
39057a10886SXuan Hu    XPERM4  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn, SelImm.X, xWen = T),
39107596dc6Szfw
39257a10886SXuan Hu    CLZW    -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.clzw,    SelImm.X, xWen = T),
39357a10886SXuan Hu    CTZW    -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.ctzw,    SelImm.X, xWen = T),
39457a10886SXuan Hu    CPOPW   -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw,   SelImm.X, xWen = T),
395ee8ff153Szfw
39657a10886SXuan Hu    CLMUL   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul,  SelImm.X, xWen = T),
39757a10886SXuan Hu    CLMULH  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh, SelImm.X, xWen = T),
39857a10886SXuan Hu    CLMULR  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr, SelImm.X, xWen = T),
3993feeca58Szfw
40057a10886SXuan Hu    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es,    SelImm.X    , xWen = T),
40157a10886SXuan Hu    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm,   SelImm.X    , xWen = T),
40257a10886SXuan Hu    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds,    SelImm.X    , xWen = T),
40357a10886SXuan Hu    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm,   SelImm.X    , xWen = T),
40457a10886SXuan Hu    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im,    SelImm.X    , xWen = T),
40557a10886SXuan Hu    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i,  SelImm.IMM_I, xWen = T),
40657a10886SXuan Hu    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2,   SelImm.X    , xWen = T),
40757a10886SXuan Hu    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T),
40857a10886SXuan Hu    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T),
40957a10886SXuan Hu    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T),
41057a10886SXuan Hu    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T),
41157a10886SXuan Hu    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T),
41257a10886SXuan Hu    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T),
41357a10886SXuan Hu    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T),
41457a10886SXuan Hu    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T),
41557a10886SXuan Hu    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0,      SelImm.X    , xWen = T),
41657a10886SXuan Hu    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1,      SelImm.X    , xWen = T),
41757a10886SXuan Hu    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0,     SelImm.X    , xWen = T),
41857a10886SXuan Hu    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1,     SelImm.X    , xWen = T),
41957a10886SXuan Hu    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2,     SelImm.X    , xWen = T),
42057a10886SXuan Hu    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3,     SelImm.X    , xWen = T),
42157a10886SXuan Hu    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0,     SelImm.X    , xWen = T),
42257a10886SXuan Hu    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1,     SelImm.X    , xWen = T),
42357a10886SXuan Hu    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2,     SelImm.X    , xWen = T),
42457a10886SXuan Hu    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3,     SelImm.X    , xWen = T),
425ee8ff153Szfw  )
426ee8ff153Szfw}
427ee8ff153Szfw
428ee8ff153Szfw/**
429be25371aSYikeZhou * FP Divide SquareRoot Constants
430be25371aSYikeZhou */
431be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
43257a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
43372d89280SXuan Hu    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T),
43472d89280SXuan Hu    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T),
43572d89280SXuan Hu    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T),
43672d89280SXuan Hu    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T),
4374d24c305SYikeZhou  )
438be25371aSYikeZhou}
439be25371aSYikeZhou
4404d24c305SYikeZhou/**
441af2f7849Shappy-lx * Svinval extension Constants
442af2f7849Shappy-lx */
443af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
44457a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
445af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
446af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
447af2f7849Shappy-lx     */
44857a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
449af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
450af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
451af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
452af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
453af2f7849Shappy-lx     */
45457a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
455af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
456af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
457af2f7849Shappy-lx     * then dispatch and issue this instrucion
458af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
459af2f7849Shappy-lx     */
46057a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
461af2f7849Shappy-lx    /* what is Svinval extension ?
462af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
463af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
464af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
465af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
466af2f7849Shappy-lx     *
467af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
468af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
469af2f7849Shappy-lx     */
470af2f7849Shappy-lx  )
471af2f7849Shappy-lx}
47257a10886SXuan Hu
473af2f7849Shappy-lx/*
474ca18a0b4SWilliam Wang * CBO decode
475ca18a0b4SWilliam Wang */
476ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
47757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
47857a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
47957a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
48057a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
48157a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
482ca18a0b4SWilliam Wang  )
483ca18a0b4SWilliam Wang}
484ca18a0b4SWilliam Wang
485ca18a0b4SWilliam Wang/**
4864d24c305SYikeZhou * XiangShan Trap Decode constants
4874d24c305SYikeZhou */
4884d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
489361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
49057a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
49157a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
4924d24c305SYikeZhou  )
4934d24c305SYikeZhou}
494be25371aSYikeZhou
495b0ae3ac4SLinJiaweiabstract class Imm(val len: Int) extends Bundle {
496b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
497b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
498b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
499b0ae3ac4SLinJiawei}
500b0ae3ac4SLinJiawei
501b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
502fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
503b0ae3ac4SLinJiawei
504b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
505b0ae3ac4SLinJiawei    Cat(instr(31, 20))
506b0ae3ac4SLinJiawei}
507b0ae3ac4SLinJiawei
508b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
509b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
510b0ae3ac4SLinJiawei
511b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
512b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
513b0ae3ac4SLinJiawei}
514b0ae3ac4SLinJiawei
515b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
516b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
517b0ae3ac4SLinJiawei
518b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
519b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
520b0ae3ac4SLinJiawei}
521b0ae3ac4SLinJiawei
522b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
523fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
524b0ae3ac4SLinJiawei
525b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
526b0ae3ac4SLinJiawei    instr(31, 12)
527c2a8ae00SYikeZhou  }
528c2a8ae00SYikeZhou}
529c2a8ae00SYikeZhou
530b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
531b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
532b0ae3ac4SLinJiawei
533b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
534b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
535b0ae3ac4SLinJiawei  }
536b0ae3ac4SLinJiawei}
537b0ae3ac4SLinJiawei
538b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){
539b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
540b0ae3ac4SLinJiawei
541b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
542b0ae3ac4SLinJiawei    Cat(instr(19, 15), instr(31, 20))
543b0ae3ac4SLinJiawei  }
544b0ae3ac4SLinJiawei}
545b0ae3ac4SLinJiawei
546ee8ff153Szfwcase class Imm_B6() extends Imm(6){
547ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
548ee8ff153Szfw
549ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
550ee8ff153Szfw    instr(25, 20)
551ee8ff153Szfw  }
552ee8ff153Szfw}
553ee8ff153Szfw
55458c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
55558c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
55658c35d23Shuxuan0307
55758c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
55858c35d23Shuxuan0307    instr(19, 15)
55958c35d23Shuxuan0307  }
56058c35d23Shuxuan0307}
561b52d4755SXuan Hu
56258c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
56358c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
56458c35d23Shuxuan0307
56558c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
56658c35d23Shuxuan0307    instr(19, 15)
56758c35d23Shuxuan0307  }
56858c35d23Shuxuan0307}
569b52d4755SXuan Hu
5704aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
5714aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
5724aa9ed34Sfdy
5734aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
5744aa9ed34Sfdy    instr(30, 20)
5754aa9ed34Sfdy  }
5764aa9ed34Sfdy}
577b52d4755SXuan Hu
578b52d4755SXuan Hucase class Imm_VSETIVLI() extends Imm(13){
5794aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
5804aa9ed34Sfdy
5814aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
5825c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
583b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
584b52d4755SXuan Hu    val vtype8 = rvInst.ZIMM_VTYPE
585b52d4755SXuan Hu    Cat(uimm5, vtype8)
586b52d4755SXuan Hu  }
587b52d4755SXuan Hu  /**
588b52d4755SXuan Hu    * get VType from extended imm
589b52d4755SXuan Hu    * @param extedImm
590b52d4755SXuan Hu    * @return VType
591b52d4755SXuan Hu    */
592b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
593b52d4755SXuan Hu    val vtype = Wire(new InstVType)
594b52d4755SXuan Hu    vtype := extedImm(7, 0).asTypeOf(new InstVType)
595b52d4755SXuan Hu    vtype
596b52d4755SXuan Hu  }
597b52d4755SXuan Hu
598b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
599b52d4755SXuan Hu    extedImm(12, 8)
6004aa9ed34Sfdy  }
6014aa9ed34Sfdy}
602b0ae3ac4SLinJiaweiobject ImmUnion {
603b0ae3ac4SLinJiawei  val I = Imm_I()
604b0ae3ac4SLinJiawei  val S = Imm_S()
605b0ae3ac4SLinJiawei  val B = Imm_B()
606b0ae3ac4SLinJiawei  val U = Imm_U()
607b0ae3ac4SLinJiawei  val J = Imm_J()
608b0ae3ac4SLinJiawei  val Z = Imm_Z()
609ee8ff153Szfw  val B6 = Imm_B6()
61058c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
61158c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
6124aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
6134aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
6144aa9ed34Sfdy
6154aa9ed34Sfdy  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI)
616b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
617b0ae3ac4SLinJiawei  val immSelMap = Seq(
618b0ae3ac4SLinJiawei    SelImm.IMM_I,
619b0ae3ac4SLinJiawei    SelImm.IMM_S,
620b0ae3ac4SLinJiawei    SelImm.IMM_SB,
621b0ae3ac4SLinJiawei    SelImm.IMM_U,
622b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
623ee8ff153Szfw    SelImm.IMM_Z,
62458c35d23Shuxuan0307    SelImm.IMM_B6,
62558c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
6264aa9ed34Sfdy    SelImm.IMM_OPIVIU,
6274aa9ed34Sfdy    SelImm.IMM_VSETVLI,
6284aa9ed34Sfdy    SelImm.IMM_VSETIVLI
629b0ae3ac4SLinJiawei  ).zip(imms)
630b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
631b0ae3ac4SLinJiawei}
632b0ae3ac4SLinJiawei
633fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
634fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
635fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
636fd7603d9SYinan Xu    Cat(lui_imm(Imm_U().len - loadImm.getWidth - 1, 0), loadImm)
637fd7603d9SYinan Xu  }
6383b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
639fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
6403b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
641fd7603d9SYinan Xu    Imm_U().do_toImm32(imm_u)
642fd7603d9SYinan Xu  }
643fd7603d9SYinan Xu}
644b0ae3ac4SLinJiawei
645be25371aSYikeZhou/**
646be25371aSYikeZhou * IO bundle for the Decode unit
647be25371aSYikeZhou */
6482225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
6493b739f49SXuan Hu  val enq = new Bundle {
6503b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
651d91483a6Sfdy    val vtype = Input(new VType)
6524aa9ed34Sfdy  }
6533b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
6543b739f49SXuan Hu  val deq = new Bundle {
655d91483a6Sfdy    val decodedInst = Output(new DecodedInst)
656d91483a6Sfdy    val isComplex = Output(Bool())
6573b739f49SXuan Hu  }
658af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
659be25371aSYikeZhou}
660be25371aSYikeZhou
661be25371aSYikeZhou/**
662be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
663be25371aSYikeZhou */
6642225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
665be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
666be25371aSYikeZhou
6673b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
668be25371aSYikeZhou
66975e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
67075e2c883SXuan Hu
67157a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
67257a10886SXuan Hu    FpDecode.table ++
673a19215ddSYinan Xu    FDivSqrtDecode.table ++
674a19215ddSYinan Xu    X64Decode.table ++
675a19215ddSYinan Xu    XSTrapDecode.table ++
676a19215ddSYinan Xu    BDecode.table ++
677a19215ddSYinan Xu    CBODecode.table ++
678b65b9ebaSXuan Hu    SvinvalDecode.table ++
679b65b9ebaSXuan Hu    VecDecoder.table
680b65b9ebaSXuan Hu
681d91483a6Sfdy  require(decode_table.map(_._2.length == 14).reduce(_ && _), "Decode tables have different column size")
682a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
6833b739f49SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu && t.reverse.head.value == SelImm.IMM_U.litValue
684a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
685a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
686be25371aSYikeZhou
6874d24c305SYikeZhou  // output
6883b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
689be25371aSYikeZhou
6902ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
6917ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
6923b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
6931a1319cbSLinJiawei
6943b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
6953b739f49SXuan Hu
696a8db15d8Sfdy  decodedInst.uopIdx := 0.U
697d91483a6Sfdy  decodedInst.firstUop := true.B
698d91483a6Sfdy  decodedInst.lastUop := true.B
699f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
700deb6421eSHaojin Tang
70173c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
7023b739f49SXuan Hu  decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U
70373c4359eSYikeZhou
704996aacc9SXuan Hu  private val v0Idx = 0
705996aacc9SXuan Hu  private val vconfigIdx = VCONFIG_IDX
706996aacc9SXuan Hu
707178dd38cSYikeZhou  // read src1~3 location
7083b739f49SXuan Hu  decodedInst.lsrc(0) := ctrl_flow.instr(RS1_MSB, RS1_LSB)
7093b739f49SXuan Hu  decodedInst.lsrc(1) := ctrl_flow.instr(RS2_MSB, RS2_LSB)
7103b739f49SXuan Hu  decodedInst.lsrc(2) := ctrl_flow.instr(RS3_MSB, RS3_LSB)
711996aacc9SXuan Hu  decodedInst.lsrc(3) := v0Idx.U
712996aacc9SXuan Hu  decodedInst.lsrc(4) := vconfigIdx.U
713996aacc9SXuan Hu  decodedInst.srcType(3) := Mux(inst.VM.asBool, SrcType.DC, SrcType.vp) // mask src
714996aacc9SXuan Hu  decodedInst.srcType(4) := SrcType.vp // vconfig
715b6b11f60SXuan Hu
7163f6c8c2cSXuan Hu  // cs.lsrc(2) := Mux(FuType.isVecExu(cs.fuType), ctrl_flow.instr(RD_MSB, RD_LSB), ctrl_flow.instr(RS3_MSB, RS3_LSB))
717178dd38cSYikeZhou  // read dest location
7183b739f49SXuan Hu  decodedInst.ldest := ctrl_flow.instr(RD_MSB, RD_LSB)
7194d24c305SYikeZhou
720c2a8ae00SYikeZhou  // fill in exception vector
7213b739f49SXuan Hu  decodedInst.exceptionVec(illegalInstr) := decodedInst.selImm === SelImm.INVALID_INSTR
7224d24c305SYikeZhou
723af2f7849Shappy-lx  when (!io.csrCtrl.svinval_enable) {
7243b739f49SXuan Hu    val base_ii = decodedInst.selImm === SelImm.INVALID_INSTR
725af2f7849Shappy-lx    val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr
726af2f7849Shappy-lx    val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr
727af2f7849Shappy-lx    val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr
728af2f7849Shappy-lx    val svinval_ii = sinval || w_inval || inval_ir
7293b739f49SXuan Hu    decodedInst.exceptionVec(illegalInstr) := base_ii || svinval_ii
7303b739f49SXuan Hu    decodedInst.flushPipe := false.B
731af2f7849Shappy-lx  }
732af2f7849Shappy-lx
733c2a8ae00SYikeZhou  // fix frflags
734c2a8ae00SYikeZhou  //                           fflags    zero csrrs rd    csr
735c2a8ae00SYikeZhou  val isFrflags = BitPat("b000000000001_00000_010_?????_1110011") === ctrl_flow.instr
7363b739f49SXuan Hu  when (decodedInst.fuType === FuType.csr.U && isFrflags) {
7373b739f49SXuan Hu    decodedInst.blockBackward := false.B
738c2a8ae00SYikeZhou  }
739c2a8ae00SYikeZhou
7403b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
741b0ae3ac4SLinJiawei    x => {
7427ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
743b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
744b0ae3ac4SLinJiawei      x._1 -> minBits
745b0ae3ac4SLinJiawei    }
746b0ae3ac4SLinJiawei  ))
747aac4464eSYinan Xu
7483b739f49SXuan Hu  decodedInst.commitType := 0.U // Todo: remove it
74975e2c883SXuan Hu
75075e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
751be25371aSYikeZhou
75239c388b5SXuan Hu  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VREM_VV, VREM_VX, VREMU_VV, VFRDIV_VF, VFRSUB_VF)
75339c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
75439c388b5SXuan Hu  private val narrowInsts = Seq(
75539c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
75639c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
75739c388b5SXuan Hu  )
75839c388b5SXuan Hu  private val maskDstInsts = Seq(
75939c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
76039c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
76139c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
762*9eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
763*9eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
764*9eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
765*9eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
76639c388b5SXuan Hu  )
76739c388b5SXuan Hu
7683b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
76975e2c883SXuan Hu  decodedInst.vpu.vill  := io.enq.vtype.illegal
77075e2c883SXuan Hu  decodedInst.vpu.vma   := io.enq.vtype.vma
77175e2c883SXuan Hu  decodedInst.vpu.vta   := io.enq.vtype.vta
77275e2c883SXuan Hu  decodedInst.vpu.vsew  := io.enq.vtype.vsew
77375e2c883SXuan Hu  decodedInst.vpu.vlmul := io.enq.vtype.vlmul
77475e2c883SXuan Hu  decodedInst.vpu.vm    := inst.VM
77575e2c883SXuan Hu  decodedInst.vpu.nf    := inst.NF
77642475509SXuan Hu  decodedInst.vpu.needScalaSrc := Category.needScalaSrc(inst.VCATEGORY)
77794e7468cSXuan Hu  decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
77839c388b5SXuan Hu  decodedInst.vpu.isExt     := vextInsts.map(_ === inst.ALL).reduce(_ || _)
77939c388b5SXuan Hu  decodedInst.vpu.isNarrow  := narrowInsts.map(_ === inst.ALL).reduce(_ || _)
78039c388b5SXuan Hu  decodedInst.vpu.isDstMask := maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
78175e2c883SXuan Hu
78275e2c883SXuan Hu  io.deq.isComplex := UopSplitType.needSplit(decodedInst.uopSplitType)
78375e2c883SXuan Hu  io.deq.decodedInst := decodedInst
7844aa9ed34Sfdy
785be25371aSYikeZhou  //-------------------------------------------------------------
786be25371aSYikeZhou  // Debug Info
7873b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
7883b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
7893b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
7903b739f49SXuan Hu//  XSDebug("out: srcType(0)=%b srcType(1)=%b srcType(2)=%b lsrc(0)=%d lsrc(1)=%d lsrc(2)=%d ldest=%d fuType=%b fuOpType=%b\n",
7913b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
7923b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
7933b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
7943b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
7953b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
7963b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
7973b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
7983b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
799be25371aSYikeZhou}
800