xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 7eb878b5caba4d010361b8e17c5f4fa7d344020e)
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 */
42f7fe02a8Sjunxiong-jitrait 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),
231211d620bSlewislzh    PAUSE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2324d24c305SYikeZhou
2336520f4f4STang Haojin    // Zawrs
2346520f4f4STang Haojin    WRS_NTO -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrs_nto, SelImm.X , noSpec = T, blockBack = T),
2356520f4f4STang Haojin    WRS_STO -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrs_sto, SelImm.X , noSpec = T, blockBack = T),
2366520f4f4STang Haojin
237768f5f91SYangyu Chen    // RV64A
23857a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23957a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24057a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24157a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24257a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24357a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24457a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24557a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24712861ac7Slinzhida    AMOCAS_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amocas_w, SelImm.X, uopSplitType = UopSplitType.AMO_CAS_W, xWen = T, noSpec = T, blockBack = T),
2484d24c305SYikeZhou
24957a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25057a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25157a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25257a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25357a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25457a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25557a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25657a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25757a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25812861ac7Slinzhida    AMOCAS_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amocas_d, SelImm.X, uopSplitType = UopSplitType.AMO_CAS_D, xWen = T, noSpec = T, blockBack = T),
25912861ac7Slinzhida
26012861ac7Slinzhida    AMOCAS_Q  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amocas_q, SelImm.X, uopSplitType = UopSplitType.AMO_CAS_Q, xWen = T, noSpec = T, blockBack = T),
2614d24c305SYikeZhou
26257a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
26357a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
26457a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
26557a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
266768f5f91SYangyu Chen  )
267768f5f91SYangyu Chen}
268ee8ff153Szfw
269768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
270768f5f91SYangyu Chen  /*
271768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
272768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
273768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
274768f5f91SYangyu Chen   */
275768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
276768f5f91SYangyu Chen    // Zba
277768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
278768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
279768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
280768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
281768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
282768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
283768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
284768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
285768f5f91SYangyu Chen
286768f5f91SYangyu Chen    // Zbb
28789cc69c1STang Haojin    ANDN      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn    , SelImm.X    , xWen = T, canRobCompress = T),
28889cc69c1STang Haojin    ORN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn     , SelImm.X    , xWen = T, canRobCompress = T),
28989cc69c1STang Haojin    XNOR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor    , SelImm.X    , xWen = T, canRobCompress = T),
290ee8ff153Szfw
291768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
292768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
293768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
294768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
295768f5f91SYangyu Chen
296768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
297768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
298768f5f91SYangyu Chen
29989cc69c1STang Haojin    MAX       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max     , SelImm.X    , xWen = T, canRobCompress = T),
30089cc69c1STang Haojin    MAXU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu    , SelImm.X    , xWen = T, canRobCompress = T),
301768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
302768f5f91SYangyu Chen    MINU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu    , SelImm.X    , xWen = T, canRobCompress = T),
303ee8ff153Szfw
30489cc69c1STang Haojin    SEXT_B    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb   , SelImm.X    , xWen = T, canRobCompress = T),
30589cc69c1STang Haojin    SEXT_H    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth   , SelImm.X    , xWen = T, canRobCompress = T),
306768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
307768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
308ee8ff153Szfw
309768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
310768f5f91SYangyu Chen    ROLW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw    , SelImm.X    , xWen = T, canRobCompress = T),
31189cc69c1STang Haojin    ROR       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.X    , xWen = T, canRobCompress = T),
31289cc69c1STang Haojin    RORI      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.IMM_I, xWen = T, canRobCompress = T),
313768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
314768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
315ee8ff153Szfw
316768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
317768f5f91SYangyu Chen
318768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
319768f5f91SYangyu Chen
320768f5f91SYangyu Chen    // Zbc
321768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
322768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
323768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
324768f5f91SYangyu Chen
325768f5f91SYangyu Chen    // Zbs
326768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
327768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
328768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
329768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
330768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
331768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
332768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
333768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
334768f5f91SYangyu Chen
335768f5f91SYangyu Chen    // Zbkb
336768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
337768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
338768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
339768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
340768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
341768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
342768f5f91SYangyu Chen
343768f5f91SYangyu Chen    // Zbkc
344768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
345768f5f91SYangyu Chen
346768f5f91SYangyu Chen    // Zbkx
347768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
348768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
349768f5f91SYangyu Chen  )
350768f5f91SYangyu Chen}
351768f5f91SYangyu Chen
352768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
353768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
354768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
355768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
356768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
357768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
358768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
359768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
360768f5f91SYangyu Chen
361768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
362768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
363768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
364768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
365768f5f91SYangyu Chen
366768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
367768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
368768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
369768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
370768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
371768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
372768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
373768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
374768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
375768f5f91SYangyu Chen
376768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
377768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
378768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
379768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
380768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
381768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
382768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
383768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
384768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
385768f5f91SYangyu Chen
386768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
387768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
388768f5f91SYangyu Chen    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1     , SelImm.X    , xWen = T, canRobCompress = T),
3894d24c305SYikeZhou  )
390be25371aSYikeZhou}
391be25371aSYikeZhou
392be25371aSYikeZhou/**
393be25371aSYikeZhou * FP Decode constants
394be25371aSYikeZhou */
39557a10886SXuan Huobject FpDecode extends DecodeConstants{
39657a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
397b189aafaSzmx    FLH     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T),
39857a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
39957a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
400b189aafaSzmx    FSH     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S          ),
40157a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
40257a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
4034d24c305SYikeZhou
404964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
405964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
406b189aafaSzmx    FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T),
407c2a8ae00SYikeZhou
4084d24c305SYikeZhou    // Int to FP
40989cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
41089cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
41189cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
41289cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4134d24c305SYikeZhou
41489cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
41589cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
41689cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
41789cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4184d24c305SYikeZhou
419614d2bc6SHeiHuDie    FCVT_H_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
420614d2bc6SHeiHuDie    FCVT_H_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
421614d2bc6SHeiHuDie    FCVT_H_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
422614d2bc6SHeiHuDie    FCVT_H_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4234d24c305SYikeZhou  )
424be25371aSYikeZhou}
425be25371aSYikeZhou
426be25371aSYikeZhou/**
427be25371aSYikeZhou * FP Divide SquareRoot Constants
428be25371aSYikeZhou */
429be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
43057a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
43189cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
43289cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
43389cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
43489cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4354d24c305SYikeZhou  )
436be25371aSYikeZhou}
437be25371aSYikeZhou
4384d24c305SYikeZhou/**
439af2f7849Shappy-lx * Svinval extension Constants
440af2f7849Shappy-lx */
441af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
44257a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
443af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
444af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
445ecdd9295SXuan Hu     * Since software cannot promiss all sinval.vma between sfence.w.inval and sfence.inval.ir, we make sinval.vma wait
446ecdd9295SXuan Hu     * forward.
447af2f7849Shappy-lx     */
448ecdd9295SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T),
449af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
450af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
451af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
452af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
453af2f7849Shappy-lx     */
45457a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
455af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
456af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
457af2f7849Shappy-lx     * then dispatch and issue this instrucion
458af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
459af2f7849Shappy-lx     */
46057a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
461af2f7849Shappy-lx    /* what is Svinval extension ?
462af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
463af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
464af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
465af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
466af2f7849Shappy-lx     *
467af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
468af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
469af2f7849Shappy-lx     */
470af2f7849Shappy-lx  )
471af2f7849Shappy-lx}
47257a10886SXuan Hu
473af2f7849Shappy-lx/*
474ca18a0b4SWilliam Wang * CBO decode
475ca18a0b4SWilliam Wang */
476ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
47757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
47857a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
47957a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
48057a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
48157a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
482ca18a0b4SWilliam Wang  )
483ca18a0b4SWilliam Wang}
484ca18a0b4SWilliam Wang
485d0de7e4aSpeixiaokun/*
486d0de7e4aSpeixiaokun * Hypervisor decode
487d0de7e4aSpeixiaokun */
488d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
489e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
490e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
491e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
492ecdd9295SXuan Hu
493ecdd9295SXuan Hu    /**
494ecdd9295SXuan Hu     * Since software cannot promiss all sinval.vma between sfence.w.inval and sfence.inval.ir, we make sinval.vma wait
495ecdd9295SXuan Hu     * forward.
496ecdd9295SXuan Hu     */
497ecdd9295SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T),
498ecdd9295SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T),
499e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
500e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
501e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
502e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
503e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
504e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
505e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
506e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
507e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
508e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
509e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
510e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
511e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
512d0de7e4aSpeixiaokun  )
513d0de7e4aSpeixiaokun}
514d0de7e4aSpeixiaokun
515545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
516545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
517545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
518545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
519545d7be0SYangyu Chen  )
520545d7be0SYangyu Chen}
521545d7be0SYangyu Chen
522ca18a0b4SWilliam Wang/**
523499d2763SZiyue Zhang * "Zimop" Extension for May-Be-Operations
524499d2763SZiyue Zhang */
525499d2763SZiyue Zhangobject ZimopDecode extends DecodeConstants {
526499d2763SZiyue Zhang  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
527499d2763SZiyue Zhang    // temp use addi to decode MOP_R and MOP_RR
528499d2763SZiyue Zhang    MOP_R  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
529499d2763SZiyue Zhang    MOP_RR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
530499d2763SZiyue Zhang  )
531499d2763SZiyue Zhang}
532499d2763SZiyue Zhang
53320b2b626SsinceforYyobject ZfaDecode extends DecodeConstants {
53420b2b626SsinceforYy  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
53520b2b626SsinceforYy    FLI_H       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
53620b2b626SsinceforYy    FLI_S       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
53720b2b626SsinceforYy    FLI_D       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
53820b2b626SsinceforYy    FMINM_H     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
53920b2b626SsinceforYy    FMINM_S     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
54020b2b626SsinceforYy    FMINM_D     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
54120b2b626SsinceforYy    FMAXM_H     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
54220b2b626SsinceforYy    FMAXM_S     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
54320b2b626SsinceforYy    FMAXM_D     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
54420b2b626SsinceforYy    FROUND_H    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
54520b2b626SsinceforYy    FROUND_S    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
54620b2b626SsinceforYy    FROUND_D    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
54720b2b626SsinceforYy    FROUNDNX_H  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
54820b2b626SsinceforYy    FROUNDNX_S  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
54920b2b626SsinceforYy    FROUNDNX_D  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
55020b2b626SsinceforYy    FCVTMOD_W_D -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fcvtmod_w_d, xWen = T, canRobCompress = T),
55120b2b626SsinceforYy    FLEQ_H      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
55220b2b626SsinceforYy    FLEQ_S      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
55320b2b626SsinceforYy    FLEQ_D      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
55420b2b626SsinceforYy    FLTQ_H      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
55520b2b626SsinceforYy    FLTQ_S      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
55620b2b626SsinceforYy    FLTQ_D      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
55720b2b626SsinceforYy  )
55820b2b626SsinceforYy}
55920b2b626SsinceforYy
560499d2763SZiyue Zhang/**
5614d24c305SYikeZhou * XiangShan Trap Decode constants
5624d24c305SYikeZhou */
5634d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
564361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
56557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
56657a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
5674d24c305SYikeZhou  )
5684d24c305SYikeZhou}
569be25371aSYikeZhou
57049f433deSXuan Huabstract class Imm(val len: Int) {
571b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
572b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
573b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
574b0ae3ac4SLinJiawei}
575b0ae3ac4SLinJiawei
576b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
577fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
578b0ae3ac4SLinJiawei
579b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
580b0ae3ac4SLinJiawei    Cat(instr(31, 20))
581b0ae3ac4SLinJiawei}
582b0ae3ac4SLinJiawei
583b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
584b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
585b0ae3ac4SLinJiawei
586b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
587b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
588b0ae3ac4SLinJiawei}
589b0ae3ac4SLinJiawei
590b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
591b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
592b0ae3ac4SLinJiawei
593b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
594b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
595b0ae3ac4SLinJiawei}
596b0ae3ac4SLinJiawei
597b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
598fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
599b0ae3ac4SLinJiawei
600b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
601b0ae3ac4SLinJiawei    instr(31, 12)
602c2a8ae00SYikeZhou  }
603c2a8ae00SYikeZhou}
604c2a8ae00SYikeZhou
605b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
606b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
607b0ae3ac4SLinJiawei
608b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
609b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
610b0ae3ac4SLinJiawei  }
611b0ae3ac4SLinJiawei}
612b0ae3ac4SLinJiawei
613fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){
614b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
615b0ae3ac4SLinJiawei
616b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
617fa16cf81Slewislzh    Cat(instr(11, 7), instr(19, 15), instr(31, 20))
618b0ae3ac4SLinJiawei  }
61992c61038SXuan Hu
62092c61038SXuan Hu  def getCSRAddr(imm: UInt): UInt = {
62192c61038SXuan Hu    require(imm.getWidth == this.len)
62292c61038SXuan Hu    imm(11, 0)
62392c61038SXuan Hu  }
62492c61038SXuan Hu
62592c61038SXuan Hu  def getRS1(imm: UInt): UInt = {
62692c61038SXuan Hu    require(imm.getWidth == this.len)
62792c61038SXuan Hu    imm(16, 12)
62892c61038SXuan Hu  }
62992c61038SXuan Hu
63092c61038SXuan Hu  def getRD(imm: UInt): UInt = {
63192c61038SXuan Hu    require(imm.getWidth == this.len)
63292c61038SXuan Hu    imm(21, 17)
63392c61038SXuan Hu  }
63492c61038SXuan Hu
63592c61038SXuan Hu  def getImm5(imm: UInt): UInt = {
63692c61038SXuan Hu    require(imm.getWidth == this.len)
63792c61038SXuan Hu    imm(16, 12)
63892c61038SXuan Hu  }
639b0ae3ac4SLinJiawei}
640b0ae3ac4SLinJiawei
641ee8ff153Szfwcase class Imm_B6() extends Imm(6){
642ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
643ee8ff153Szfw
644ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
645ee8ff153Szfw    instr(25, 20)
646ee8ff153Szfw  }
647ee8ff153Szfw}
648ee8ff153Szfw
64958c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
65058c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
65158c35d23Shuxuan0307
65258c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
65358c35d23Shuxuan0307    instr(19, 15)
65458c35d23Shuxuan0307  }
65558c35d23Shuxuan0307}
656b52d4755SXuan Hu
65758c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
65858c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
65958c35d23Shuxuan0307
66058c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
66158c35d23Shuxuan0307    instr(19, 15)
66258c35d23Shuxuan0307  }
66358c35d23Shuxuan0307}
664b52d4755SXuan Hu
6654aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
6664aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6674aa9ed34Sfdy
6684aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6694aa9ed34Sfdy    instr(30, 20)
6704aa9ed34Sfdy  }
671e6ac7fe1SZiyue Zhang  /**
672e6ac7fe1SZiyue Zhang   * get VType from extended imm
673e6ac7fe1SZiyue Zhang   * @param extedImm
674e6ac7fe1SZiyue Zhang   * @return VType
675e6ac7fe1SZiyue Zhang   */
676e6ac7fe1SZiyue Zhang  def getVType(extedImm: UInt): InstVType = {
677e6ac7fe1SZiyue Zhang    val vtype = Wire(new InstVType)
678e6ac7fe1SZiyue Zhang    vtype := extedImm(10, 0).asTypeOf(new InstVType)
679e6ac7fe1SZiyue Zhang    vtype
680e6ac7fe1SZiyue Zhang  }
6814aa9ed34Sfdy}
682b52d4755SXuan Hu
683e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){
6844aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6854aa9ed34Sfdy
6864aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6875c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
688b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
689e6ac7fe1SZiyue Zhang    val vtype8 = rvInst.ZIMM_VSETIVLI
690b52d4755SXuan Hu    Cat(uimm5, vtype8)
691b52d4755SXuan Hu  }
692b52d4755SXuan Hu  /**
693b52d4755SXuan Hu   * get VType from extended imm
694b52d4755SXuan Hu   * @param extedImm
695b52d4755SXuan Hu   * @return VType
696b52d4755SXuan Hu   */
697b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
698b52d4755SXuan Hu    val vtype = Wire(new InstVType)
699e6ac7fe1SZiyue Zhang    vtype := extedImm(9, 0).asTypeOf(new InstVType)
700b52d4755SXuan Hu    vtype
701b52d4755SXuan Hu  }
702b52d4755SXuan Hu
703b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
704e6ac7fe1SZiyue Zhang    extedImm(14, 10)
7054aa9ed34Sfdy  }
7064aa9ed34Sfdy}
707fe528fd6Ssinsanction
708fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
709fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
710fe528fd6Ssinsanction
711fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
712fe528fd6Ssinsanction    instr(31, 0)
713fe528fd6Ssinsanction  }
714fe528fd6Ssinsanction}
715fe528fd6Ssinsanction
7167e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
7177e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
7187e30d16cSZhaoyang You
7197e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
7207e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
7217e30d16cSZhaoyang You  }
7227e30d16cSZhaoyang You}
7237e30d16cSZhaoyang You
724b0ae3ac4SLinJiaweiobject ImmUnion {
725b0ae3ac4SLinJiawei  val I = Imm_I()
726b0ae3ac4SLinJiawei  val S = Imm_S()
727b0ae3ac4SLinJiawei  val B = Imm_B()
728b0ae3ac4SLinJiawei  val U = Imm_U()
729b0ae3ac4SLinJiawei  val J = Imm_J()
730b0ae3ac4SLinJiawei  val Z = Imm_Z()
731ee8ff153Szfw  val B6 = Imm_B6()
73258c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
73358c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
7344aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
7354aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
736fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
7377e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
7384aa9ed34Sfdy
739520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
7407e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
741b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
742b0ae3ac4SLinJiawei  val immSelMap = Seq(
743b0ae3ac4SLinJiawei    SelImm.IMM_I,
744b0ae3ac4SLinJiawei    SelImm.IMM_S,
745b0ae3ac4SLinJiawei    SelImm.IMM_SB,
746b0ae3ac4SLinJiawei    SelImm.IMM_U,
747b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
748ee8ff153Szfw    SelImm.IMM_Z,
74958c35d23Shuxuan0307    SelImm.IMM_B6,
75058c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
7514aa9ed34Sfdy    SelImm.IMM_OPIVIU,
7524aa9ed34Sfdy    SelImm.IMM_VSETVLI,
753fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
7547e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
755b0ae3ac4SLinJiawei  ).zip(imms)
756b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
757b0ae3ac4SLinJiawei}
758b0ae3ac4SLinJiawei
759fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
760fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
761fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
762765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
763fd7603d9SYinan Xu  }
7643b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
765fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
7663b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
767f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
768fd7603d9SYinan Xu  }
769fd7603d9SYinan Xu}
770b0ae3ac4SLinJiawei
771be25371aSYikeZhou/**
772be25371aSYikeZhou * IO bundle for the Decode unit
773be25371aSYikeZhou */
774f7fe02a8Sjunxiong-ji
775f7fe02a8Sjunxiong-jiclass DecodeUnitEnqIO(implicit p: Parameters) extends XSBundle {
776f7fe02a8Sjunxiong-ji  val ctrlFlow = Input(new StaticInst)
777f7fe02a8Sjunxiong-ji  val vtype = Input(new VType)
778f7fe02a8Sjunxiong-ji  val vstart = Input(Vl())
779f7fe02a8Sjunxiong-ji}
780f7fe02a8Sjunxiong-ji
781aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
782aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
783aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
784aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
785aaa08c5aSxiaofeibao-xjtu}
786f7fe02a8Sjunxiong-ji
7872225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
788f7fe02a8Sjunxiong-ji  val enq = new DecodeUnitEnqIO
7893b739f49SXuan Hu  //  val vconfig = Input(UInt(XLEN.W))
790aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
791af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
79215ed99a7SXuan Hu  val fromCSR = Input(new CSRToDecode)
793be25371aSYikeZhou}
794be25371aSYikeZhou
795be25371aSYikeZhou/**
796be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
797be25371aSYikeZhou */
7982225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
799be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
800be25371aSYikeZhou
8013b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
802be25371aSYikeZhou
80375e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
80475e2c883SXuan Hu
80557a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
80657a10886SXuan Hu    FpDecode.table ++
807bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
808768f5f91SYangyu Chen    BitmanipDecode.table ++
809768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
810a19215ddSYinan Xu    XSTrapDecode.table ++
811a19215ddSYinan Xu    CBODecode.table ++
812b65b9ebaSXuan Hu    SvinvalDecode.table ++
813e25e4d90SXuan Hu    HypervisorDecode.table ++
814545d7be0SYangyu Chen    VecDecoder.table ++
815499d2763SZiyue Zhang    ZicondDecode.table ++
81620b2b626SsinceforYy    ZimopDecode.table ++
81720b2b626SsinceforYy    ZfaDecode.table
818b65b9ebaSXuan Hu
81989cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
820a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
821239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
822a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
823a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
824be25371aSYikeZhou
8254d24c305SYikeZhou  // output
8263b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
827be25371aSYikeZhou
8282ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
8297ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
8303b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
831ec427417Slinzhida  decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags
8321a1319cbSLinJiawei
8333b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
8343b739f49SXuan Hu
835a8db15d8Sfdy  decodedInst.uopIdx := 0.U
836d91483a6Sfdy  decodedInst.firstUop := true.B
837d91483a6Sfdy  decodedInst.lastUop := true.B
838f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
8393235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
840deb6421eSHaojin Tang
841499d2763SZiyue Zhang  val isZimop = (BitPat("b1?00??0111??_?????_100_?????_1110011") === ctrl_flow.instr) ||
842499d2763SZiyue Zhang                (BitPat("b1?00??1?????_?????_100_?????_1110011") === ctrl_flow.instr)
843499d2763SZiyue Zhang
84473c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
845499d2763SZiyue Zhang  // temp decode zimop as move
846499d2763SZiyue Zhang  decodedInst.isMove := (isMove || isZimop) && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
84773c4359eSYikeZhou
84849a2cda2SXuan Hu  // fmadd - b1000011
84949a2cda2SXuan Hu  // fmsub - b1000111
85049a2cda2SXuan Hu  // fnmsub- b1001011
85149a2cda2SXuan Hu  // fnmadd- b1001111
85249a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
853e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
854e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
85549a2cda2SXuan Hu
856178dd38cSYikeZhou  // read src1~3 location
85798cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
85898cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
85949a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
86049a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
8619c5a1080Sxiaofeibao  decodedInst.lsrc(3) := V0_IDX.U
8629c5a1080Sxiaofeibao  decodedInst.lsrc(4) := Vl_IDX.U
863b6b11f60SXuan Hu
864178dd38cSYikeZhou  // read dest location
86598cfe81bSxgkiri  decodedInst.ldest := inst.RD
8664d24c305SYikeZhou
867e4e68f86Sxiaofeibao  // init v0Wen vlWen
868e4e68f86Sxiaofeibao  decodedInst.v0Wen := false.B
869e4e68f86Sxiaofeibao  decodedInst.vlWen := false.B
870e4e68f86Sxiaofeibao
871e9f7c490SXuan Hu  private val isCboClean = CBO_CLEAN === io.enq.ctrlFlow.instr
872e9f7c490SXuan Hu  private val isCboFlush = CBO_FLUSH === io.enq.ctrlFlow.instr
873e9f7c490SXuan Hu  private val isCboInval = CBO_INVAL === io.enq.ctrlFlow.instr
874e9f7c490SXuan Hu  private val isCboZero  = CBO_ZERO  === io.enq.ctrlFlow.instr
875e9f7c490SXuan Hu
8769c13e962Slin zhida  // Note that rnum of aes64ks1i must be in the range 0x0..0xA. The values 0xB..0xF are reserved.
8779c13e962Slin zhida  private val isAes64ks1iIllegal =
8789c13e962Slin zhida    FuType.FuTypeOrR(decodedInst.fuType, FuType.bku) && (decodedInst.fuOpType === BKUOpType.aes64ks1i) && inst.isRnumIllegal
8799c13e962Slin zhida
88012861ac7Slinzhida  private val isAmocasQ = FuType.FuTypeOrR(decodedInst.fuType, FuType.mou) && decodedInst.fuOpType === LSUOpType.amocas_q
88112861ac7Slinzhida  private val isAmocasQIllegal = isAmocasQ && (inst.RD(0) === 1.U || inst.RS2(0) === 1.U)
88212861ac7Slinzhida
88315ed99a7SXuan Hu  private val exceptionII =
88415ed99a7SXuan Hu    decodedInst.selImm === SelImm.INVALID_INSTR ||
88515ed99a7SXuan Hu    io.fromCSR.illegalInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence  ||
88615ed99a7SXuan Hu    io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
88715ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g ||
88815ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v ||
88915ed99a7SXuan Hu    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
8908b7dc6f5SsinceforYy    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
89100cefdffSXuan Hu    io.fromCSR.illegalInst.fsIsOff    && (
89200cefdffSXuan Hu      FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) ||
89313168c60Slinzhida      (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lh || decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) ||
89413168c60Slinzhida      FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sh || decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) ||
89500cefdffSXuan Hu      inst.isOPFVF || inst.isOPFVV
89600cefdffSXuan Hu    ) ||
897b50a88ecSXuan Hu    io.fromCSR.illegalInst.vsIsOff    && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) ||
898689f6b88SsinceforYy    io.fromCSR.illegalInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType) ||
8996520f4f4STang Haojin    io.fromCSR.illegalInst.wrs_nto    && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWrsNto(decodedInst.fuOpType) ||
900689f6b88SsinceforYy    (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)) ||
901e9f7c490SXuan Hu    (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm ||
902*7eb878b5SAnzo    (io.fromCSR.illegalInst.cboZ  || !HasCMO.B) && isCboZero ||
903*7eb878b5SAnzo    (io.fromCSR.illegalInst.cboCF || !HasCMO.B) && (isCboClean || isCboFlush) ||
904*7eb878b5SAnzo    (io.fromCSR.illegalInst.cboI  || !HasCMO.B) && isCboInval ||
90512861ac7Slinzhida    isAes64ks1iIllegal ||
90612861ac7Slinzhida    isAmocasQIllegal
90715ed99a7SXuan Hu
90815ed99a7SXuan Hu  private val exceptionVI =
90915ed99a7SXuan Hu    io.fromCSR.virtualInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence ||
91015ed99a7SXuan Hu    io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
91115ed99a7SXuan Hu    io.fromCSR.virtualInst.hfence     && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) ||
91215ed99a7SXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
913b50a88ecSXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
914e9f7c490SXuan Hu    io.fromCSR.virtualInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType) ||
9156520f4f4STang Haojin    io.fromCSR.virtualInst.wrs_nto    && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWrsNto(decodedInst.fuOpType) ||
916e9f7c490SXuan Hu    io.fromCSR.virtualInst.cboZ       && isCboZero ||
917e9f7c490SXuan Hu    io.fromCSR.virtualInst.cboCF      && (isCboClean || isCboFlush) ||
918e9f7c490SXuan Hu    io.fromCSR.virtualInst.cboI       && isCboInval
919e9f7c490SXuan Hu
92015ed99a7SXuan Hu
9215a9dd560SXuan Hu  decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II)
92215ed99a7SXuan Hu  decodedInst.exceptionVec(virtualInstr) := exceptionVI
923d0de7e4aSpeixiaokun
9247e0f64b0SGuanghui Cheng  //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry.
9257e0f64b0SGuanghui Cheng  decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger)
9267e0f64b0SGuanghui Cheng
9273b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
928b0ae3ac4SLinJiawei    x => {
9297ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
930b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
931b0ae3ac4SLinJiawei      x._1 -> minBits
932b0ae3ac4SLinJiawei    }
933b0ae3ac4SLinJiawei  ))
934aac4464eSYinan Xu
9357531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
93699f369f9Sxiaofeibao-xjtu  private val isVls = inst.isVecStore || inst.isVecLoad
9377531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
9387531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
9397531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
9407531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
9417531c765SXuan Hu
9427531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
94375e2c883SXuan Hu
94475e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
945be25371aSYikeZhou
9460bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
94739c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
94839c388b5SXuan Hu  private val narrowInsts = Seq(
94939c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
95039c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
95139c388b5SXuan Hu  )
95239c388b5SXuan Hu  private val maskDstInsts = Seq(
95339c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
95439c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
95539c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
9569eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
9579eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
9589eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
9599eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
960f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
96139c388b5SXuan Hu  )
96230fcc710SZiyue Zhang  private val maskOpInsts = Seq(
96330fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
96430fcc710SZiyue Zhang  )
96594e6af68SZiyue-Zhang  private val vmaInsts = Seq(
96694e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
96794e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
96894e6af68SZiyue-Zhang  )
969bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
970bdda74fdSxiaofeibao-xjtu    // opfff
971614d2bc6SHeiHuDie    FADD_S, FSUB_S, FADD_D, FSUB_D, FADD_H, FSUB_H,
972614d2bc6SHeiHuDie    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, FEQ_H, FLT_H, FLE_H,
973614d2bc6SHeiHuDie    FMIN_S, FMAX_S, FMIN_D, FMAX_D, FMIN_H, FMAX_H,
974614d2bc6SHeiHuDie    FMUL_S, FMUL_D, FMUL_H,
975614d2bc6SHeiHuDie    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, FDIV_H, FSQRT_H,
976614d2bc6SHeiHuDie    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, FMADD_H, FMSUB_H, FNMADD_H, FNMSUB_H,
977614d2bc6SHeiHuDie    FSGNJ_S, FSGNJN_S, FSGNJX_S, FSGNJ_H, FSGNJN_H, FSGNJX_H,
978bdda74fdSxiaofeibao-xjtu    // opfvv
979bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
980bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
981bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
982bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
983bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
984bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
985bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
986bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
987bdda74fdSxiaofeibao-xjtu    // opfvf
988bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
989bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
990bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
991bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
992bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
993bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
994bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
995aab8ef9cSxiaofeibao-xjtu    // vfred
996aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
997bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
998bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
999bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
1000bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
1001bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
1002b189aafaSzmx    FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H,
1003614d2bc6SHeiHuDie    FCVT_H_W, FCVT_H_WU, FCVT_H_L, FCVT_H_LU,
1004614d2bc6SHeiHuDie    FCVT_W_H, FCVT_WU_H, FCVT_L_H, FCVT_LU_H,
1005ba899681Schengguanghui    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,
1006ba899681Schengguanghui    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,
1007ba899681Schengguanghui    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,
1008ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
100920b2b626SsinceforYy    // zfa
101020b2b626SsinceforYy    FLEQ_H, FLEQ_S, FLEQ_D, FLTQ_H, FLTQ_S, FLTQ_D,
101120b2b626SsinceforYy    FMINM_H, FMINM_S, FMINM_D, FMAXM_H, FMAXM_S, FMAXM_D,
101220b2b626SsinceforYy    FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D,
101320b2b626SsinceforYy    FCVTMOD_W_D,
1014bdda74fdSxiaofeibao-xjtu  )
1015689f6b88SsinceforYy
1016689f6b88SsinceforYy  private val scalaNeedFrmInsts = Seq(
1017614d2bc6SHeiHuDie    FADD_S, FSUB_S, FADD_D, FSUB_D, FADD_H, FSUB_H,
1018689f6b88SsinceforYy    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
1019689f6b88SsinceforYy    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
1020614d2bc6SHeiHuDie    FCVT_W_H, FCVT_WU_H, FCVT_L_H, FCVT_LU_H,
1021614d2bc6SHeiHuDie    FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H,
102220b2b626SsinceforYy    FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D,
1023689f6b88SsinceforYy  )
1024689f6b88SsinceforYy
1025689f6b88SsinceforYy  private val vectorNeedFrmInsts = Seq (
1026689f6b88SsinceforYy    VFSLIDE1UP_VF, VFSLIDE1DOWN_VF,
1027689f6b88SsinceforYy  )
1028689f6b88SsinceforYy
1029bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
1030689f6b88SsinceforYy  decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
1031689f6b88SsinceforYy  decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
10323b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
103375e2c883SXuan Hu  decodedInst.vpu.vill := io.enq.vtype.illegal
103475e2c883SXuan Hu  decodedInst.vpu.vma := io.enq.vtype.vma
103575e2c883SXuan Hu  decodedInst.vpu.vta := io.enq.vtype.vta
103675e2c883SXuan Hu  decodedInst.vpu.vsew := io.enq.vtype.vsew
103775e2c883SXuan Hu  decodedInst.vpu.vlmul := io.enq.vtype.vlmul
103875e2c883SXuan Hu  decodedInst.vpu.vm := inst.VM
103975e2c883SXuan Hu  decodedInst.vpu.nf := inst.NF
1040d9355d3aSZiyue-Zhang  decodedInst.vpu.veew := inst.WIDTH
104194e7468cSXuan Hu  decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
104239c388b5SXuan Hu  decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
1043b6279fc6SZiyue Zhang  val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
1044b6279fc6SZiyue Zhang  val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
1045b6279fc6SZiyue Zhang  val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
104672090f4cSZiyue Zhang  val isVload = FuType.isVLoad(decodedInst.fuType)
104772090f4cSZiyue Zhang  val isVlx = isVload && (decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe)
104872090f4cSZiyue Zhang  val isVle = isVload && (decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse)
104972090f4cSZiyue Zhang  val isVlm = isVload && (decodedInst.fuOpType === VlduType.vlm)
105072090f4cSZiyue Zhang  val isFof = isVload && (decodedInst.fuOpType === VlduType.vleff)
105181229133SZiyue Zhang  val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV || decodedInst.uopSplitType === UopSplitType.VEC_VWW
105294e6af68SZiyue-Zhang  val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
1053dab1ad8cSsinsanction  val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew
105472090f4cSZiyue Zhang  val vstartIsNotZero = io.enq.vstart =/= 0.U
1055b6279fc6SZiyue Zhang  decodedInst.vpu.isNarrow := isNarrow
1056b6279fc6SZiyue Zhang  decodedInst.vpu.isDstMask := isDstMask
1057b6279fc6SZiyue Zhang  decodedInst.vpu.isOpMask := isOpMask
105872090f4cSZiyue Zhang  decodedInst.vpu.isDependOldVd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma || isFof || vstartIsNotZero
1059dab1ad8cSsinsanction  decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac
10605110577fSZiyue Zhang  decodedInst.vpu.vstart := io.enq.vstart
106172090f4cSZiyue Zhang  decodedInst.vpu.isVleff := isFof && inst.NF === 0.U
106206f0a37aSZiyue Zhang  decodedInst.vpu.specVill := io.enq.vtype.illegal
106306f0a37aSZiyue Zhang  decodedInst.vpu.specVma := io.enq.vtype.vma
106406f0a37aSZiyue Zhang  decodedInst.vpu.specVta := io.enq.vtype.vta
106506f0a37aSZiyue Zhang  decodedInst.vpu.specVsew := io.enq.vtype.vsew
106606f0a37aSZiyue Zhang  decodedInst.vpu.specVlmul := io.enq.vtype.vlmul
106775e2c883SXuan Hu
106831c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
106931c51290Szhanglinjuan
10701d72fb53Sxiaofeibao  decodedInst.srcType(3) := Mux(inst.VM === 0.U, SrcType.vp, SrcType.DC) // mask src
10711d72fb53Sxiaofeibao  decodedInst.srcType(4) := SrcType.vp // vconfig
10726d56ac16Ssinsanction
10737f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
107499f369f9Sxiaofeibao-xjtu  uopInfoGen.io.in.preInfo.isVecArith := inst.isVecArith
107599f369f9Sxiaofeibao-xjtu  uopInfoGen.io.in.preInfo.isVecMem := inst.isVecStore || inst.isVecLoad
107699f369f9Sxiaofeibao-xjtu  uopInfoGen.io.in.preInfo.isAmoCAS := inst.isAMOCAS
107799f369f9Sxiaofeibao-xjtu
107887dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
107987dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
108006cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
108187dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
10820a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
1083c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
108406cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
1085c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
10867f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
10879fabe323SZiyue Zhang  io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop
10883235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
10897f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
10907f9f0a79SzhanglyGit
1091a9becb0dSJunxiong Ji  val isCsr = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U
1092a9becb0dSJunxiong Ji  val isCsrr = isCsr && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U
1093a9becb0dSJunxiong Ji  val isCsrw = isCsr && inst.FUNCT3 === BitPat("b?01") && inst.RD  === 0.U
1094a9becb0dSJunxiong Ji  dontTouch(isCsrr)
1095a9becb0dSJunxiong Ji  dontTouch(isCsrw)
1096cc1eb70dSXuan Hu
109787c5d21dSZiyue Zhang  // for csrr vl instruction, convert to vsetvl
1098a9becb0dSJunxiong Ji  val isCsrrVlenb = isCsrr && inst.CSRIDX === CSRs.vlenb.U
1099a9becb0dSJunxiong Ji  val isCsrrVl    = isCsrr && inst.CSRIDX === CSRs.vl.U
1100cc1eb70dSXuan Hu
1101ac17908cSHuijin Li  // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i)
1102ac17908cSHuijin Li  val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U
1103ac17908cSHuijin Li  val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W)
1104ac17908cSHuijin Li  val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W)
1105ac17908cSHuijin Li  val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W)
1106ac17908cSHuijin Li
110720b2b626SsinceforYy  // for fli.s|fli.d instruction
110820b2b626SsinceforYy  val isFLI = inst.FUNCT7 === BitPat("b11110??") && inst.RS2 === 1.U && inst.RM === 0.U && inst.OPCODE5Bit === OPCODE5Bit.OP_FP
110920b2b626SsinceforYy
111087c5d21dSZiyue Zhang  when (isCsrrVl) {
111163cb3754SZiyue Zhang    // convert to vsetvl instruction
111287c5d21dSZiyue Zhang    decodedInst.srcType(0) := SrcType.no
111387c5d21dSZiyue Zhang    decodedInst.srcType(1) := SrcType.no
111487c5d21dSZiyue Zhang    decodedInst.srcType(2) := SrcType.no
111587c5d21dSZiyue Zhang    decodedInst.srcType(3) := SrcType.no
111687c5d21dSZiyue Zhang    decodedInst.srcType(4) := SrcType.vp
111787c5d21dSZiyue Zhang    decodedInst.lsrc(4)    := Vl_IDX.U
111863cb3754SZiyue Zhang    decodedInst.waitForward   := false.B
111987c5d21dSZiyue Zhang    decodedInst.blockBackward := false.B
11208c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
112163cb3754SZiyue Zhang  }.elsewhen (isCsrrVlenb) {
112263cb3754SZiyue Zhang    // convert to addi instruction
1123828a8a48SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1124828a8a48SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
112563cb3754SZiyue Zhang    decodedInst.srcType(2) := SrcType.no
112663cb3754SZiyue Zhang    decodedInst.srcType(3) := SrcType.no
112763cb3754SZiyue Zhang    decodedInst.srcType(4) := SrcType.no
112863cb3754SZiyue Zhang    decodedInst.selImm := SelImm.IMM_I
112963cb3754SZiyue Zhang    decodedInst.waitForward := false.B
113063cb3754SZiyue Zhang    decodedInst.blockBackward := false.B
113163cb3754SZiyue Zhang    decodedInst.canRobCompress := true.B
11328c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
1133ac17908cSHuijin Li  }.elsewhen (isPreW || isPreR || isPreI) {
1134ac17908cSHuijin Li    decodedInst.selImm := SelImm.IMM_S
1135ac17908cSHuijin Li    decodedInst.fuType := FuType.ldu.U
1136ac17908cSHuijin Li    decodedInst.canRobCompress := false.B
1137499d2763SZiyue Zhang  }.elsewhen (isZimop) {
1138499d2763SZiyue Zhang    // set srcType for zimop
1139499d2763SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1140499d2763SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
1141499d2763SZiyue Zhang    // use x0 as src1
1142499d2763SZiyue Zhang    decodedInst.lsrc(0) := 0.U
114387c5d21dSZiyue Zhang  }
114487c5d21dSZiyue Zhang
114575e2c883SXuan Hu  io.deq.decodedInst := decodedInst
11469faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
1147985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
1148cc1eb70dSXuan Hu    // keep condition
1149cc1eb70dSXuan Hu    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType,
115087c5d21dSZiyue Zhang    (isCsrrVl) -> FuType.vsetfwf.U,
115163cb3754SZiyue Zhang    (isCsrrVlenb) -> FuType.alu.U,
1152cc1eb70dSXuan Hu
1153cc1eb70dSXuan Hu    // change vlsu to vseglsu when NF =/= 0.U
1154f94f6503SXuan 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,
1155f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
1156f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
1157f94f6503SXuan 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,
1158f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
1159f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
1160f94f6503SXuan 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,
1161985804e6SXuan Hu  ))
1162499d2763SZiyue Zhang  io.deq.decodedInst.imm := MuxCase(decodedInst.imm, Seq(
1163499d2763SZiyue Zhang    isCsrrVlenb -> (VLEN / 8).U,
1164499d2763SZiyue Zhang    isZimop     -> 0.U,
1165499d2763SZiyue Zhang  ))
1166cc1eb70dSXuan Hu
11674fe0a83eSXuan Hu  io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq(
1168cc1eb70dSXuan Hu    isCsrrVl    -> VSETOpType.csrrvl,
1169cc1eb70dSXuan Hu    isCsrrVlenb -> ALUOpType.add,
117020b2b626SsinceforYy    isFLI       -> Cat(1.U, inst.FMT, inst.RS1),
1171e9f7c490SXuan Hu    (isPreW || isPreR || isPreI) -> Mux1H(Seq(
1172e9f7c490SXuan Hu      isPreW -> LSUOpType.prefetch_w,
1173e9f7c490SXuan Hu      isPreR -> LSUOpType.prefetch_r,
1174e9f7c490SXuan Hu      isPreI -> LSUOpType.prefetch_i,
1175e9f7c490SXuan Hu    )),
1176e9f7c490SXuan Hu    (isCboInval && io.fromCSR.special.cboI2F) -> LSUOpType.cbo_flush,
11774fe0a83eSXuan Hu  ))
11784fe0a83eSXuan Hu
11792a4ac712SEaston Man  // Don't compress in the same Rob entry when crossing Ftq entry boundary
11802a4ac712SEaston Man  io.deq.decodedInst.canRobCompress := decodedInst.canRobCompress && !io.enq.ctrlFlow.isLastInFtqEntry
11812a4ac712SEaston Man
1182be25371aSYikeZhou  //-------------------------------------------------------------
1183be25371aSYikeZhou  // Debug Info
11843b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
11853b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
11863b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
11873b739f49SXuan 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",
11883b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
11893b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
11903b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
11913b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
11923b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
11933b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
11943b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
11953b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
1196be25371aSYikeZhou}
1197