xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 5a9dd560f6f96606bf8a6d80e1e8fb55c8c0745d)
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
198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
20be25371aSYikeZhouimport chisel3._
21be25371aSYikeZhouimport chisel3.util._
22cc1eb70dSXuan Huimport freechips.rocketchip.rocket.CSRs
233b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._
246ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat
253c02ee8fSwakafaimport utility._
263b739f49SXuan Huimport utils._
27*5a9dd560SXuan Huimport xiangshan.ExceptionNO.{EX_II, breakPoint, illegalInstr, virtualInstr}
286ab6918fSYinan Xuimport xiangshan._
29730cfbc0SXuan Huimport xiangshan.backend.fu.FuType
30730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst}
311be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions
32cc1eb70dSXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, OPCODE5Bit, XSInstBitFields}
335110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl}
3415ed99a7SXuan Huimport xiangshan.backend.fu.wrapper.CSRToDecode
35be25371aSYikeZhou
36be25371aSYikeZhou/**
37be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
38be25371aSYikeZhou */
39be25371aSYikeZhouabstract trait DecodeConstants {
40361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
4157a10886SXuan Hu  def X = BitPat("b0")
424d24c305SYikeZhou  def N = BitPat("b0")
434d24c305SYikeZhou  def Y = BitPat("b1")
4457a10886SXuan Hu  def T = true
4557a10886SXuan Hu  def F = false
464d24c305SYikeZhou
47c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
4820e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
494d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
5057a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
5157a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
5257a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5357a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5457a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
5589cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  canRobCompress
5689cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  uopSplitType
5789cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  |             selImm
5889cc69c1STang Haojin    List(SrcType.X, SrcType.X, SrcType.X, FuType.X, FuOpType.X, N, N, N, N, N, N, N, N, UopSplitType.X, SelImm.INVALID_INSTR) // Use SelImm to indicate invalid instr
594d24c305SYikeZhou
6057a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
6157a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
62be25371aSYikeZhou}
63be25371aSYikeZhou
64c2a8ae00SYikeZhoutrait DecodeUnitConstants
654d24c305SYikeZhou{
664d24c305SYikeZhou  // abstract out instruction decode magic numbers
674d24c305SYikeZhou  val RD_MSB  = 11
684d24c305SYikeZhou  val RD_LSB  = 7
694d24c305SYikeZhou  val RS1_MSB = 19
704d24c305SYikeZhou  val RS1_LSB = 15
714d24c305SYikeZhou  val RS2_MSB = 24
724d24c305SYikeZhou  val RS2_LSB = 20
734d24c305SYikeZhou  val RS3_MSB = 31
744d24c305SYikeZhou  val RS3_LSB = 27
754d24c305SYikeZhou}
764d24c305SYikeZhou
77be25371aSYikeZhou/**
78be25371aSYikeZhou * Decoded control signals
794d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
80be25371aSYikeZhou */
81c2a8ae00SYikeZhou
8257a10886SXuan Huabstract class XSDecodeBase {
8357a10886SXuan Hu  def X = BitPat("b?")
8457a10886SXuan Hu  def N = BitPat("b0")
8557a10886SXuan Hu  def Y = BitPat("b1")
8657a10886SXuan Hu  def T = true
8757a10886SXuan Hu  def F = false
8857a10886SXuan Hu  def generate() : List[BitPat]
8957a10886SXuan Hu}
9057a10886SXuan Hu
9157a10886SXuan Hucase class XSDecode(
9257a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
93239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat,
94e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9557a10886SXuan Hu  xWen: Boolean = false,
9657a10886SXuan Hu  fWen: Boolean = false,
9757a10886SXuan Hu  vWen: Boolean = false,
9857a10886SXuan Hu  mWen: Boolean = false,
9957a10886SXuan Hu  xsTrap: Boolean = false,
10057a10886SXuan Hu  noSpec: Boolean = false,
10157a10886SXuan Hu  blockBack: Boolean = false,
10257a10886SXuan Hu  flushPipe: Boolean = false,
10389cc69c1STang Haojin  canRobCompress: Boolean = false,
10457a10886SXuan Hu) extends XSDecodeBase {
10557a10886SXuan Hu  def generate() : List[BitPat] = {
10689cc69c1STang Haojin    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, canRobCompress.B, uopSplitType, selImm)
10757a10886SXuan Hu  }
10857a10886SXuan Hu}
10957a10886SXuan Hu
11057a10886SXuan Hucase class FDecode(
11157a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
112239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X,
11317ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
11457a10886SXuan Hu  xWen: Boolean = false,
11557a10886SXuan Hu  fWen: Boolean = false,
11657a10886SXuan Hu  vWen: Boolean = false,
11757a10886SXuan Hu  mWen: Boolean = false,
11857a10886SXuan Hu  xsTrap: Boolean = false,
11957a10886SXuan Hu  noSpec: Boolean = false,
12057a10886SXuan Hu  blockBack: Boolean = false,
12157a10886SXuan Hu  flushPipe: Boolean = false,
12289cc69c1STang Haojin  canRobCompress: Boolean = false,
12357a10886SXuan Hu) extends XSDecodeBase {
12457a10886SXuan Hu  def generate() : List[BitPat] = {
12589cc69c1STang Haojin    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate()
12657a10886SXuan Hu  }
12757a10886SXuan Hu}
12857a10886SXuan Hu
129be25371aSYikeZhou/**
130be25371aSYikeZhou * Overall Decode constants
131be25371aSYikeZhou */
132be25371aSYikeZhouobject XDecode extends DecodeConstants {
13357a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
134768f5f91SYangyu Chen    // RV32I
13557a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
13657a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
13757a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
13857a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
13957a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
14057a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
14157a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
14257a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
14389cc69c1STang Haojin    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T),
14489cc69c1STang Haojin    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T),
14589cc69c1STang Haojin    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T),
14689cc69c1STang Haojin    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T, canRobCompress = T),
14789cc69c1STang Haojin    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T),
14889cc69c1STang Haojin    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T),
14989cc69c1STang Haojin    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T),
15089cc69c1STang Haojin    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T, canRobCompress = T),
15189cc69c1STang Haojin    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T, canRobCompress = T),
15289cc69c1STang Haojin    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T, canRobCompress = T),
15389cc69c1STang Haojin    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T, canRobCompress = T),
15489cc69c1STang Haojin    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T, canRobCompress = T),
15589cc69c1STang Haojin    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T, canRobCompress = T),
15689cc69c1STang Haojin    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T, canRobCompress = T),
15789cc69c1STang Haojin    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T, canRobCompress = T),
15889cc69c1STang Haojin    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T, canRobCompress = T),
15989cc69c1STang Haojin    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T, canRobCompress = T),
1604d24c305SYikeZhou
161768f5f91SYangyu Chen    // RV64I (extend from RV32I)
162768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
163768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
164768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
165768f5f91SYangyu Chen
166768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
167768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
168768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
169768f5f91SYangyu Chen
170768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
171768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
172768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
173768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
174768f5f91SYangyu Chen
175768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
176768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
177768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
178768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
179768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
180768f5f91SYangyu Chen
181768f5f91SYangyu Chen    // RV64M
18289cc69c1STang Haojin    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T, canRobCompress = T),
18389cc69c1STang Haojin    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T, canRobCompress = T),
18489cc69c1STang Haojin    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T),
18589cc69c1STang Haojin    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T),
18689cc69c1STang Haojin    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T, canRobCompress = T),
1874d24c305SYikeZhou
18889cc69c1STang Haojin    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T, canRobCompress = T),
18989cc69c1STang Haojin    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T, canRobCompress = T),
19089cc69c1STang Haojin    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T, canRobCompress = T),
19189cc69c1STang Haojin    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T, canRobCompress = T),
19289cc69c1STang Haojin    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T, canRobCompress = T),
19389cc69c1STang Haojin    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T),
19489cc69c1STang Haojin    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T, canRobCompress = T),
19589cc69c1STang Haojin    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T),
1964d24c305SYikeZhou
197f7af4c74Schengguanghui    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
19857a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
1995110577fSZiyue Zhang    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T),
2003b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
2013b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
2023b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2033b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2043b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2053b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2064d24c305SYikeZhou
207768f5f91SYangyu Chen    // System, the immediate12 holds the CSR register.
20840ac5bb1SXuan Hu
209fa16cf81Slewislzh    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
210fa16cf81Slewislzh    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
211fa16cf81Slewislzh    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2124d24c305SYikeZhou
21357a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21457a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21557a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2164d24c305SYikeZhou
21757a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21857a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21957a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22057a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22157a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22257a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2234d24c305SYikeZhou
22457a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22557a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22657a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2274d24c305SYikeZhou
228768f5f91SYangyu Chen    // RV64A
22957a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23057a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23157a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23257a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23357a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23457a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23557a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23657a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23757a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2384d24c305SYikeZhou
23957a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24057a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24157a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24257a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24357a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24457a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24557a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24757a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2484d24c305SYikeZhou
24957a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25057a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25157a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25257a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
253768f5f91SYangyu Chen  )
254768f5f91SYangyu Chen}
255ee8ff153Szfw
256768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
257768f5f91SYangyu Chen  /*
258768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
259768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
260768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
261768f5f91SYangyu Chen   */
262768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
263768f5f91SYangyu Chen    // Zba
264768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
265768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
266768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
267768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
268768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
269768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
270768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
271768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
272768f5f91SYangyu Chen
273768f5f91SYangyu Chen    // Zbb
27489cc69c1STang Haojin    ANDN      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn    , SelImm.X    , xWen = T, canRobCompress = T),
27589cc69c1STang Haojin    ORN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn     , SelImm.X    , xWen = T, canRobCompress = T),
27689cc69c1STang Haojin    XNOR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor    , SelImm.X    , xWen = T, canRobCompress = T),
277ee8ff153Szfw
278768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
279768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
280768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
281768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
282768f5f91SYangyu Chen
283768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
284768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
285768f5f91SYangyu Chen
28689cc69c1STang Haojin    MAX       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max     , SelImm.X    , xWen = T, canRobCompress = T),
28789cc69c1STang Haojin    MAXU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu    , SelImm.X    , xWen = T, canRobCompress = T),
288768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
289768f5f91SYangyu Chen    MINU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu    , SelImm.X    , xWen = T, canRobCompress = T),
290ee8ff153Szfw
29189cc69c1STang Haojin    SEXT_B    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb   , SelImm.X    , xWen = T, canRobCompress = T),
29289cc69c1STang Haojin    SEXT_H    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth   , SelImm.X    , xWen = T, canRobCompress = T),
293768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
294768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
295ee8ff153Szfw
296768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
297768f5f91SYangyu Chen    ROLW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw    , SelImm.X    , xWen = T, canRobCompress = T),
29889cc69c1STang Haojin    ROR       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.X    , xWen = T, canRobCompress = T),
29989cc69c1STang Haojin    RORI      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.IMM_I, xWen = T, canRobCompress = T),
300768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
301768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
302ee8ff153Szfw
303768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
304768f5f91SYangyu Chen
305768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
306768f5f91SYangyu Chen
307768f5f91SYangyu Chen    // Zbc
308768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
309768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
310768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
311768f5f91SYangyu Chen
312768f5f91SYangyu Chen    // Zbs
313768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
314768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
315768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
316768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
317768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
318768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
319768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
320768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
321768f5f91SYangyu Chen
322768f5f91SYangyu Chen    // Zbkb
323768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
324768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
325768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
326768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
327768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
328768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
329768f5f91SYangyu Chen
330768f5f91SYangyu Chen    // Zbkc
331768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
332768f5f91SYangyu Chen
333768f5f91SYangyu Chen    // Zbkx
334768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
335768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
336768f5f91SYangyu Chen  )
337768f5f91SYangyu Chen}
338768f5f91SYangyu Chen
339768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
340768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
341768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
342768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
343768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
344768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
345768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
346768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
347768f5f91SYangyu Chen
348768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
349768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
350768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
351768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
352768f5f91SYangyu Chen
353768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
354768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
355768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
356768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
357768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
358768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
359768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
360768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
361768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
362768f5f91SYangyu Chen
363768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
364768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
365768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
366768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
367768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
368768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
369768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
370768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
371768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
372768f5f91SYangyu Chen
373768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
374768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
375768f5f91SYangyu Chen    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1     , SelImm.X    , xWen = T, canRobCompress = T),
3764d24c305SYikeZhou  )
377be25371aSYikeZhou}
378be25371aSYikeZhou
379be25371aSYikeZhou/**
380be25371aSYikeZhou * FP Decode constants
381be25371aSYikeZhou */
38257a10886SXuan Huobject FpDecode extends DecodeConstants{
38357a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
384b189aafaSzmx    FLH     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T),
38557a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
38657a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
387b189aafaSzmx    FSH     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S          ),
38857a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
38957a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3904d24c305SYikeZhou
391964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
392964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
393b189aafaSzmx    FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T),
394c2a8ae00SYikeZhou
3954d24c305SYikeZhou    // Int to FP
39689cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39789cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39889cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39989cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4004d24c305SYikeZhou
40189cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40289cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40389cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40489cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4054d24c305SYikeZhou
4064d24c305SYikeZhou  )
407be25371aSYikeZhou}
408be25371aSYikeZhou
409be25371aSYikeZhou/**
410be25371aSYikeZhou * FP Divide SquareRoot Constants
411be25371aSYikeZhou */
412be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
41357a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
41489cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41589cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41689cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41789cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4184d24c305SYikeZhou  )
419be25371aSYikeZhou}
420be25371aSYikeZhou
4214d24c305SYikeZhou/**
422af2f7849Shappy-lx * Svinval extension Constants
423af2f7849Shappy-lx */
424af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
42557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
426af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
427af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
428af2f7849Shappy-lx     */
42957a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
430af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
431af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
432af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
433af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
434af2f7849Shappy-lx     */
43557a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
436af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
437af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
438af2f7849Shappy-lx     * then dispatch and issue this instrucion
439af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
440af2f7849Shappy-lx     */
44157a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
442af2f7849Shappy-lx    /* what is Svinval extension ?
443af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
444af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
445af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
446af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
447af2f7849Shappy-lx     *
448af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
449af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
450af2f7849Shappy-lx     */
451af2f7849Shappy-lx  )
452af2f7849Shappy-lx}
45357a10886SXuan Hu
454af2f7849Shappy-lx/*
455ca18a0b4SWilliam Wang * CBO decode
456ca18a0b4SWilliam Wang */
457ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
45857a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
45957a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
46057a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
46157a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
46257a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
463ca18a0b4SWilliam Wang  )
464ca18a0b4SWilliam Wang}
465ca18a0b4SWilliam Wang
466d0de7e4aSpeixiaokun/*
467d0de7e4aSpeixiaokun * Hypervisor decode
468d0de7e4aSpeixiaokun */
469d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
470e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
471e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
472e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
473e25e4d90SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X),
474e25e4d90SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X),
475e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
476e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
477e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
478e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
479e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
480e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
481e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
482e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
483e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
484e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
485e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
486e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
487e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
488d0de7e4aSpeixiaokun  )
489d0de7e4aSpeixiaokun}
490d0de7e4aSpeixiaokun
491545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
492545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
493545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
494545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
495545d7be0SYangyu Chen  )
496545d7be0SYangyu Chen}
497545d7be0SYangyu Chen
498ca18a0b4SWilliam Wang/**
4994d24c305SYikeZhou * XiangShan Trap Decode constants
5004d24c305SYikeZhou */
5014d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
502361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
50357a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
50457a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
5054d24c305SYikeZhou  )
5064d24c305SYikeZhou}
507be25371aSYikeZhou
50849f433deSXuan Huabstract class Imm(val len: Int) {
509b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
510b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
511b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
512b0ae3ac4SLinJiawei}
513b0ae3ac4SLinJiawei
514b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
515fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
516b0ae3ac4SLinJiawei
517b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
518b0ae3ac4SLinJiawei    Cat(instr(31, 20))
519b0ae3ac4SLinJiawei}
520b0ae3ac4SLinJiawei
521b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
522b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
523b0ae3ac4SLinJiawei
524b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
525b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
526b0ae3ac4SLinJiawei}
527b0ae3ac4SLinJiawei
528b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
529b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
530b0ae3ac4SLinJiawei
531b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
532b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
533b0ae3ac4SLinJiawei}
534b0ae3ac4SLinJiawei
535b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
536fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
537b0ae3ac4SLinJiawei
538b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
539b0ae3ac4SLinJiawei    instr(31, 12)
540c2a8ae00SYikeZhou  }
541c2a8ae00SYikeZhou}
542c2a8ae00SYikeZhou
543b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
544b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
545b0ae3ac4SLinJiawei
546b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
547b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
548b0ae3ac4SLinJiawei  }
549b0ae3ac4SLinJiawei}
550b0ae3ac4SLinJiawei
551fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){
552b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
553b0ae3ac4SLinJiawei
554b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
555fa16cf81Slewislzh    Cat(instr(11, 7), instr(19, 15), instr(31, 20))
556b0ae3ac4SLinJiawei  }
55792c61038SXuan Hu
55892c61038SXuan Hu  def getCSRAddr(imm: UInt): UInt = {
55992c61038SXuan Hu    require(imm.getWidth == this.len)
56092c61038SXuan Hu    imm(11, 0)
56192c61038SXuan Hu  }
56292c61038SXuan Hu
56392c61038SXuan Hu  def getRS1(imm: UInt): UInt = {
56492c61038SXuan Hu    require(imm.getWidth == this.len)
56592c61038SXuan Hu    imm(16, 12)
56692c61038SXuan Hu  }
56792c61038SXuan Hu
56892c61038SXuan Hu  def getRD(imm: UInt): UInt = {
56992c61038SXuan Hu    require(imm.getWidth == this.len)
57092c61038SXuan Hu    imm(21, 17)
57192c61038SXuan Hu  }
57292c61038SXuan Hu
57392c61038SXuan Hu  def getImm5(imm: UInt): UInt = {
57492c61038SXuan Hu    require(imm.getWidth == this.len)
57592c61038SXuan Hu    imm(16, 12)
57692c61038SXuan Hu  }
577b0ae3ac4SLinJiawei}
578b0ae3ac4SLinJiawei
579ee8ff153Szfwcase class Imm_B6() extends Imm(6){
580ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
581ee8ff153Szfw
582ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
583ee8ff153Szfw    instr(25, 20)
584ee8ff153Szfw  }
585ee8ff153Szfw}
586ee8ff153Szfw
58758c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
58858c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
58958c35d23Shuxuan0307
59058c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
59158c35d23Shuxuan0307    instr(19, 15)
59258c35d23Shuxuan0307  }
59358c35d23Shuxuan0307}
594b52d4755SXuan Hu
59558c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
59658c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
59758c35d23Shuxuan0307
59858c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
59958c35d23Shuxuan0307    instr(19, 15)
60058c35d23Shuxuan0307  }
60158c35d23Shuxuan0307}
602b52d4755SXuan Hu
6034aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
6044aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6054aa9ed34Sfdy
6064aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6074aa9ed34Sfdy    instr(30, 20)
6084aa9ed34Sfdy  }
609e6ac7fe1SZiyue Zhang  /**
610e6ac7fe1SZiyue Zhang    * get VType from extended imm
611e6ac7fe1SZiyue Zhang    * @param extedImm
612e6ac7fe1SZiyue Zhang    * @return VType
613e6ac7fe1SZiyue Zhang    */
614e6ac7fe1SZiyue Zhang  def getVType(extedImm: UInt): InstVType = {
615e6ac7fe1SZiyue Zhang    val vtype = Wire(new InstVType)
616e6ac7fe1SZiyue Zhang    vtype := extedImm(10, 0).asTypeOf(new InstVType)
617e6ac7fe1SZiyue Zhang    vtype
618e6ac7fe1SZiyue Zhang  }
6194aa9ed34Sfdy}
620b52d4755SXuan Hu
621e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){
6224aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6234aa9ed34Sfdy
6244aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6255c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
626b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
627e6ac7fe1SZiyue Zhang    val vtype8 = rvInst.ZIMM_VSETIVLI
628b52d4755SXuan Hu    Cat(uimm5, vtype8)
629b52d4755SXuan Hu  }
630b52d4755SXuan Hu  /**
631b52d4755SXuan Hu    * get VType from extended imm
632b52d4755SXuan Hu    * @param extedImm
633b52d4755SXuan Hu    * @return VType
634b52d4755SXuan Hu    */
635b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
636b52d4755SXuan Hu    val vtype = Wire(new InstVType)
637e6ac7fe1SZiyue Zhang    vtype := extedImm(9, 0).asTypeOf(new InstVType)
638b52d4755SXuan Hu    vtype
639b52d4755SXuan Hu  }
640b52d4755SXuan Hu
641b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
642e6ac7fe1SZiyue Zhang    extedImm(14, 10)
6434aa9ed34Sfdy  }
6444aa9ed34Sfdy}
645fe528fd6Ssinsanction
646fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
647fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
648fe528fd6Ssinsanction
649fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
650fe528fd6Ssinsanction    instr(31, 0)
651fe528fd6Ssinsanction  }
652fe528fd6Ssinsanction}
653fe528fd6Ssinsanction
6547e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
6557e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
6567e30d16cSZhaoyang You
6577e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
6587e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
6597e30d16cSZhaoyang You  }
6607e30d16cSZhaoyang You}
6617e30d16cSZhaoyang You
662b0ae3ac4SLinJiaweiobject ImmUnion {
663b0ae3ac4SLinJiawei  val I = Imm_I()
664b0ae3ac4SLinJiawei  val S = Imm_S()
665b0ae3ac4SLinJiawei  val B = Imm_B()
666b0ae3ac4SLinJiawei  val U = Imm_U()
667b0ae3ac4SLinJiawei  val J = Imm_J()
668b0ae3ac4SLinJiawei  val Z = Imm_Z()
669ee8ff153Szfw  val B6 = Imm_B6()
67058c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
67158c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
6724aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
6734aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
674fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
6757e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
6764aa9ed34Sfdy
677520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
6787e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
679b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
680b0ae3ac4SLinJiawei  val immSelMap = Seq(
681b0ae3ac4SLinJiawei    SelImm.IMM_I,
682b0ae3ac4SLinJiawei    SelImm.IMM_S,
683b0ae3ac4SLinJiawei    SelImm.IMM_SB,
684b0ae3ac4SLinJiawei    SelImm.IMM_U,
685b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
686ee8ff153Szfw    SelImm.IMM_Z,
68758c35d23Shuxuan0307    SelImm.IMM_B6,
68858c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
6894aa9ed34Sfdy    SelImm.IMM_OPIVIU,
6904aa9ed34Sfdy    SelImm.IMM_VSETVLI,
691fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
6927e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
693b0ae3ac4SLinJiawei  ).zip(imms)
694b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
695b0ae3ac4SLinJiawei}
696b0ae3ac4SLinJiawei
697fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
698fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
699fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
700765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
701fd7603d9SYinan Xu  }
7023b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
703fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
7043b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
705f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
706fd7603d9SYinan Xu  }
707fd7603d9SYinan Xu}
708b0ae3ac4SLinJiawei
709be25371aSYikeZhou/**
710be25371aSYikeZhou * IO bundle for the Decode unit
711be25371aSYikeZhou */
712aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
713aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
714aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
715aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
716aaa08c5aSxiaofeibao-xjtu}
7172225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
7183b739f49SXuan Hu  val enq = new Bundle {
7193b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
720d91483a6Sfdy    val vtype = Input(new VType)
7215110577fSZiyue Zhang    val vstart = Input(Vl())
7224aa9ed34Sfdy  }
7233b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
724aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
725af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
72615ed99a7SXuan Hu  val fromCSR = Input(new CSRToDecode)
727be25371aSYikeZhou}
728be25371aSYikeZhou
729be25371aSYikeZhou/**
730be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
731be25371aSYikeZhou */
7322225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
733be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
734be25371aSYikeZhou
7353b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
736be25371aSYikeZhou
73775e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
73875e2c883SXuan Hu
73957a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
74057a10886SXuan Hu    FpDecode.table ++
741bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
742768f5f91SYangyu Chen    BitmanipDecode.table ++
743768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
744a19215ddSYinan Xu    XSTrapDecode.table ++
745a19215ddSYinan Xu    CBODecode.table ++
746b65b9ebaSXuan Hu    SvinvalDecode.table ++
747e25e4d90SXuan Hu    HypervisorDecode.table ++
748545d7be0SYangyu Chen    VecDecoder.table ++
749545d7be0SYangyu Chen    ZicondDecode.table
750b65b9ebaSXuan Hu
75189cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
752a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
753239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
754a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
755a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
756be25371aSYikeZhou
7574d24c305SYikeZhou  // output
7583b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
759be25371aSYikeZhou
7602ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
7617ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
7623b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
763ec427417Slinzhida  decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags
7641a1319cbSLinJiawei
7653b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
7663b739f49SXuan Hu
767a8db15d8Sfdy  decodedInst.uopIdx := 0.U
768d91483a6Sfdy  decodedInst.firstUop := true.B
769d91483a6Sfdy  decodedInst.lastUop := true.B
770f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
7713235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
772deb6421eSHaojin Tang
77373c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
774f7af4c74Schengguanghui  decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
77573c4359eSYikeZhou
77649a2cda2SXuan Hu  // fmadd - b1000011
77749a2cda2SXuan Hu  // fmsub - b1000111
77849a2cda2SXuan Hu  // fnmsub- b1001011
77949a2cda2SXuan Hu  // fnmadd- b1001111
78049a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
781e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
782e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
78349a2cda2SXuan Hu
784178dd38cSYikeZhou  // read src1~3 location
78598cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
78698cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
78749a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
78849a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
7899c5a1080Sxiaofeibao  decodedInst.lsrc(3) := V0_IDX.U
7909c5a1080Sxiaofeibao  decodedInst.lsrc(4) := Vl_IDX.U
791b6b11f60SXuan Hu
792178dd38cSYikeZhou  // read dest location
79398cfe81bSxgkiri  decodedInst.ldest := inst.RD
7944d24c305SYikeZhou
795e4e68f86Sxiaofeibao  // init v0Wen vlWen
796e4e68f86Sxiaofeibao  decodedInst.v0Wen := false.B
797e4e68f86Sxiaofeibao  decodedInst.vlWen := false.B
798e4e68f86Sxiaofeibao
799c2a8ae00SYikeZhou  // fill in exception vector
800567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
801567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
802567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
803bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
8045110577fSZiyue Zhang  vecException.io.vstart := decodedInst.vpu.vstart
8054d24c305SYikeZhou
80615ed99a7SXuan Hu  private val exceptionII =
80715ed99a7SXuan Hu    decodedInst.selImm === SelImm.INVALID_INSTR ||
80815ed99a7SXuan Hu    vecException.io.illegalInst ||
80915ed99a7SXuan Hu    io.fromCSR.illegalInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence  ||
81015ed99a7SXuan Hu    io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
81115ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g ||
81215ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v ||
81315ed99a7SXuan Hu    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
8148b7dc6f5SsinceforYy    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
8158b7dc6f5SsinceforYy    io.fromCSR.illegalInst.fsIsOff    && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) ||
8168b7dc6f5SsinceforYy                                          (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) ||
817d60bfe5aSsinceforYy                                           FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) ||
818d60bfe5aSsinceforYy                                           isVecOPF) ||
819b50a88ecSXuan Hu    io.fromCSR.illegalInst.vsIsOff    && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) ||
820689f6b88SsinceforYy    io.fromCSR.illegalInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType) ||
821689f6b88SsinceforYy    (decodedInst.needFrm.scalaNeedFrm || FuType.isScalaNeedFrm(decodedInst.fuType)) && (((decodedInst.fpu.rm === 5.U) || (decodedInst.fpu.rm === 6.U)) || ((decodedInst.fpu.rm === 7.U) && io.fromCSR.illegalInst.frm)) ||
822689f6b88SsinceforYy    (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm
82315ed99a7SXuan Hu
82415ed99a7SXuan Hu  private val exceptionVI =
82515ed99a7SXuan Hu    io.fromCSR.virtualInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence ||
82615ed99a7SXuan Hu    io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
82715ed99a7SXuan Hu    io.fromCSR.virtualInst.hfence     && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) ||
82815ed99a7SXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
829b50a88ecSXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
830b50a88ecSXuan Hu    io.fromCSR.virtualInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType)
83115ed99a7SXuan Hu
832*5a9dd560SXuan Hu  decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II)
83315ed99a7SXuan Hu  decodedInst.exceptionVec(virtualInstr) := exceptionVI
834d0de7e4aSpeixiaokun
8357e0f64b0SGuanghui Cheng  //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry.
8367e0f64b0SGuanghui Cheng  decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger)
8377e0f64b0SGuanghui Cheng
8383b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
839b0ae3ac4SLinJiawei    x => {
8407ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
841b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
842b0ae3ac4SLinJiawei      x._1 -> minBits
843b0ae3ac4SLinJiawei    }
844b0ae3ac4SLinJiawei  ))
845aac4464eSYinan Xu
8467531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
8477531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
8487531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
8497531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
8507531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
8517531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
8527531c765SXuan Hu
8537531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
85475e2c883SXuan Hu
85575e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
856be25371aSYikeZhou
8570bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
85839c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
85939c388b5SXuan Hu  private val narrowInsts = Seq(
86039c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
86139c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
86239c388b5SXuan Hu  )
86339c388b5SXuan Hu  private val maskDstInsts = Seq(
86439c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
86539c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
86639c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
8679eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
8689eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
8699eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
8709eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
871f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
87239c388b5SXuan Hu  )
87330fcc710SZiyue Zhang  private val maskOpInsts = Seq(
87430fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
87530fcc710SZiyue Zhang  )
87694e6af68SZiyue-Zhang  private val vmaInsts = Seq(
87794e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
87894e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
87994e6af68SZiyue-Zhang  )
880bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
881bdda74fdSxiaofeibao-xjtu    // opfff
882bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
883bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
884bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
885bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
886bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
887bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
888bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
889bdda74fdSxiaofeibao-xjtu    // opfvv
890bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
891bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
892bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
893bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
894bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
895bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
896bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
897bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
898bdda74fdSxiaofeibao-xjtu    // opfvf
899bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
900bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
901bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
902bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
903bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
904bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
905bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
906aab8ef9cSxiaofeibao-xjtu    // vfred
907aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
908bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
909bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
910bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
911bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
912bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
913b189aafaSzmx    FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H,
914ba899681Schengguanghui    VFCVT_XU_F_V, VFCVT_X_F_V, VFCVT_RTZ_XU_F_V, VFCVT_RTZ_X_F_V, VFCVT_F_XU_V, VFCVT_F_X_V,
915ba899681Schengguanghui    VFWCVT_XU_F_V, VFWCVT_X_F_V, VFWCVT_RTZ_XU_F_V, VFWCVT_RTZ_X_F_V, VFWCVT_F_XU_V, VFWCVT_F_X_V, VFWCVT_F_F_V,
916ba899681Schengguanghui    VFNCVT_XU_F_W, VFNCVT_X_F_W, VFNCVT_RTZ_XU_F_W, VFNCVT_RTZ_X_F_W, VFNCVT_F_XU_W, VFNCVT_F_X_W, VFNCVT_F_F_W,
917ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
918bdda74fdSxiaofeibao-xjtu  )
919689f6b88SsinceforYy
920689f6b88SsinceforYy  private val scalaNeedFrmInsts = Seq(
921689f6b88SsinceforYy    FADD_S, FSUB_S, FADD_D, FSUB_D,
922689f6b88SsinceforYy    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
923689f6b88SsinceforYy    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
924689f6b88SsinceforYy  )
925689f6b88SsinceforYy
926689f6b88SsinceforYy  private val vectorNeedFrmInsts = Seq (
927689f6b88SsinceforYy    VFSLIDE1UP_VF, VFSLIDE1DOWN_VF,
928689f6b88SsinceforYy  )
929689f6b88SsinceforYy
930bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
931689f6b88SsinceforYy  decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
932689f6b88SsinceforYy  decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
933bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
934bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
935bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
9363b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
937bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
938bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
939bdda74fdSxiaofeibao-xjtu  }.otherwise{
94075e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
94175e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
94275e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
94375e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
94475e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
94575e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
94675e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
947d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
94894e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
94939c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
950b6279fc6SZiyue Zhang    val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
951b6279fc6SZiyue Zhang    val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
952b6279fc6SZiyue Zhang    val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
953b6279fc6SZiyue Zhang    val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe
954dab1ad8cSsinsanction    val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse
955dab1ad8cSsinsanction    val isVlm = decodedInst.fuOpType === VlduType.vlm
956d8ceb649SZiyue Zhang    val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV
95794e6af68SZiyue-Zhang    val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
958dab1ad8cSsinsanction    val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew
959b6279fc6SZiyue Zhang    decodedInst.vpu.isNarrow := isNarrow
960b6279fc6SZiyue Zhang    decodedInst.vpu.isDstMask := isDstMask
961b6279fc6SZiyue Zhang    decodedInst.vpu.isOpMask := isOpMask
96294e6af68SZiyue-Zhang    decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma
963dab1ad8cSsinsanction    decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac
9645110577fSZiyue Zhang    decodedInst.vpu.vstart := io.enq.vstart
965bdda74fdSxiaofeibao-xjtu  }
96606f0a37aSZiyue Zhang  decodedInst.vpu.specVill := io.enq.vtype.illegal
96706f0a37aSZiyue Zhang  decodedInst.vpu.specVma := io.enq.vtype.vma
96806f0a37aSZiyue Zhang  decodedInst.vpu.specVta := io.enq.vtype.vta
96906f0a37aSZiyue Zhang  decodedInst.vpu.specVsew := io.enq.vtype.vsew
97006f0a37aSZiyue Zhang  decodedInst.vpu.specVlmul := io.enq.vtype.vlmul
97175e2c883SXuan Hu
97231c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
97331c51290Szhanglinjuan
9746d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
9756d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
9766d56ac16Ssinsanction
9777f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
97887dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
97987dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
98006cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
98187dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
9820a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
983c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
98406cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
985c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
9867f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
987ddc88dadSxiaofeibao  // numOfUop should be 1 when vector instruction is illegalInst
988ddc88dadSxiaofeibao  io.deq.uopInfo.numOfUop := Mux(vecException.io.illegalInst, 1.U, uopInfoGen.io.out.uopInfo.numOfUop)
9893235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
9907f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
9917f9f0a79SzhanglyGit
992cc1eb70dSXuan Hu  val isCSR = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U
993cc1eb70dSXuan Hu  val isCSRR = isCSR && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U
994cc1eb70dSXuan Hu  val isCSRW = isCSR && inst.FUNCT3 === BitPat("b?10") && inst.RD  === 0.U
995cc1eb70dSXuan Hu  dontTouch(isCSRR)
996cc1eb70dSXuan Hu  dontTouch(isCSRW)
997cc1eb70dSXuan Hu
99887c5d21dSZiyue Zhang  // for csrr vl instruction, convert to vsetvl
999cc1eb70dSXuan Hu  val isCsrrVlenb = isCSRR && inst.CSRIDX === CSRs.vlenb.U
1000cc1eb70dSXuan Hu  val isCsrrVl    = isCSRR && inst.CSRIDX === CSRs.vl.U
1001cc1eb70dSXuan Hu
1002ac17908cSHuijin Li  // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i)
1003ac17908cSHuijin Li  val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U
1004ac17908cSHuijin Li  val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W)
1005ac17908cSHuijin Li  val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W)
1006ac17908cSHuijin Li  val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W)
1007ac17908cSHuijin Li
100887c5d21dSZiyue Zhang  when (isCsrrVl) {
100963cb3754SZiyue Zhang    // convert to vsetvl instruction
101087c5d21dSZiyue Zhang    decodedInst.srcType(0) := SrcType.no
101187c5d21dSZiyue Zhang    decodedInst.srcType(1) := SrcType.no
101287c5d21dSZiyue Zhang    decodedInst.srcType(2) := SrcType.no
101387c5d21dSZiyue Zhang    decodedInst.srcType(3) := SrcType.no
101487c5d21dSZiyue Zhang    decodedInst.srcType(4) := SrcType.vp
101587c5d21dSZiyue Zhang    decodedInst.lsrc(4)    := Vl_IDX.U
101663cb3754SZiyue Zhang    decodedInst.waitForward   := false.B
101787c5d21dSZiyue Zhang    decodedInst.blockBackward := false.B
10188c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
101963cb3754SZiyue Zhang  }.elsewhen(isCsrrVlenb){
102063cb3754SZiyue Zhang    // convert to addi instruction
1021828a8a48SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1022828a8a48SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
102363cb3754SZiyue Zhang    decodedInst.srcType(2) := SrcType.no
102463cb3754SZiyue Zhang    decodedInst.srcType(3) := SrcType.no
102563cb3754SZiyue Zhang    decodedInst.srcType(4) := SrcType.no
102663cb3754SZiyue Zhang    decodedInst.selImm := SelImm.IMM_I
102763cb3754SZiyue Zhang    decodedInst.waitForward := false.B
102863cb3754SZiyue Zhang    decodedInst.blockBackward := false.B
102963cb3754SZiyue Zhang    decodedInst.canRobCompress := true.B
10308c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
1031ac17908cSHuijin Li  }.elsewhen(isPreW || isPreR || isPreI){
1032ac17908cSHuijin Li    decodedInst.selImm := SelImm.IMM_S
1033ac17908cSHuijin Li    decodedInst.fuType := FuType.ldu.U
1034ac17908cSHuijin Li    decodedInst.canRobCompress := false.B
1035ac17908cSHuijin Li    decodedInst.fuOpType := Mux1H(Seq(
1036ac17908cSHuijin Li      isPreW -> LSUOpType.prefetch_w,
1037ac17908cSHuijin Li      isPreR -> LSUOpType.prefetch_r,
1038ac17908cSHuijin Li      isPreI -> LSUOpType.prefetch_i,
1039ac17908cSHuijin Li    ))
1040ac17908cSHuijin Li
104187c5d21dSZiyue Zhang  }
104287c5d21dSZiyue Zhang
104375e2c883SXuan Hu  io.deq.decodedInst := decodedInst
10449faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
1045985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
1046cc1eb70dSXuan Hu    // keep condition
1047cc1eb70dSXuan Hu    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType,
104887c5d21dSZiyue Zhang    (isCsrrVl) -> FuType.vsetfwf.U,
104963cb3754SZiyue Zhang    (isCsrrVlenb) -> FuType.alu.U,
1050cc1eb70dSXuan Hu
1051cc1eb70dSXuan Hu    // change vlsu to vseglsu when NF =/= 0.U
1052f94f6503SXuan Hu    ( FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && inst.NF === 0.U || (inst.NF =/= 0.U && (inst.MOP === "b00".U && inst.SUMOP === "b01000".U))) -> decodedInst.fuType,
1053f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
1054f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
1055f94f6503SXuan Hu    ( FuType.FuTypeOrR(decodedInst.fuType, FuType.vstu)              && inst.NF =/= 0.U && ((inst.MOP === "b00".U && inst.SUMOP =/= "b01000".U) || inst.MOP =/= "b00".U)) -> FuType.vsegstu.U,
1056f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
1057f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
1058f94f6503SXuan Hu    ( FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu)              && inst.NF =/= 0.U && ((inst.MOP === "b00".U && inst.LUMOP =/= "b01000".U) || inst.MOP =/= "b00".U)) -> FuType.vsegldu.U,
1059985804e6SXuan Hu  ))
106063cb3754SZiyue Zhang  io.deq.decodedInst.imm := Mux(isCsrrVlenb, (VLEN / 8).U, decodedInst.imm)
1061cc1eb70dSXuan Hu
10624fe0a83eSXuan Hu  io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq(
1063cc1eb70dSXuan Hu    isCsrrVl    -> VSETOpType.csrrvl,
1064cc1eb70dSXuan Hu    isCsrrVlenb -> ALUOpType.add,
10654fe0a83eSXuan Hu  ))
10664fe0a83eSXuan Hu
10674fe0a83eSXuan Hu  io.deq.decodedInst.blockBackward := MuxCase(decodedInst.blockBackward, Seq(
10684fe0a83eSXuan Hu    isCSRR -> false.B,
1069cc1eb70dSXuan Hu  ))
1070be25371aSYikeZhou  //-------------------------------------------------------------
1071be25371aSYikeZhou  // Debug Info
10723b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
10733b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
10743b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
10753b739f49SXuan 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",
10763b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
10773b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
10783b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
10793b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
10803b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
10813b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
10823b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
10833b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
1084be25371aSYikeZhou}
1085