xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 57a10886ebedfc930c9a466960add81768f37697)
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._
22a19215ddSYinan Xuimport freechips.rocketchip.rocket.Instructions
236ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat
24be25371aSYikeZhouimport utils._
253c02ee8fSwakafaimport utility._
266ab6918fSYinan Xuimport xiangshan.ExceptionNO.illegalInstr
276ab6918fSYinan Xuimport xiangshan._
28361e6d51SJiuyang Liuimport freechips.rocketchip.rocket.Instructions._
29be25371aSYikeZhou
30be25371aSYikeZhou/**
31be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
32be25371aSYikeZhou */
33be25371aSYikeZhouabstract trait DecodeConstants {
34361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
35*57a10886SXuan Hu  def X = BitPat("b0")
364d24c305SYikeZhou  def N = BitPat("b0")
374d24c305SYikeZhou  def Y = BitPat("b1")
38*57a10886SXuan Hu  def T = true
39*57a10886SXuan Hu  def F = false
404d24c305SYikeZhou
41c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
4220e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
434d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
44*57a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
45*57a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
46*57a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
47*57a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
48*57a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
49*57a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  |  selImm
50*57a10886SXuan Hu    List(SrcType.X, SrcType.X, SrcType.X, FuType.X, FuOpType.X, N, N, N, N, N, N, N, SelImm.INVALID_INSTR) // Use SelImm to indicate invalid instr
514d24c305SYikeZhou
52*57a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
53*57a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
54be25371aSYikeZhou}
55be25371aSYikeZhou
56c2a8ae00SYikeZhoutrait DecodeUnitConstants
574d24c305SYikeZhou{
584d24c305SYikeZhou  // abstract out instruction decode magic numbers
594d24c305SYikeZhou  val RD_MSB  = 11
604d24c305SYikeZhou  val RD_LSB  = 7
614d24c305SYikeZhou  val RS1_MSB = 19
624d24c305SYikeZhou  val RS1_LSB = 15
634d24c305SYikeZhou  val RS2_MSB = 24
644d24c305SYikeZhou  val RS2_LSB = 20
654d24c305SYikeZhou  val RS3_MSB = 31
664d24c305SYikeZhou  val RS3_LSB = 27
674d24c305SYikeZhou}
684d24c305SYikeZhou
69be25371aSYikeZhou/**
70be25371aSYikeZhou * Decoded control signals
714d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
72be25371aSYikeZhou */
73c2a8ae00SYikeZhou
74*57a10886SXuan Huabstract class XSDecodeBase {
75*57a10886SXuan Hu  def X = BitPat("b?")
76*57a10886SXuan Hu  def N = BitPat("b0")
77*57a10886SXuan Hu  def Y = BitPat("b1")
78*57a10886SXuan Hu  def T = true
79*57a10886SXuan Hu  def F = false
80*57a10886SXuan Hu  def generate() : List[BitPat]
81*57a10886SXuan Hu}
82*57a10886SXuan Hu
83*57a10886SXuan Hucase class XSDecode(
84*57a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
85*57a10886SXuan Hu  fu: BitPat, fuOp: BitPat, selImm: BitPat,
86*57a10886SXuan Hu  xWen: Boolean = false,
87*57a10886SXuan Hu  fWen: Boolean = false,
88*57a10886SXuan Hu  vWen: Boolean = false,
89*57a10886SXuan Hu  mWen: Boolean = false,
90*57a10886SXuan Hu  xsTrap: Boolean = false,
91*57a10886SXuan Hu  noSpec: Boolean = false,
92*57a10886SXuan Hu  blockBack: Boolean = false,
93*57a10886SXuan Hu  flushPipe: Boolean = false,
94*57a10886SXuan Hu) extends XSDecodeBase {
95*57a10886SXuan Hu  def generate() : List[BitPat] = {
96*57a10886SXuan Hu    List (src1, src2, src3, fu, fuOp, xWen.B, fWen.B, (vWen || mWen).B, xsTrap.B, noSpec.B, blockBack.B, flushPipe.B, selImm)
97*57a10886SXuan Hu  }
98*57a10886SXuan Hu}
99*57a10886SXuan Hu
100*57a10886SXuan Hucase class FDecode(
101*57a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
102*57a10886SXuan Hu  fu: BitPat, fuOp: BitPat, selImm: BitPat = SelImm.X,
103*57a10886SXuan Hu  xWen: Boolean = false,
104*57a10886SXuan Hu  fWen: Boolean = false,
105*57a10886SXuan Hu  vWen: Boolean = false,
106*57a10886SXuan Hu  mWen: Boolean = false,
107*57a10886SXuan Hu  xsTrap: Boolean = false,
108*57a10886SXuan Hu  noSpec: Boolean = false,
109*57a10886SXuan Hu  blockBack: Boolean = false,
110*57a10886SXuan Hu  flushPipe: Boolean = false,
111*57a10886SXuan Hu) extends XSDecodeBase {
112*57a10886SXuan Hu  def generate() : List[BitPat] = {
113*57a10886SXuan Hu    XSDecode(src1, src2, src3, fu, fuOp, selImm, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe).generate()
114*57a10886SXuan Hu  }
115*57a10886SXuan Hu}
116*57a10886SXuan Hu
117be25371aSYikeZhou/**
118be25371aSYikeZhou * Decode constants for RV64
119be25371aSYikeZhou */
120be25371aSYikeZhouobject X64Decode extends DecodeConstants {
121*57a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
122*57a10886SXuan Hu    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
123*57a10886SXuan Hu    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
124*57a10886SXuan Hu    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
1254d24c305SYikeZhou
126*57a10886SXuan Hu    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T),
127*57a10886SXuan Hu    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T),
128*57a10886SXuan Hu    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T),
1294d24c305SYikeZhou
130*57a10886SXuan Hu    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T),
131*57a10886SXuan Hu    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T),
132*57a10886SXuan Hu    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T),
133*57a10886SXuan Hu    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T),
1344d24c305SYikeZhou
135*57a10886SXuan Hu    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T),
136*57a10886SXuan Hu    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T),
137*57a10886SXuan Hu    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T),
138*57a10886SXuan Hu    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T),
139*57a10886SXuan Hu    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T),
140ee8ff153Szfw
141*57a10886SXuan Hu    RORW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw, SelImm.X    , xWen = T),
142*57a10886SXuan Hu    RORIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw, SelImm.IMM_I, xWen = T),
143*57a10886SXuan Hu    ROLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw, SelImm.X    , xWen = T),
1444d24c305SYikeZhou  )
145be25371aSYikeZhou}
146be25371aSYikeZhou
147be25371aSYikeZhou/**
148be25371aSYikeZhou * Overall Decode constants
149be25371aSYikeZhou */
150be25371aSYikeZhouobject XDecode extends DecodeConstants {
151*57a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
152*57a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
153*57a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
154*57a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
155*57a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
156*57a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
157*57a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
158*57a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
159*57a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
160*57a10886SXuan Hu    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T),
161*57a10886SXuan Hu    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T),
162*57a10886SXuan Hu    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T),
163*57a10886SXuan Hu    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T),
164*57a10886SXuan Hu    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T),
165*57a10886SXuan Hu    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T),
166*57a10886SXuan Hu    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T),
167*57a10886SXuan Hu    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T),
168*57a10886SXuan Hu    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T),
169*57a10886SXuan Hu    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T),
170*57a10886SXuan Hu    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T),
171*57a10886SXuan Hu    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T),
172*57a10886SXuan Hu    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T),
173*57a10886SXuan Hu    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T),
174*57a10886SXuan Hu    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T),
175*57a10886SXuan Hu    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T),
176*57a10886SXuan Hu    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T),
1774d24c305SYikeZhou
178*57a10886SXuan Hu    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T),
179*57a10886SXuan Hu    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T),
180*57a10886SXuan Hu    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T),
181*57a10886SXuan Hu    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T),
182*57a10886SXuan Hu    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T),
1834d24c305SYikeZhou
184*57a10886SXuan Hu    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T),
185*57a10886SXuan Hu    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T),
186*57a10886SXuan Hu    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T),
187*57a10886SXuan Hu    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T),
188*57a10886SXuan Hu    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T),
189*57a10886SXuan Hu    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T),
190*57a10886SXuan Hu    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T),
191*57a10886SXuan Hu    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T),
1924d24c305SYikeZhou
193*57a10886SXuan Hu    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
194*57a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
195*57a10886SXuan Hu    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T),
196*57a10886SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.beq   , SelImm.IMM_SB          ),
197*57a10886SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bne   , SelImm.IMM_SB          ),
198*57a10886SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bge   , SelImm.IMM_SB          ),
199*57a10886SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bgeu  , SelImm.IMM_SB          ),
200*57a10886SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.blt   , SelImm.IMM_SB          ),
201*57a10886SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bltu  , SelImm.IMM_SB          ),
2024d24c305SYikeZhou
203*57a10886SXuan Hu    // I-type, XSDecodeiate12 holds the CSR register.
204*57a10886SXuan Hu    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
205*57a10886SXuan Hu    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
206*57a10886SXuan Hu    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2074d24c305SYikeZhou
208*57a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
209*57a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
210*57a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2114d24c305SYikeZhou
212*57a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
213*57a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
214*57a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
215*57a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
216*57a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
217*57a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2184d24c305SYikeZhou
219*57a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
220*57a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
221*57a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2224d24c305SYikeZhou
2234d24c305SYikeZhou    // A-type
224*57a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
225*57a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
226*57a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
227*57a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
228*57a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
229*57a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
230*57a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
231*57a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
232*57a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2334d24c305SYikeZhou
234*57a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
235*57a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
236*57a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
237*57a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
238*57a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d,   SelImm.X, xWen = T, noSpec = T, blockBack = T),
239*57a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
240*57a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
241*57a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d,  SelImm.X, xWen = T, noSpec = T, blockBack = T),
242*57a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2434d24c305SYikeZhou
244*57a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
245*57a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
246*57a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
247*57a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
248ee8ff153Szfw
249*57a10886SXuan Hu    ANDN    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn, SelImm.X, xWen = T),
250*57a10886SXuan Hu    ORN     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X, xWen = T),
251*57a10886SXuan Hu    XNOR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor, SelImm.X, xWen = T),
252*57a10886SXuan Hu    ORC_B   -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb, SelImm.X, xWen = T),
253ee8ff153Szfw
254*57a10886SXuan Hu    MIN     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X, xWen = T),
255*57a10886SXuan Hu    MINU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu, SelImm.X, xWen = T),
256*57a10886SXuan Hu    MAX     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X, xWen = T),
257*57a10886SXuan Hu    MAXU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu, SelImm.X, xWen = T),
258ee8ff153Szfw
259*57a10886SXuan Hu    SEXT_B  -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb, SelImm.X, xWen = T),
260*57a10886SXuan Hu    PACKH   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh, SelImm.X, xWen = T),
261*57a10886SXuan Hu    SEXT_H  -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth, SelImm.X, xWen = T),
262*57a10886SXuan Hu    PACKW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw, SelImm.X, xWen = T),
263*57a10886SXuan Hu    BREV8   -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X, xWen = T),
264*57a10886SXuan Hu    REV8    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X, xWen = T),
265*57a10886SXuan Hu    PACK    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X, xWen = T),
266ee8ff153Szfw
267*57a10886SXuan Hu    BSET    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset, SelImm.X    , xWen = T),
268*57a10886SXuan Hu    BSETI   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset, SelImm.IMM_I, xWen = T),
269*57a10886SXuan Hu    BCLR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr, SelImm.X    , xWen = T),
270*57a10886SXuan Hu    BCLRI   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr, SelImm.IMM_I, xWen = T),
271*57a10886SXuan Hu    BINV    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv, SelImm.X    , xWen = T),
272*57a10886SXuan Hu    BINVI   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv, SelImm.IMM_I, xWen = T),
273*57a10886SXuan Hu    BEXT    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext, SelImm.X    , xWen = T),
274*57a10886SXuan Hu    BEXTI   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext, SelImm.IMM_I, xWen = T),
275ee8ff153Szfw
276*57a10886SXuan Hu    ROR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror, SelImm.X     , xWen = T),
277*57a10886SXuan Hu    RORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror, SelImm.IMM_I , xWen = T),
278*57a10886SXuan Hu    ROL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol, SelImm.X     , xWen = T),
279ee8ff153Szfw
280*57a10886SXuan Hu    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T),
281*57a10886SXuan Hu    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T),
282*57a10886SXuan Hu    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T),
283*57a10886SXuan Hu    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T),
284*57a10886SXuan Hu    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T),
285*57a10886SXuan Hu    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T),
286*57a10886SXuan Hu    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T),
287*57a10886SXuan Hu    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T),
2884d24c305SYikeZhou  )
289be25371aSYikeZhou}
290be25371aSYikeZhou
291be25371aSYikeZhou/**
292be25371aSYikeZhou * FP Decode constants
293be25371aSYikeZhou */
294*57a10886SXuan Huobject FpDecode extends DecodeConstants{
295*57a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
296*57a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
297*57a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
298*57a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
299*57a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3004d24c305SYikeZhou
301*57a10886SXuan Hu    FCLASS_S-> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
302*57a10886SXuan Hu    FCLASS_D-> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3034d24c305SYikeZhou
304*57a10886SXuan Hu    FMV_X_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
305*57a10886SXuan Hu    FMV_X_W -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3064d24c305SYikeZhou
307*57a10886SXuan Hu    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f,   FuOpType.X, fWen = T),
308*57a10886SXuan Hu    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f,   FuOpType.X, fWen = T),
309c2a8ae00SYikeZhou
310*57a10886SXuan Hu    FSGNJ_S  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
311*57a10886SXuan Hu    FSGNJ_D  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
312*57a10886SXuan Hu    FSGNJX_S -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
313*57a10886SXuan Hu    FSGNJX_D -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
314*57a10886SXuan Hu    FSGNJN_S -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
315*57a10886SXuan Hu    FSGNJN_D -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
3164d24c305SYikeZhou
3174d24c305SYikeZhou    // FP to FP
318*57a10886SXuan Hu    FCVT_S_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
319*57a10886SXuan Hu    FCVT_D_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
3204d24c305SYikeZhou
3214d24c305SYikeZhou    // Int to FP
322*57a10886SXuan Hu    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
323*57a10886SXuan Hu    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
324*57a10886SXuan Hu    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
325*57a10886SXuan Hu    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
3264d24c305SYikeZhou
327*57a10886SXuan Hu    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
328*57a10886SXuan Hu    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
329*57a10886SXuan Hu    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
330*57a10886SXuan Hu    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T),
3314d24c305SYikeZhou
3324d24c305SYikeZhou    // FP to Int
333*57a10886SXuan Hu    FCVT_W_S  -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
334*57a10886SXuan Hu    FCVT_WU_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
335*57a10886SXuan Hu    FCVT_L_S  -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
336*57a10886SXuan Hu    FCVT_LU_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3374d24c305SYikeZhou
338*57a10886SXuan Hu    FCVT_W_D  -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
339*57a10886SXuan Hu    FCVT_WU_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
340*57a10886SXuan Hu    FCVT_L_D  -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
341*57a10886SXuan Hu    FCVT_LU_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3424d24c305SYikeZhou
343*57a10886SXuan Hu    FEQ_S    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
344*57a10886SXuan Hu    FLT_S    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
345*57a10886SXuan Hu    FLE_S    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3464d24c305SYikeZhou
347*57a10886SXuan Hu    FEQ_D    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
348*57a10886SXuan Hu    FLT_D    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
349*57a10886SXuan Hu    FLE_D    -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T),
3504d24c305SYikeZhou
351*57a10886SXuan Hu    FMIN_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
352*57a10886SXuan Hu    FMAX_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
353*57a10886SXuan Hu    FMIN_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
354*57a10886SXuan Hu    FMAX_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
3554d24c305SYikeZhou
356*57a10886SXuan Hu    FADD_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
357*57a10886SXuan Hu    FSUB_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
358*57a10886SXuan Hu    FMUL_S   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
359*57a10886SXuan Hu    FADD_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
360*57a10886SXuan Hu    FSUB_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
361*57a10886SXuan Hu    FMUL_D   -> FDecode(SrcType.fp,  SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T),
3624d24c305SYikeZhou
363*57a10886SXuan Hu    FMADD_S  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
364*57a10886SXuan Hu    FMSUB_S  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
365*57a10886SXuan Hu    FNMADD_S -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
366*57a10886SXuan Hu    FNMSUB_S -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
367*57a10886SXuan Hu    FMADD_D  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
368*57a10886SXuan Hu    FMSUB_D  -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
369*57a10886SXuan Hu    FNMADD_D -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
370*57a10886SXuan Hu    FNMSUB_D -> FDecode(SrcType.fp,  SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T),
3714d24c305SYikeZhou  )
372be25371aSYikeZhou}
373be25371aSYikeZhou
374be25371aSYikeZhou/**
375ee8ff153Szfw  * Bit Manipulation Decode
376ee8ff153Szfw  */
377ee8ff153Szfwobject BDecode extends DecodeConstants{
378*57a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
379ee8ff153Szfw    // Basic bit manipulation
380*57a10886SXuan Hu    CLZ     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.clz,    SelImm.X, xWen = T),
381*57a10886SXuan Hu    CTZ     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.ctz,    SelImm.X, xWen = T),
382*57a10886SXuan Hu    CPOP    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop,   SelImm.X, xWen = T),
383*57a10886SXuan Hu    XPERM8  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb, SelImm.X, xWen = T),
384*57a10886SXuan Hu    XPERM4  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn, SelImm.X, xWen = T),
38507596dc6Szfw
386*57a10886SXuan Hu    CLZW    -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.clzw,    SelImm.X, xWen = T),
387*57a10886SXuan Hu    CTZW    -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.ctzw,    SelImm.X, xWen = T),
388*57a10886SXuan Hu    CPOPW   -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw,   SelImm.X, xWen = T),
389ee8ff153Szfw
390*57a10886SXuan Hu    CLMUL   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul,  SelImm.X, xWen = T),
391*57a10886SXuan Hu    CLMULH  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh, SelImm.X, xWen = T),
392*57a10886SXuan Hu    CLMULR  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr, SelImm.X, xWen = T),
3933feeca58Szfw
394*57a10886SXuan Hu    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es,    SelImm.X    , xWen = T),
395*57a10886SXuan Hu    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm,   SelImm.X    , xWen = T),
396*57a10886SXuan Hu    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds,    SelImm.X    , xWen = T),
397*57a10886SXuan Hu    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm,   SelImm.X    , xWen = T),
398*57a10886SXuan Hu    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im,    SelImm.X    , xWen = T),
399*57a10886SXuan Hu    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i,  SelImm.IMM_I, xWen = T),
400*57a10886SXuan Hu    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2,   SelImm.X    , xWen = T),
401*57a10886SXuan Hu    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T),
402*57a10886SXuan Hu    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T),
403*57a10886SXuan Hu    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T),
404*57a10886SXuan Hu    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T),
405*57a10886SXuan Hu    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T),
406*57a10886SXuan Hu    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T),
407*57a10886SXuan Hu    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T),
408*57a10886SXuan Hu    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T),
409*57a10886SXuan Hu    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0,      SelImm.X    , xWen = T),
410*57a10886SXuan Hu    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1,      SelImm.X    , xWen = T),
411*57a10886SXuan Hu    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0,     SelImm.X    , xWen = T),
412*57a10886SXuan Hu    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1,     SelImm.X    , xWen = T),
413*57a10886SXuan Hu    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2,     SelImm.X    , xWen = T),
414*57a10886SXuan Hu    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3,     SelImm.X    , xWen = T),
415*57a10886SXuan Hu    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0,     SelImm.X    , xWen = T),
416*57a10886SXuan Hu    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1,     SelImm.X    , xWen = T),
417*57a10886SXuan Hu    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2,     SelImm.X    , xWen = T),
418*57a10886SXuan Hu    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3,     SelImm.X    , xWen = T),
419ee8ff153Szfw  )
420ee8ff153Szfw}
421ee8ff153Szfw
422ee8ff153Szfw/**
423be25371aSYikeZhou * FP Divide SquareRoot Constants
424be25371aSYikeZhou */
425be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
426*57a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
427*57a10886SXuan Hu    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
428*57a10886SXuan Hu    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
429*57a10886SXuan Hu    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
430*57a10886SXuan Hu    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T),
4314d24c305SYikeZhou  )
432be25371aSYikeZhou}
433be25371aSYikeZhou
4344d24c305SYikeZhou/**
435af2f7849Shappy-lx * Svinval extension Constants
436af2f7849Shappy-lx */
437af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
438*57a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
439af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
440af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
441af2f7849Shappy-lx     */
442*57a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
443af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
444af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
445af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
446af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
447af2f7849Shappy-lx     */
448*57a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
449af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
450af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
451af2f7849Shappy-lx     * then dispatch and issue this instrucion
452af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
453af2f7849Shappy-lx     */
454*57a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
455af2f7849Shappy-lx    /* what is Svinval extension ?
456af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
457af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
458af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
459af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
460af2f7849Shappy-lx     *
461af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
462af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
463af2f7849Shappy-lx     */
464af2f7849Shappy-lx  )
465af2f7849Shappy-lx}
466*57a10886SXuan Hu
467af2f7849Shappy-lx/*
468ca18a0b4SWilliam Wang * CBO decode
469ca18a0b4SWilliam Wang */
470ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
471*57a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
472*57a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
473*57a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
474*57a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
475*57a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
476ca18a0b4SWilliam Wang  )
477ca18a0b4SWilliam Wang}
478ca18a0b4SWilliam Wang
479ca18a0b4SWilliam Wang/**
4804d24c305SYikeZhou * XiangShan Trap Decode constants
4814d24c305SYikeZhou */
4824d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
483361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
484*57a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
485*57a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
4864d24c305SYikeZhou  )
4874d24c305SYikeZhou}
488be25371aSYikeZhou
489b0ae3ac4SLinJiawei//object Imm32Gen {
490b0ae3ac4SLinJiawei//  def apply(sel: UInt, inst: UInt) = {
491b0ae3ac4SLinJiawei//    val sign = Mux(sel === SelImm.IMM_Z, 0.S, inst(31).asSInt)
492b0ae3ac4SLinJiawei//    val b30_20 = Mux(sel === SelImm.IMM_U, inst(30,20).asSInt, sign)
493b0ae3ac4SLinJiawei//    val b19_12 = Mux(sel =/= SelImm.IMM_U && sel =/= SelImm.IMM_UJ, sign, inst(19,12).asSInt)
494b0ae3ac4SLinJiawei//    val b11 = Mux(sel === SelImm.IMM_U || sel === SelImm.IMM_Z, 0.S,
495b0ae3ac4SLinJiawei//              Mux(sel === SelImm.IMM_UJ, inst(20).asSInt,
496b0ae3ac4SLinJiawei//              Mux(sel === SelImm.IMM_SB, inst(7).asSInt, sign)))
497b0ae3ac4SLinJiawei//    val b10_5 = Mux(sel === SelImm.IMM_U || sel === SelImm.IMM_Z, 0.U(1.W), inst(30,25))
498b0ae3ac4SLinJiawei//    val b4_1 = Mux(sel === SelImm.IMM_U, 0.U(1.W),
499b0ae3ac4SLinJiawei//               Mux(sel === SelImm.IMM_S || sel === SelImm.IMM_SB, inst(11,8),
500b0ae3ac4SLinJiawei//               Mux(sel === SelImm.IMM_Z, inst(19,16), inst(24,21))))
501b0ae3ac4SLinJiawei//    val b0 = Mux(sel === SelImm.IMM_S, inst(7),
502b0ae3ac4SLinJiawei//             Mux(sel === SelImm.IMM_I, inst(20),
503b0ae3ac4SLinJiawei//             Mux(sel === SelImm.IMM_Z, inst(15), 0.U(1.W))))
504b0ae3ac4SLinJiawei//
505b0ae3ac4SLinJiawei//    Cat(sign, b30_20, b19_12, b11, b10_5, b4_1, b0)
506b0ae3ac4SLinJiawei//  }
507b0ae3ac4SLinJiawei//}
508c2a8ae00SYikeZhou
509b0ae3ac4SLinJiaweiabstract class Imm(val len: Int) extends Bundle {
510b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
511b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
512b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
513b0ae3ac4SLinJiawei}
514b0ae3ac4SLinJiawei
515b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
516fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
517b0ae3ac4SLinJiawei
518b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
519b0ae3ac4SLinJiawei    Cat(instr(31, 20))
520b0ae3ac4SLinJiawei}
521b0ae3ac4SLinJiawei
522b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
523b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
524b0ae3ac4SLinJiawei
525b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
526b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
527b0ae3ac4SLinJiawei}
528b0ae3ac4SLinJiawei
529b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
530b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
531b0ae3ac4SLinJiawei
532b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
533b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
534b0ae3ac4SLinJiawei}
535b0ae3ac4SLinJiawei
536b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
537fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
538b0ae3ac4SLinJiawei
539b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
540b0ae3ac4SLinJiawei    instr(31, 12)
541c2a8ae00SYikeZhou  }
542c2a8ae00SYikeZhou}
543c2a8ae00SYikeZhou
544b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
545b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
546b0ae3ac4SLinJiawei
547b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
548b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
549b0ae3ac4SLinJiawei  }
550b0ae3ac4SLinJiawei}
551b0ae3ac4SLinJiawei
552b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){
553b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
554b0ae3ac4SLinJiawei
555b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
556b0ae3ac4SLinJiawei    Cat(instr(19, 15), instr(31, 20))
557b0ae3ac4SLinJiawei  }
558b0ae3ac4SLinJiawei}
559b0ae3ac4SLinJiawei
560ee8ff153Szfwcase class Imm_B6() extends Imm(6){
561ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
562ee8ff153Szfw
563ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
564ee8ff153Szfw    instr(25, 20)
565ee8ff153Szfw  }
566ee8ff153Szfw}
567ee8ff153Szfw
56858c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
56958c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
57058c35d23Shuxuan0307
57158c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
57258c35d23Shuxuan0307    instr(19, 15)
57358c35d23Shuxuan0307  }
57458c35d23Shuxuan0307}
57558c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
57658c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
57758c35d23Shuxuan0307
57858c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
57958c35d23Shuxuan0307    instr(19, 15)
58058c35d23Shuxuan0307  }
58158c35d23Shuxuan0307}
582b0ae3ac4SLinJiaweiobject ImmUnion {
583b0ae3ac4SLinJiawei  val I = Imm_I()
584b0ae3ac4SLinJiawei  val S = Imm_S()
585b0ae3ac4SLinJiawei  val B = Imm_B()
586b0ae3ac4SLinJiawei  val U = Imm_U()
587b0ae3ac4SLinJiawei  val J = Imm_J()
588b0ae3ac4SLinJiawei  val Z = Imm_Z()
589ee8ff153Szfw  val B6 = Imm_B6()
59058c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
59158c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
59258c35d23Shuxuan0307  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU)
593b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
594b0ae3ac4SLinJiawei  val immSelMap = Seq(
595b0ae3ac4SLinJiawei    SelImm.IMM_I,
596b0ae3ac4SLinJiawei    SelImm.IMM_S,
597b0ae3ac4SLinJiawei    SelImm.IMM_SB,
598b0ae3ac4SLinJiawei    SelImm.IMM_U,
599b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
600ee8ff153Szfw    SelImm.IMM_Z,
60158c35d23Shuxuan0307    SelImm.IMM_B6,
60258c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
60358c35d23Shuxuan0307    SelImm.IMM_OPIVIU
604b0ae3ac4SLinJiawei  ).zip(imms)
605b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
606b0ae3ac4SLinJiawei}
607b0ae3ac4SLinJiawei
608fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
609fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
610fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
611fd7603d9SYinan Xu    Cat(lui_imm(Imm_U().len - loadImm.getWidth - 1, 0), loadImm)
612fd7603d9SYinan Xu  }
613fd7603d9SYinan Xu  def getLuiImm(uop: MicroOp): UInt = {
614fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
615fd7603d9SYinan Xu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.ctrl.imm(ImmUnion.maxLen - 1, loadImmLen))
616fd7603d9SYinan Xu    Imm_U().do_toImm32(imm_u)
617fd7603d9SYinan Xu  }
618fd7603d9SYinan Xu}
619b0ae3ac4SLinJiawei
620be25371aSYikeZhou/**
621be25371aSYikeZhou * IO bundle for the Decode unit
622be25371aSYikeZhou */
6232225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
624be25371aSYikeZhou  val enq = new Bundle { val ctrl_flow = Input(new CtrlFlow) }
625be25371aSYikeZhou  val deq = new Bundle { val cf_ctrl = Output(new CfCtrl) }
626af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
627be25371aSYikeZhou}
628be25371aSYikeZhou
629be25371aSYikeZhou/**
630be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
631be25371aSYikeZhou */
6322225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
633be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
634be25371aSYikeZhou
6354d24c305SYikeZhou  val ctrl_flow = Wire(new CtrlFlow) // input with RVC Expanded
6364d24c305SYikeZhou  val cf_ctrl = Wire(new CfCtrl)
6374d24c305SYikeZhou
638be25371aSYikeZhou  ctrl_flow := io.enq.ctrl_flow
639be25371aSYikeZhou
640*57a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
641*57a10886SXuan Hu    FpDecode.table ++
642a19215ddSYinan Xu    FDivSqrtDecode.table ++
643a19215ddSYinan Xu    X64Decode.table ++
644a19215ddSYinan Xu    XSTrapDecode.table ++
645a19215ddSYinan Xu    BDecode.table ++
646a19215ddSYinan Xu    CBODecode.table ++
647a19215ddSYinan Xu    SvinvalDecode.table
648a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
649a19215ddSYinan Xu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.litValue && t.reverse.head.value == SelImm.IMM_U.litValue
650a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
651a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
652be25371aSYikeZhou
6534d24c305SYikeZhou  // output
6544d24c305SYikeZhou  cf_ctrl.cf := ctrl_flow
6556e7c9679Shuxuan0307  val cs: CtrlSignals = Wire(new CtrlSignals()).decode(ctrl_flow.instr, decode_table)
656d4aca96cSlqre  cs.singleStep := false.B
657c88c3a2aSYinan Xu  cs.replayInst := false.B
658be25371aSYikeZhou
6592ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
6607ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
6612ce29ed6SLinJiawei  cs.fpu := fpDecoder.io.fpCtrl
6621a1319cbSLinJiawei
663a7a8a6ccSHaojin Tang  // TODO: vec decode
664deb6421eSHaojin Tang  cs.vecWen := DontCare
665a7a8a6ccSHaojin Tang  cs.srcType(3) := DontCare
666a7a8a6ccSHaojin Tang  cs.lsrc(3) := DontCare
667deb6421eSHaojin Tang
66873c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
669c3abb8b6SYinan Xu  cs.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U
67073c4359eSYikeZhou
671178dd38cSYikeZhou  // read src1~3 location
672a19215ddSYinan Xu  cs.lsrc(0) := ctrl_flow.instr(RS1_MSB, RS1_LSB)
67320e31bd1SYinan Xu  cs.lsrc(1) := ctrl_flow.instr(RS2_MSB, RS2_LSB)
67420e31bd1SYinan Xu  cs.lsrc(2) := ctrl_flow.instr(RS3_MSB, RS3_LSB)
675178dd38cSYikeZhou  // read dest location
676c3abb8b6SYinan Xu  cs.ldest := ctrl_flow.instr(RD_MSB, RD_LSB)
6774d24c305SYikeZhou
678c2a8ae00SYikeZhou  // fill in exception vector
67926a692b9SYinan Xu  cf_ctrl.cf.exceptionVec := io.enq.ctrl_flow.exceptionVec
680389157b6SYikeZhou  cf_ctrl.cf.exceptionVec(illegalInstr) := cs.selImm === SelImm.INVALID_INSTR
6814d24c305SYikeZhou
682af2f7849Shappy-lx  when (!io.csrCtrl.svinval_enable) {
683af2f7849Shappy-lx    val base_ii = cs.selImm === SelImm.INVALID_INSTR
684af2f7849Shappy-lx    val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr
685af2f7849Shappy-lx    val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr
686af2f7849Shappy-lx    val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr
687af2f7849Shappy-lx    val svinval_ii = sinval || w_inval || inval_ir
688af2f7849Shappy-lx    cf_ctrl.cf.exceptionVec(illegalInstr) := base_ii || svinval_ii
689af2f7849Shappy-lx    cs.flushPipe := false.B
690af2f7849Shappy-lx  }
691af2f7849Shappy-lx
692c2a8ae00SYikeZhou  // fix frflags
693c2a8ae00SYikeZhou  //                           fflags    zero csrrs rd    csr
694c2a8ae00SYikeZhou  val isFrflags = BitPat("b000000000001_00000_010_?????_1110011") === ctrl_flow.instr
695c2a8ae00SYikeZhou  when (cs.fuType === FuType.csr && isFrflags) {
696c2a8ae00SYikeZhou    cs.blockBackward := false.B
697c2a8ae00SYikeZhou  }
698c2a8ae00SYikeZhou
699b0ae3ac4SLinJiawei  cs.imm := LookupTree(cs.selImm, ImmUnion.immSelMap.map(
700b0ae3ac4SLinJiawei    x => {
7017ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
702b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
703b0ae3ac4SLinJiawei      x._1 -> minBits
704b0ae3ac4SLinJiawei    }
705b0ae3ac4SLinJiawei  ))
706aac4464eSYinan Xu
7074d24c305SYikeZhou  cf_ctrl.ctrl := cs
708c2a8ae00SYikeZhou
7094d24c305SYikeZhou  io.deq.cf_ctrl := cf_ctrl
710be25371aSYikeZhou
711be25371aSYikeZhou  //-------------------------------------------------------------
712be25371aSYikeZhou  // Debug Info
71361a56a41SYinan Xu  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
7144d24c305SYikeZhou    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
71561a56a41SYinan Xu    io.enq.ctrl_flow.crossPageIPFFix)
71620e31bd1SYinan Xu  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",
71720e31bd1SYinan Xu    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
71820e31bd1SYinan Xu    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
7194d24c305SYikeZhou    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
7206e7c9679Shuxuan0307  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
7214d24c305SYikeZhou    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
7224d24c305SYikeZhou    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
7236e7c9679Shuxuan0307    io.deq.cf_ctrl.ctrl.imm)
72461a56a41SYinan Xu  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
725be25371aSYikeZhou}
726