xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 211d620b07edb797ba35b635d24fef4e7294bae2)
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._
24c2a2229dSlewislzhimport freechips.rocketchip.rocket.CustomInstructions._
256ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat
263c02ee8fSwakafaimport utility._
273b739f49SXuan Huimport utils._
285a9dd560SXuan Huimport xiangshan.ExceptionNO.{EX_II, breakPoint, illegalInstr, virtualInstr}
296ab6918fSYinan Xuimport xiangshan._
30730cfbc0SXuan Huimport xiangshan.backend.fu.FuType
31730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst}
321be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions
33cc1eb70dSXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, OPCODE5Bit, XSInstBitFields}
345110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl}
3515ed99a7SXuan Huimport xiangshan.backend.fu.wrapper.CSRToDecode
36499d2763SZiyue Zhangimport xiangshan.backend.decode.Zimop._
3720b2b626SsinceforYyimport yunsuan.{VfaluType, VfcvtType}
38be25371aSYikeZhou
39be25371aSYikeZhou/**
40be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
41be25371aSYikeZhou */
42be25371aSYikeZhouabstract trait DecodeConstants {
43361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
4457a10886SXuan Hu  def X = BitPat("b0")
454d24c305SYikeZhou  def N = BitPat("b0")
464d24c305SYikeZhou  def Y = BitPat("b1")
4757a10886SXuan Hu  def T = true
4857a10886SXuan Hu  def F = false
494d24c305SYikeZhou
50c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
5120e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
524d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
5357a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
5457a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
5557a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5657a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5757a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
5889cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  canRobCompress
5989cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  uopSplitType
6089cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  |             selImm
6189cc69c1STang 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
624d24c305SYikeZhou
6357a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
6457a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
65be25371aSYikeZhou}
66be25371aSYikeZhou
67c2a8ae00SYikeZhoutrait DecodeUnitConstants
684d24c305SYikeZhou{
694d24c305SYikeZhou  // abstract out instruction decode magic numbers
704d24c305SYikeZhou  val RD_MSB  = 11
714d24c305SYikeZhou  val RD_LSB  = 7
724d24c305SYikeZhou  val RS1_MSB = 19
734d24c305SYikeZhou  val RS1_LSB = 15
744d24c305SYikeZhou  val RS2_MSB = 24
754d24c305SYikeZhou  val RS2_LSB = 20
764d24c305SYikeZhou  val RS3_MSB = 31
774d24c305SYikeZhou  val RS3_LSB = 27
784d24c305SYikeZhou}
794d24c305SYikeZhou
80be25371aSYikeZhou/**
81be25371aSYikeZhou * Decoded control signals
824d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
83be25371aSYikeZhou */
84c2a8ae00SYikeZhou
8557a10886SXuan Huabstract class XSDecodeBase {
8657a10886SXuan Hu  def X = BitPat("b?")
8757a10886SXuan Hu  def N = BitPat("b0")
8857a10886SXuan Hu  def Y = BitPat("b1")
8957a10886SXuan Hu  def T = true
9057a10886SXuan Hu  def F = false
9157a10886SXuan Hu  def generate() : List[BitPat]
9257a10886SXuan Hu}
9357a10886SXuan Hu
9457a10886SXuan Hucase class XSDecode(
9557a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
96239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat,
97e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9857a10886SXuan Hu  xWen: Boolean = false,
9957a10886SXuan Hu  fWen: Boolean = false,
10057a10886SXuan Hu  vWen: Boolean = false,
10157a10886SXuan Hu  mWen: Boolean = false,
10257a10886SXuan Hu  xsTrap: Boolean = false,
10357a10886SXuan Hu  noSpec: Boolean = false,
10457a10886SXuan Hu  blockBack: Boolean = false,
10557a10886SXuan Hu  flushPipe: Boolean = false,
10689cc69c1STang Haojin  canRobCompress: Boolean = false,
10757a10886SXuan Hu) extends XSDecodeBase {
10857a10886SXuan Hu  def generate() : List[BitPat] = {
10989cc69c1STang 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)
11057a10886SXuan Hu  }
11157a10886SXuan Hu}
11257a10886SXuan Hu
11357a10886SXuan Hucase class FDecode(
11457a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
115239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X,
11617ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
11757a10886SXuan Hu  xWen: Boolean = false,
11857a10886SXuan Hu  fWen: Boolean = false,
11957a10886SXuan Hu  vWen: Boolean = false,
12057a10886SXuan Hu  mWen: Boolean = false,
12157a10886SXuan Hu  xsTrap: Boolean = false,
12257a10886SXuan Hu  noSpec: Boolean = false,
12357a10886SXuan Hu  blockBack: Boolean = false,
12457a10886SXuan Hu  flushPipe: Boolean = false,
12589cc69c1STang Haojin  canRobCompress: Boolean = false,
12657a10886SXuan Hu) extends XSDecodeBase {
12757a10886SXuan Hu  def generate() : List[BitPat] = {
12889cc69c1STang Haojin    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate()
12957a10886SXuan Hu  }
13057a10886SXuan Hu}
13157a10886SXuan Hu
132be25371aSYikeZhou/**
133be25371aSYikeZhou * Overall Decode constants
134be25371aSYikeZhou */
135be25371aSYikeZhouobject XDecode extends DecodeConstants {
13657a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
137768f5f91SYangyu Chen    // RV32I
13857a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
13957a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
14057a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
14157a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
14257a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
14357a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
14457a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
14557a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
14689cc69c1STang Haojin    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T),
14789cc69c1STang Haojin    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T),
14889cc69c1STang Haojin    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T),
14989cc69c1STang Haojin    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T, canRobCompress = T),
15089cc69c1STang Haojin    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T),
15189cc69c1STang Haojin    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T),
15289cc69c1STang Haojin    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T),
15389cc69c1STang Haojin    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T, canRobCompress = T),
15489cc69c1STang Haojin    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T, canRobCompress = T),
15589cc69c1STang Haojin    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T, canRobCompress = T),
15689cc69c1STang Haojin    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T, canRobCompress = T),
15789cc69c1STang Haojin    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T, canRobCompress = T),
15889cc69c1STang Haojin    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T, canRobCompress = T),
15989cc69c1STang Haojin    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T, canRobCompress = T),
16089cc69c1STang Haojin    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T, canRobCompress = T),
16189cc69c1STang Haojin    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T, canRobCompress = T),
16289cc69c1STang Haojin    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T, canRobCompress = T),
1634d24c305SYikeZhou
164768f5f91SYangyu Chen    // RV64I (extend from RV32I)
165768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
166768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
167768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
168768f5f91SYangyu Chen
169768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
170768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
171768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
172768f5f91SYangyu Chen
173768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
174768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
175768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
176768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
177768f5f91SYangyu Chen
178768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
179768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
180768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
181768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
182768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
183768f5f91SYangyu Chen
184768f5f91SYangyu Chen    // RV64M
18589cc69c1STang Haojin    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T, canRobCompress = T),
18689cc69c1STang Haojin    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T, canRobCompress = T),
18789cc69c1STang Haojin    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T),
18889cc69c1STang Haojin    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T),
18989cc69c1STang Haojin    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T, canRobCompress = T),
1904d24c305SYikeZhou
19189cc69c1STang Haojin    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T, canRobCompress = T),
19289cc69c1STang Haojin    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T, canRobCompress = T),
19389cc69c1STang Haojin    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T, canRobCompress = T),
19489cc69c1STang Haojin    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T, canRobCompress = T),
19589cc69c1STang Haojin    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T, canRobCompress = T),
19689cc69c1STang Haojin    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T),
19789cc69c1STang Haojin    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T, canRobCompress = T),
19889cc69c1STang Haojin    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T),
1994d24c305SYikeZhou
200f7af4c74Schengguanghui    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
20157a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
2025110577fSZiyue Zhang    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T),
2033b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
2043b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
2053b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2063b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2073b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2083b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2094d24c305SYikeZhou
210768f5f91SYangyu Chen    // System, the immediate12 holds the CSR register.
21140ac5bb1SXuan Hu
212fa16cf81Slewislzh    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
213fa16cf81Slewislzh    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
214fa16cf81Slewislzh    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2154d24c305SYikeZhou
21657a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21757a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21857a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2194d24c305SYikeZhou
22057a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22157a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22257a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22357a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
224c2a2229dSlewislzh    MNRET   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22557a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22657a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2274d24c305SYikeZhou
22857a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22957a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
23057a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
231*211d620bSlewislzh    PAUSE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2324d24c305SYikeZhou
233768f5f91SYangyu Chen    // RV64A
23457a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23557a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23657a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23757a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23857a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23957a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24057a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24157a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24257a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2434d24c305SYikeZhou
24457a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24557a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24757a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24857a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24957a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25057a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25157a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25257a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2534d24c305SYikeZhou
25457a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25557a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25657a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25757a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
258768f5f91SYangyu Chen  )
259768f5f91SYangyu Chen}
260ee8ff153Szfw
261768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
262768f5f91SYangyu Chen  /*
263768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
264768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
265768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
266768f5f91SYangyu Chen   */
267768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
268768f5f91SYangyu Chen    // Zba
269768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
270768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
271768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
272768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
273768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
274768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
275768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
276768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
277768f5f91SYangyu Chen
278768f5f91SYangyu Chen    // Zbb
27989cc69c1STang Haojin    ANDN      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn    , SelImm.X    , xWen = T, canRobCompress = T),
28089cc69c1STang Haojin    ORN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn     , SelImm.X    , xWen = T, canRobCompress = T),
28189cc69c1STang Haojin    XNOR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor    , SelImm.X    , xWen = T, canRobCompress = T),
282ee8ff153Szfw
283768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
284768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
285768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
286768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
287768f5f91SYangyu Chen
288768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
289768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
290768f5f91SYangyu Chen
29189cc69c1STang Haojin    MAX       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max     , SelImm.X    , xWen = T, canRobCompress = T),
29289cc69c1STang Haojin    MAXU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu    , SelImm.X    , xWen = T, canRobCompress = T),
293768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
294768f5f91SYangyu Chen    MINU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu    , SelImm.X    , xWen = T, canRobCompress = T),
295ee8ff153Szfw
29689cc69c1STang Haojin    SEXT_B    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb   , SelImm.X    , xWen = T, canRobCompress = T),
29789cc69c1STang Haojin    SEXT_H    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth   , SelImm.X    , xWen = T, canRobCompress = T),
298768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
299768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
300ee8ff153Szfw
301768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
302768f5f91SYangyu Chen    ROLW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw    , SelImm.X    , xWen = T, canRobCompress = T),
30389cc69c1STang Haojin    ROR       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.X    , xWen = T, canRobCompress = T),
30489cc69c1STang Haojin    RORI      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.IMM_I, xWen = T, canRobCompress = T),
305768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
306768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
307ee8ff153Szfw
308768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
309768f5f91SYangyu Chen
310768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
311768f5f91SYangyu Chen
312768f5f91SYangyu Chen    // Zbc
313768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
314768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
315768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
316768f5f91SYangyu Chen
317768f5f91SYangyu Chen    // Zbs
318768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
319768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
320768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
321768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
322768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
323768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
324768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
325768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
326768f5f91SYangyu Chen
327768f5f91SYangyu Chen    // Zbkb
328768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
329768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
330768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
331768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
332768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
333768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
334768f5f91SYangyu Chen
335768f5f91SYangyu Chen    // Zbkc
336768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
337768f5f91SYangyu Chen
338768f5f91SYangyu Chen    // Zbkx
339768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
340768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
341768f5f91SYangyu Chen  )
342768f5f91SYangyu Chen}
343768f5f91SYangyu Chen
344768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
345768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
346768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
347768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
348768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
349768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
350768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
351768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
352768f5f91SYangyu Chen
353768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
354768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
355768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
356768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
357768f5f91SYangyu Chen
358768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
359768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
360768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
361768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
362768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
363768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
364768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
365768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
366768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
367768f5f91SYangyu Chen
368768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
369768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
370768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
371768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
372768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
373768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
374768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
375768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
376768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
377768f5f91SYangyu Chen
378768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
379768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
380768f5f91SYangyu Chen    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1     , SelImm.X    , xWen = T, canRobCompress = T),
3814d24c305SYikeZhou  )
382be25371aSYikeZhou}
383be25371aSYikeZhou
384be25371aSYikeZhou/**
385be25371aSYikeZhou * FP Decode constants
386be25371aSYikeZhou */
38757a10886SXuan Huobject FpDecode extends DecodeConstants{
38857a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
389b189aafaSzmx    FLH     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T),
39057a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
39157a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
392b189aafaSzmx    FSH     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S          ),
39357a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
39457a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3954d24c305SYikeZhou
396964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
397964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
398b189aafaSzmx    FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T),
399c2a8ae00SYikeZhou
4004d24c305SYikeZhou    // Int to FP
40189cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40289cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40389cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40489cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4054d24c305SYikeZhou
40689cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40789cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40889cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40989cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4104d24c305SYikeZhou
4114d24c305SYikeZhou  )
412be25371aSYikeZhou}
413be25371aSYikeZhou
414be25371aSYikeZhou/**
415be25371aSYikeZhou * FP Divide SquareRoot Constants
416be25371aSYikeZhou */
417be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
41857a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
41989cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
42089cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
42189cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
42289cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4234d24c305SYikeZhou  )
424be25371aSYikeZhou}
425be25371aSYikeZhou
4264d24c305SYikeZhou/**
427af2f7849Shappy-lx * Svinval extension Constants
428af2f7849Shappy-lx */
429af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
43057a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
431af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
432af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
433ecdd9295SXuan Hu     * Since software cannot promiss all sinval.vma between sfence.w.inval and sfence.inval.ir, we make sinval.vma wait
434ecdd9295SXuan Hu     * forward.
435af2f7849Shappy-lx     */
436ecdd9295SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T),
437af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
438af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
439af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
440af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
441af2f7849Shappy-lx     */
44257a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
443af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
444af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
445af2f7849Shappy-lx     * then dispatch and issue this instrucion
446af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
447af2f7849Shappy-lx     */
44857a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
449af2f7849Shappy-lx    /* what is Svinval extension ?
450af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
451af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
452af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
453af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
454af2f7849Shappy-lx     *
455af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
456af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
457af2f7849Shappy-lx     */
458af2f7849Shappy-lx  )
459af2f7849Shappy-lx}
46057a10886SXuan Hu
461af2f7849Shappy-lx/*
462ca18a0b4SWilliam Wang * CBO decode
463ca18a0b4SWilliam Wang */
464ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
46557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
46657a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
46757a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
46857a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
46957a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
470ca18a0b4SWilliam Wang  )
471ca18a0b4SWilliam Wang}
472ca18a0b4SWilliam Wang
473d0de7e4aSpeixiaokun/*
474d0de7e4aSpeixiaokun * Hypervisor decode
475d0de7e4aSpeixiaokun */
476d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
477e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
478e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
479e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
480ecdd9295SXuan Hu
481ecdd9295SXuan Hu    /**
482ecdd9295SXuan Hu     * Since software cannot promiss all sinval.vma between sfence.w.inval and sfence.inval.ir, we make sinval.vma wait
483ecdd9295SXuan Hu     * forward.
484ecdd9295SXuan Hu     */
485ecdd9295SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T),
486ecdd9295SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T),
487e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
488e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
489e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
490e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
491e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
492e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
493e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
494e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
495e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
496e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
497e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
498e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
499e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
500d0de7e4aSpeixiaokun  )
501d0de7e4aSpeixiaokun}
502d0de7e4aSpeixiaokun
503545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
504545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
505545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
506545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
507545d7be0SYangyu Chen  )
508545d7be0SYangyu Chen}
509545d7be0SYangyu Chen
510ca18a0b4SWilliam Wang/**
511499d2763SZiyue Zhang  * "Zimop" Extension for May-Be-Operations
512499d2763SZiyue Zhang  */
513499d2763SZiyue Zhangobject ZimopDecode extends DecodeConstants {
514499d2763SZiyue Zhang  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
515499d2763SZiyue Zhang    // temp use addi to decode MOP_R and MOP_RR
516499d2763SZiyue Zhang    MOP_R  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
517499d2763SZiyue Zhang    MOP_RR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
518499d2763SZiyue Zhang  )
519499d2763SZiyue Zhang}
520499d2763SZiyue Zhang
52120b2b626SsinceforYyobject ZfaDecode extends DecodeConstants {
52220b2b626SsinceforYy  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
52320b2b626SsinceforYy    FLI_H       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
52420b2b626SsinceforYy    FLI_S       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
52520b2b626SsinceforYy    FLI_D       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
52620b2b626SsinceforYy    FMINM_H     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
52720b2b626SsinceforYy    FMINM_S     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
52820b2b626SsinceforYy    FMINM_D     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
52920b2b626SsinceforYy    FMAXM_H     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
53020b2b626SsinceforYy    FMAXM_S     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
53120b2b626SsinceforYy    FMAXM_D     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
53220b2b626SsinceforYy    FROUND_H    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
53320b2b626SsinceforYy    FROUND_S    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
53420b2b626SsinceforYy    FROUND_D    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
53520b2b626SsinceforYy    FROUNDNX_H  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
53620b2b626SsinceforYy    FROUNDNX_S  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
53720b2b626SsinceforYy    FROUNDNX_D  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
53820b2b626SsinceforYy    FCVTMOD_W_D -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fcvtmod_w_d, xWen = T, canRobCompress = T),
53920b2b626SsinceforYy    FLEQ_H      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
54020b2b626SsinceforYy    FLEQ_S      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
54120b2b626SsinceforYy    FLEQ_D      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
54220b2b626SsinceforYy    FLTQ_H      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
54320b2b626SsinceforYy    FLTQ_S      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
54420b2b626SsinceforYy    FLTQ_D      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
54520b2b626SsinceforYy  )
54620b2b626SsinceforYy}
54720b2b626SsinceforYy
548499d2763SZiyue Zhang/**
5494d24c305SYikeZhou * XiangShan Trap Decode constants
5504d24c305SYikeZhou */
5514d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
552361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
55357a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
55457a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
5554d24c305SYikeZhou  )
5564d24c305SYikeZhou}
557be25371aSYikeZhou
55849f433deSXuan Huabstract class Imm(val len: Int) {
559b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
560b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
561b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
562b0ae3ac4SLinJiawei}
563b0ae3ac4SLinJiawei
564b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
565fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
566b0ae3ac4SLinJiawei
567b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
568b0ae3ac4SLinJiawei    Cat(instr(31, 20))
569b0ae3ac4SLinJiawei}
570b0ae3ac4SLinJiawei
571b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
572b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
573b0ae3ac4SLinJiawei
574b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
575b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
576b0ae3ac4SLinJiawei}
577b0ae3ac4SLinJiawei
578b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
579b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
580b0ae3ac4SLinJiawei
581b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
582b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
583b0ae3ac4SLinJiawei}
584b0ae3ac4SLinJiawei
585b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
586fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
587b0ae3ac4SLinJiawei
588b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
589b0ae3ac4SLinJiawei    instr(31, 12)
590c2a8ae00SYikeZhou  }
591c2a8ae00SYikeZhou}
592c2a8ae00SYikeZhou
593b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
594b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
595b0ae3ac4SLinJiawei
596b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
597b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
598b0ae3ac4SLinJiawei  }
599b0ae3ac4SLinJiawei}
600b0ae3ac4SLinJiawei
601fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){
602b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
603b0ae3ac4SLinJiawei
604b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
605fa16cf81Slewislzh    Cat(instr(11, 7), instr(19, 15), instr(31, 20))
606b0ae3ac4SLinJiawei  }
60792c61038SXuan Hu
60892c61038SXuan Hu  def getCSRAddr(imm: UInt): UInt = {
60992c61038SXuan Hu    require(imm.getWidth == this.len)
61092c61038SXuan Hu    imm(11, 0)
61192c61038SXuan Hu  }
61292c61038SXuan Hu
61392c61038SXuan Hu  def getRS1(imm: UInt): UInt = {
61492c61038SXuan Hu    require(imm.getWidth == this.len)
61592c61038SXuan Hu    imm(16, 12)
61692c61038SXuan Hu  }
61792c61038SXuan Hu
61892c61038SXuan Hu  def getRD(imm: UInt): UInt = {
61992c61038SXuan Hu    require(imm.getWidth == this.len)
62092c61038SXuan Hu    imm(21, 17)
62192c61038SXuan Hu  }
62292c61038SXuan Hu
62392c61038SXuan Hu  def getImm5(imm: UInt): UInt = {
62492c61038SXuan Hu    require(imm.getWidth == this.len)
62592c61038SXuan Hu    imm(16, 12)
62692c61038SXuan Hu  }
627b0ae3ac4SLinJiawei}
628b0ae3ac4SLinJiawei
629ee8ff153Szfwcase class Imm_B6() extends Imm(6){
630ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
631ee8ff153Szfw
632ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
633ee8ff153Szfw    instr(25, 20)
634ee8ff153Szfw  }
635ee8ff153Szfw}
636ee8ff153Szfw
63758c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
63858c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
63958c35d23Shuxuan0307
64058c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
64158c35d23Shuxuan0307    instr(19, 15)
64258c35d23Shuxuan0307  }
64358c35d23Shuxuan0307}
644b52d4755SXuan Hu
64558c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
64658c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
64758c35d23Shuxuan0307
64858c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
64958c35d23Shuxuan0307    instr(19, 15)
65058c35d23Shuxuan0307  }
65158c35d23Shuxuan0307}
652b52d4755SXuan Hu
6534aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
6544aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6554aa9ed34Sfdy
6564aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6574aa9ed34Sfdy    instr(30, 20)
6584aa9ed34Sfdy  }
659e6ac7fe1SZiyue Zhang  /**
660e6ac7fe1SZiyue Zhang    * get VType from extended imm
661e6ac7fe1SZiyue Zhang    * @param extedImm
662e6ac7fe1SZiyue Zhang    * @return VType
663e6ac7fe1SZiyue Zhang    */
664e6ac7fe1SZiyue Zhang  def getVType(extedImm: UInt): InstVType = {
665e6ac7fe1SZiyue Zhang    val vtype = Wire(new InstVType)
666e6ac7fe1SZiyue Zhang    vtype := extedImm(10, 0).asTypeOf(new InstVType)
667e6ac7fe1SZiyue Zhang    vtype
668e6ac7fe1SZiyue Zhang  }
6694aa9ed34Sfdy}
670b52d4755SXuan Hu
671e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){
6724aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6734aa9ed34Sfdy
6744aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6755c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
676b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
677e6ac7fe1SZiyue Zhang    val vtype8 = rvInst.ZIMM_VSETIVLI
678b52d4755SXuan Hu    Cat(uimm5, vtype8)
679b52d4755SXuan Hu  }
680b52d4755SXuan Hu  /**
681b52d4755SXuan Hu    * get VType from extended imm
682b52d4755SXuan Hu    * @param extedImm
683b52d4755SXuan Hu    * @return VType
684b52d4755SXuan Hu    */
685b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
686b52d4755SXuan Hu    val vtype = Wire(new InstVType)
687e6ac7fe1SZiyue Zhang    vtype := extedImm(9, 0).asTypeOf(new InstVType)
688b52d4755SXuan Hu    vtype
689b52d4755SXuan Hu  }
690b52d4755SXuan Hu
691b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
692e6ac7fe1SZiyue Zhang    extedImm(14, 10)
6934aa9ed34Sfdy  }
6944aa9ed34Sfdy}
695fe528fd6Ssinsanction
696fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
697fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
698fe528fd6Ssinsanction
699fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
700fe528fd6Ssinsanction    instr(31, 0)
701fe528fd6Ssinsanction  }
702fe528fd6Ssinsanction}
703fe528fd6Ssinsanction
7047e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
7057e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
7067e30d16cSZhaoyang You
7077e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
7087e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
7097e30d16cSZhaoyang You  }
7107e30d16cSZhaoyang You}
7117e30d16cSZhaoyang You
712b0ae3ac4SLinJiaweiobject ImmUnion {
713b0ae3ac4SLinJiawei  val I = Imm_I()
714b0ae3ac4SLinJiawei  val S = Imm_S()
715b0ae3ac4SLinJiawei  val B = Imm_B()
716b0ae3ac4SLinJiawei  val U = Imm_U()
717b0ae3ac4SLinJiawei  val J = Imm_J()
718b0ae3ac4SLinJiawei  val Z = Imm_Z()
719ee8ff153Szfw  val B6 = Imm_B6()
72058c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
72158c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
7224aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
7234aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
724fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
7257e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
7264aa9ed34Sfdy
727520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
7287e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
729b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
730b0ae3ac4SLinJiawei  val immSelMap = Seq(
731b0ae3ac4SLinJiawei    SelImm.IMM_I,
732b0ae3ac4SLinJiawei    SelImm.IMM_S,
733b0ae3ac4SLinJiawei    SelImm.IMM_SB,
734b0ae3ac4SLinJiawei    SelImm.IMM_U,
735b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
736ee8ff153Szfw    SelImm.IMM_Z,
73758c35d23Shuxuan0307    SelImm.IMM_B6,
73858c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
7394aa9ed34Sfdy    SelImm.IMM_OPIVIU,
7404aa9ed34Sfdy    SelImm.IMM_VSETVLI,
741fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
7427e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
743b0ae3ac4SLinJiawei  ).zip(imms)
744b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
745b0ae3ac4SLinJiawei}
746b0ae3ac4SLinJiawei
747fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
748fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
749fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
750765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
751fd7603d9SYinan Xu  }
7523b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
753fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
7543b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
755f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
756fd7603d9SYinan Xu  }
757fd7603d9SYinan Xu}
758b0ae3ac4SLinJiawei
759be25371aSYikeZhou/**
760be25371aSYikeZhou * IO bundle for the Decode unit
761be25371aSYikeZhou */
762aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
763aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
764aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
765aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
766aaa08c5aSxiaofeibao-xjtu}
7672225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
7683b739f49SXuan Hu  val enq = new Bundle {
7693b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
770d91483a6Sfdy    val vtype = Input(new VType)
7715110577fSZiyue Zhang    val vstart = Input(Vl())
7724aa9ed34Sfdy  }
7733b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
774aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
775af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
77615ed99a7SXuan Hu  val fromCSR = Input(new CSRToDecode)
777be25371aSYikeZhou}
778be25371aSYikeZhou
779be25371aSYikeZhou/**
780be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
781be25371aSYikeZhou */
7822225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
783be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
784be25371aSYikeZhou
7853b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
786be25371aSYikeZhou
78775e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
78875e2c883SXuan Hu
78957a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
79057a10886SXuan Hu    FpDecode.table ++
791bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
792768f5f91SYangyu Chen    BitmanipDecode.table ++
793768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
794a19215ddSYinan Xu    XSTrapDecode.table ++
795a19215ddSYinan Xu    CBODecode.table ++
796b65b9ebaSXuan Hu    SvinvalDecode.table ++
797e25e4d90SXuan Hu    HypervisorDecode.table ++
798545d7be0SYangyu Chen    VecDecoder.table ++
799499d2763SZiyue Zhang    ZicondDecode.table ++
80020b2b626SsinceforYy    ZimopDecode.table ++
80120b2b626SsinceforYy    ZfaDecode.table
802b65b9ebaSXuan Hu
80389cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
804a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
805239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
806a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
807a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
808be25371aSYikeZhou
8094d24c305SYikeZhou  // output
8103b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
811be25371aSYikeZhou
8122ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
8137ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
8143b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
815ec427417Slinzhida  decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags
8161a1319cbSLinJiawei
8173b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
8183b739f49SXuan Hu
819a8db15d8Sfdy  decodedInst.uopIdx := 0.U
820d91483a6Sfdy  decodedInst.firstUop := true.B
821d91483a6Sfdy  decodedInst.lastUop := true.B
822f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
8233235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
824deb6421eSHaojin Tang
825499d2763SZiyue Zhang  val isZimop = (BitPat("b1?00??0111??_?????_100_?????_1110011") === ctrl_flow.instr) ||
826499d2763SZiyue Zhang                (BitPat("b1?00??1?????_?????_100_?????_1110011") === ctrl_flow.instr)
827499d2763SZiyue Zhang
82873c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
829499d2763SZiyue Zhang  // temp decode zimop as move
830499d2763SZiyue Zhang  decodedInst.isMove := (isMove || isZimop) && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
83173c4359eSYikeZhou
83249a2cda2SXuan Hu  // fmadd - b1000011
83349a2cda2SXuan Hu  // fmsub - b1000111
83449a2cda2SXuan Hu  // fnmsub- b1001011
83549a2cda2SXuan Hu  // fnmadd- b1001111
83649a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
837e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
838e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
83949a2cda2SXuan Hu
840178dd38cSYikeZhou  // read src1~3 location
84198cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
84298cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
84349a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
84449a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
8459c5a1080Sxiaofeibao  decodedInst.lsrc(3) := V0_IDX.U
8469c5a1080Sxiaofeibao  decodedInst.lsrc(4) := Vl_IDX.U
847b6b11f60SXuan Hu
848178dd38cSYikeZhou  // read dest location
84998cfe81bSxgkiri  decodedInst.ldest := inst.RD
8504d24c305SYikeZhou
851e4e68f86Sxiaofeibao  // init v0Wen vlWen
852e4e68f86Sxiaofeibao  decodedInst.v0Wen := false.B
853e4e68f86Sxiaofeibao  decodedInst.vlWen := false.B
854e4e68f86Sxiaofeibao
855c2a8ae00SYikeZhou  // fill in exception vector
856567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
857567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
858567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
859bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
8605110577fSZiyue Zhang  vecException.io.vstart := decodedInst.vpu.vstart
8614d24c305SYikeZhou
862e9f7c490SXuan Hu  private val isCboClean = CBO_CLEAN === io.enq.ctrlFlow.instr
863e9f7c490SXuan Hu  private val isCboFlush = CBO_FLUSH === io.enq.ctrlFlow.instr
864e9f7c490SXuan Hu  private val isCboInval = CBO_INVAL === io.enq.ctrlFlow.instr
865e9f7c490SXuan Hu  private val isCboZero  = CBO_ZERO  === io.enq.ctrlFlow.instr
866e9f7c490SXuan Hu
86715ed99a7SXuan Hu  private val exceptionII =
86815ed99a7SXuan Hu    decodedInst.selImm === SelImm.INVALID_INSTR ||
86915ed99a7SXuan Hu    vecException.io.illegalInst ||
87015ed99a7SXuan Hu    io.fromCSR.illegalInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence  ||
87115ed99a7SXuan Hu    io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
87215ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g ||
87315ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v ||
87415ed99a7SXuan Hu    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
8758b7dc6f5SsinceforYy    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
87600cefdffSXuan Hu    io.fromCSR.illegalInst.fsIsOff    && (
87700cefdffSXuan Hu      FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) ||
8788b7dc6f5SsinceforYy      (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) ||
879d60bfe5aSsinceforYy      FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) ||
88000cefdffSXuan Hu      inst.isOPFVF || inst.isOPFVV
88100cefdffSXuan Hu    ) ||
882b50a88ecSXuan Hu    io.fromCSR.illegalInst.vsIsOff    && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) ||
883689f6b88SsinceforYy    io.fromCSR.illegalInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType) ||
884689f6b88SsinceforYy    (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)) ||
885e9f7c490SXuan Hu    (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm ||
886e9f7c490SXuan Hu    io.fromCSR.illegalInst.cboZ       && isCboZero ||
887e9f7c490SXuan Hu    io.fromCSR.illegalInst.cboCF      && (isCboClean || isCboFlush) ||
888e9f7c490SXuan Hu    io.fromCSR.illegalInst.cboI       && isCboInval
88915ed99a7SXuan Hu
89015ed99a7SXuan Hu  private val exceptionVI =
89115ed99a7SXuan Hu    io.fromCSR.virtualInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence ||
89215ed99a7SXuan Hu    io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
89315ed99a7SXuan Hu    io.fromCSR.virtualInst.hfence     && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) ||
89415ed99a7SXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
895b50a88ecSXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
896e9f7c490SXuan Hu    io.fromCSR.virtualInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType) ||
897e9f7c490SXuan Hu    io.fromCSR.virtualInst.cboZ       && isCboZero ||
898e9f7c490SXuan Hu    io.fromCSR.virtualInst.cboCF      && (isCboClean || isCboFlush) ||
899e9f7c490SXuan Hu    io.fromCSR.virtualInst.cboI       && isCboInval
900e9f7c490SXuan Hu
90115ed99a7SXuan Hu
9025a9dd560SXuan Hu  decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II)
90315ed99a7SXuan Hu  decodedInst.exceptionVec(virtualInstr) := exceptionVI
904d0de7e4aSpeixiaokun
9057e0f64b0SGuanghui Cheng  //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry.
9067e0f64b0SGuanghui Cheng  decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger)
9077e0f64b0SGuanghui Cheng
9083b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
909b0ae3ac4SLinJiawei    x => {
9107ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
911b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
912b0ae3ac4SLinJiawei      x._1 -> minBits
913b0ae3ac4SLinJiawei    }
914b0ae3ac4SLinJiawei  ))
915aac4464eSYinan Xu
9167531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
9177531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
9187531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
9197531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
9207531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
9217531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
9227531c765SXuan Hu
9237531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
92475e2c883SXuan Hu
92575e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
926be25371aSYikeZhou
9270bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
92839c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
92939c388b5SXuan Hu  private val narrowInsts = Seq(
93039c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
93139c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
93239c388b5SXuan Hu  )
93339c388b5SXuan Hu  private val maskDstInsts = Seq(
93439c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
93539c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
93639c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
9379eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
9389eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
9399eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
9409eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
941f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
94239c388b5SXuan Hu  )
94330fcc710SZiyue Zhang  private val maskOpInsts = Seq(
94430fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
94530fcc710SZiyue Zhang  )
94694e6af68SZiyue-Zhang  private val vmaInsts = Seq(
94794e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
94894e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
94994e6af68SZiyue-Zhang  )
950bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
951bdda74fdSxiaofeibao-xjtu    // opfff
952bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
953bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
954bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
955bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
956bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
957bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
958bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
959bdda74fdSxiaofeibao-xjtu    // opfvv
960bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
961bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
962bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
963bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
964bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
965bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
966bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
967bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
968bdda74fdSxiaofeibao-xjtu    // opfvf
969bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
970bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
971bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
972bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
973bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
974bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
975bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
976aab8ef9cSxiaofeibao-xjtu    // vfred
977aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
978bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
979bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
980bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
981bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
982bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
983b189aafaSzmx    FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H,
984ba899681Schengguanghui    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,
985ba899681Schengguanghui    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,
986ba899681Schengguanghui    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,
987ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
98820b2b626SsinceforYy    // zfa
98920b2b626SsinceforYy    FLEQ_H, FLEQ_S, FLEQ_D, FLTQ_H, FLTQ_S, FLTQ_D,
99020b2b626SsinceforYy    FMINM_H, FMINM_S, FMINM_D, FMAXM_H, FMAXM_S, FMAXM_D,
99120b2b626SsinceforYy    FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D,
99220b2b626SsinceforYy    FCVTMOD_W_D,
993bdda74fdSxiaofeibao-xjtu  )
994689f6b88SsinceforYy
995689f6b88SsinceforYy  private val scalaNeedFrmInsts = Seq(
996689f6b88SsinceforYy    FADD_S, FSUB_S, FADD_D, FSUB_D,
997689f6b88SsinceforYy    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
998689f6b88SsinceforYy    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
99920b2b626SsinceforYy    FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D,
1000689f6b88SsinceforYy  )
1001689f6b88SsinceforYy
1002689f6b88SsinceforYy  private val vectorNeedFrmInsts = Seq (
1003689f6b88SsinceforYy    VFSLIDE1UP_VF, VFSLIDE1DOWN_VF,
1004689f6b88SsinceforYy  )
1005689f6b88SsinceforYy
1006bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
1007689f6b88SsinceforYy  decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
1008689f6b88SsinceforYy  decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
1009bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
1010bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
1011bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
10123b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
1013bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
1014bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
1015bdda74fdSxiaofeibao-xjtu  }.otherwise{
101675e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
101775e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
101875e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
101975e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
102075e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
102175e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
102275e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
1023d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
102494e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
102539c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
1026b6279fc6SZiyue Zhang    val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
1027b6279fc6SZiyue Zhang    val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
1028b6279fc6SZiyue Zhang    val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
1029b6279fc6SZiyue Zhang    val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe
1030dab1ad8cSsinsanction    val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse
1031dab1ad8cSsinsanction    val isVlm = decodedInst.fuOpType === VlduType.vlm
103281229133SZiyue Zhang    val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV || decodedInst.uopSplitType === UopSplitType.VEC_VWW
103394e6af68SZiyue-Zhang    val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
1034dab1ad8cSsinsanction    val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew
1035b6279fc6SZiyue Zhang    decodedInst.vpu.isNarrow := isNarrow
1036b6279fc6SZiyue Zhang    decodedInst.vpu.isDstMask := isDstMask
1037b6279fc6SZiyue Zhang    decodedInst.vpu.isOpMask := isOpMask
103894e6af68SZiyue-Zhang    decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma
1039dab1ad8cSsinsanction    decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac
10405110577fSZiyue Zhang    decodedInst.vpu.vstart := io.enq.vstart
1041df3b4b92SAnzooooo    decodedInst.vpu.isVleff := decodedInst.fuOpType === VlduType.vleff && inst.NF === 0.U
1042bdda74fdSxiaofeibao-xjtu  }
104306f0a37aSZiyue Zhang  decodedInst.vpu.specVill := io.enq.vtype.illegal
104406f0a37aSZiyue Zhang  decodedInst.vpu.specVma := io.enq.vtype.vma
104506f0a37aSZiyue Zhang  decodedInst.vpu.specVta := io.enq.vtype.vta
104606f0a37aSZiyue Zhang  decodedInst.vpu.specVsew := io.enq.vtype.vsew
104706f0a37aSZiyue Zhang  decodedInst.vpu.specVlmul := io.enq.vtype.vlmul
104875e2c883SXuan Hu
104931c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
105031c51290Szhanglinjuan
10516d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
10526d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
10536d56ac16Ssinsanction
10547f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
105587dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
105687dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
105706cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
105887dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
10590a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
1060c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
106106cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
1062c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
10637f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
1064ddc88dadSxiaofeibao  // numOfUop should be 1 when vector instruction is illegalInst
1065ddc88dadSxiaofeibao  io.deq.uopInfo.numOfUop := Mux(vecException.io.illegalInst, 1.U, uopInfoGen.io.out.uopInfo.numOfUop)
10663235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
10677f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
10687f9f0a79SzhanglyGit
1069a9becb0dSJunxiong Ji  val isCsr = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U
1070a9becb0dSJunxiong Ji  val isCsrr = isCsr && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U
1071a9becb0dSJunxiong Ji  val isCsrw = isCsr && inst.FUNCT3 === BitPat("b?01") && inst.RD  === 0.U
1072a9becb0dSJunxiong Ji  dontTouch(isCsrr)
1073a9becb0dSJunxiong Ji  dontTouch(isCsrw)
1074cc1eb70dSXuan Hu
107587c5d21dSZiyue Zhang  // for csrr vl instruction, convert to vsetvl
1076a9becb0dSJunxiong Ji  val isCsrrVlenb = isCsrr && inst.CSRIDX === CSRs.vlenb.U
1077a9becb0dSJunxiong Ji  val isCsrrVl    = isCsrr && inst.CSRIDX === CSRs.vl.U
1078cc1eb70dSXuan Hu
1079ac17908cSHuijin Li  // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i)
1080ac17908cSHuijin Li  val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U
1081ac17908cSHuijin Li  val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W)
1082ac17908cSHuijin Li  val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W)
1083ac17908cSHuijin Li  val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W)
1084ac17908cSHuijin Li
108520b2b626SsinceforYy  // for fli.s|fli.d instruction
108620b2b626SsinceforYy  val isFLI = inst.FUNCT7 === BitPat("b11110??") && inst.RS2 === 1.U && inst.RM === 0.U && inst.OPCODE5Bit === OPCODE5Bit.OP_FP
108720b2b626SsinceforYy
108887c5d21dSZiyue Zhang  when (isCsrrVl) {
108963cb3754SZiyue Zhang    // convert to vsetvl instruction
109087c5d21dSZiyue Zhang    decodedInst.srcType(0) := SrcType.no
109187c5d21dSZiyue Zhang    decodedInst.srcType(1) := SrcType.no
109287c5d21dSZiyue Zhang    decodedInst.srcType(2) := SrcType.no
109387c5d21dSZiyue Zhang    decodedInst.srcType(3) := SrcType.no
109487c5d21dSZiyue Zhang    decodedInst.srcType(4) := SrcType.vp
109587c5d21dSZiyue Zhang    decodedInst.lsrc(4)    := Vl_IDX.U
109663cb3754SZiyue Zhang    decodedInst.waitForward   := false.B
109787c5d21dSZiyue Zhang    decodedInst.blockBackward := false.B
10988c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
109963cb3754SZiyue Zhang  }.elsewhen (isCsrrVlenb) {
110063cb3754SZiyue Zhang    // convert to addi instruction
1101828a8a48SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1102828a8a48SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
110363cb3754SZiyue Zhang    decodedInst.srcType(2) := SrcType.no
110463cb3754SZiyue Zhang    decodedInst.srcType(3) := SrcType.no
110563cb3754SZiyue Zhang    decodedInst.srcType(4) := SrcType.no
110663cb3754SZiyue Zhang    decodedInst.selImm := SelImm.IMM_I
110763cb3754SZiyue Zhang    decodedInst.waitForward := false.B
110863cb3754SZiyue Zhang    decodedInst.blockBackward := false.B
110963cb3754SZiyue Zhang    decodedInst.canRobCompress := true.B
11108c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
1111ac17908cSHuijin Li  }.elsewhen (isPreW || isPreR || isPreI) {
1112ac17908cSHuijin Li    decodedInst.selImm := SelImm.IMM_S
1113ac17908cSHuijin Li    decodedInst.fuType := FuType.ldu.U
1114ac17908cSHuijin Li    decodedInst.canRobCompress := false.B
1115499d2763SZiyue Zhang  }.elsewhen (isZimop) {
1116499d2763SZiyue Zhang    // set srcType for zimop
1117499d2763SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1118499d2763SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
1119499d2763SZiyue Zhang    // use x0 as src1
1120499d2763SZiyue Zhang    decodedInst.lsrc(0) := 0.U
112187c5d21dSZiyue Zhang  }
112287c5d21dSZiyue Zhang
112375e2c883SXuan Hu  io.deq.decodedInst := decodedInst
11249faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
1125985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
1126cc1eb70dSXuan Hu    // keep condition
1127cc1eb70dSXuan Hu    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType,
112887c5d21dSZiyue Zhang    (isCsrrVl) -> FuType.vsetfwf.U,
112963cb3754SZiyue Zhang    (isCsrrVlenb) -> FuType.alu.U,
1130cc1eb70dSXuan Hu
1131cc1eb70dSXuan Hu    // change vlsu to vseglsu when NF =/= 0.U
1132f94f6503SXuan 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,
1133f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
1134f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
1135f94f6503SXuan 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,
1136f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
1137f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
1138f94f6503SXuan 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,
1139985804e6SXuan Hu  ))
1140499d2763SZiyue Zhang  io.deq.decodedInst.imm := MuxCase(decodedInst.imm, Seq(
1141499d2763SZiyue Zhang    isCsrrVlenb -> (VLEN / 8).U,
1142499d2763SZiyue Zhang    isZimop     -> 0.U,
1143499d2763SZiyue Zhang  ))
1144cc1eb70dSXuan Hu
11454fe0a83eSXuan Hu  io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq(
1146cc1eb70dSXuan Hu    isCsrrVl    -> VSETOpType.csrrvl,
1147cc1eb70dSXuan Hu    isCsrrVlenb -> ALUOpType.add,
114820b2b626SsinceforYy    isFLI       -> Cat(1.U, inst.FMT, inst.RS1),
1149e9f7c490SXuan Hu    (isPreW || isPreR || isPreI) -> Mux1H(Seq(
1150e9f7c490SXuan Hu      isPreW -> LSUOpType.prefetch_w,
1151e9f7c490SXuan Hu      isPreR -> LSUOpType.prefetch_r,
1152e9f7c490SXuan Hu      isPreI -> LSUOpType.prefetch_i,
1153e9f7c490SXuan Hu    )),
1154e9f7c490SXuan Hu    (isCboInval && io.fromCSR.special.cboI2F) -> LSUOpType.cbo_flush,
11554fe0a83eSXuan Hu  ))
11564fe0a83eSXuan Hu
11572a4ac712SEaston Man  // Don't compress in the same Rob entry when crossing Ftq entry boundary
11582a4ac712SEaston Man  io.deq.decodedInst.canRobCompress := decodedInst.canRobCompress && !io.enq.ctrlFlow.isLastInFtqEntry
11592a4ac712SEaston Man
1160be25371aSYikeZhou  //-------------------------------------------------------------
1161be25371aSYikeZhou  // Debug Info
11623b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
11633b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
11643b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
11653b739f49SXuan 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",
11663b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
11673b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
11683b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
11693b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
11703b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
11713b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
11723b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
11733b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
1174be25371aSYikeZhou}
1175