xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision a9becb0d13cdadc7dadafb81ec3dbdeeefde3908)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
17be25371aSYikeZhoupackage xiangshan.backend.decode
18be25371aSYikeZhou
198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
20be25371aSYikeZhouimport chisel3._
21be25371aSYikeZhouimport chisel3.util._
22cc1eb70dSXuan Huimport freechips.rocketchip.rocket.CSRs
233b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._
24c2a2229dSlewislzhimport freechips.rocketchip.rocket.CustomInstructions._
256ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat
263c02ee8fSwakafaimport utility._
273b739f49SXuan Huimport utils._
285a9dd560SXuan Huimport xiangshan.ExceptionNO.{EX_II, breakPoint, illegalInstr, virtualInstr}
296ab6918fSYinan Xuimport xiangshan._
30730cfbc0SXuan Huimport xiangshan.backend.fu.FuType
31730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst}
321be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions
33cc1eb70dSXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, OPCODE5Bit, XSInstBitFields}
345110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl}
3515ed99a7SXuan Huimport xiangshan.backend.fu.wrapper.CSRToDecode
36499d2763SZiyue Zhangimport xiangshan.backend.decode.Zimop._
3720b2b626SsinceforYyimport yunsuan.{VfaluType, VfcvtType}
38be25371aSYikeZhou
39be25371aSYikeZhou/**
40be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
41be25371aSYikeZhou */
42be25371aSYikeZhouabstract trait DecodeConstants {
43361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
4457a10886SXuan Hu  def X = BitPat("b0")
454d24c305SYikeZhou  def N = BitPat("b0")
464d24c305SYikeZhou  def Y = BitPat("b1")
4757a10886SXuan Hu  def T = true
4857a10886SXuan Hu  def F = false
494d24c305SYikeZhou
50c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
5120e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
524d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
5357a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
5457a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
5557a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5657a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5757a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
5889cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  canRobCompress
5989cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  uopSplitType
6089cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  |             selImm
6189cc69c1STang Haojin    List(SrcType.X, SrcType.X, SrcType.X, FuType.X, FuOpType.X, N, N, N, N, N, N, N, N, UopSplitType.X, SelImm.INVALID_INSTR) // Use SelImm to indicate invalid instr
624d24c305SYikeZhou
6357a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
6457a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
65be25371aSYikeZhou}
66be25371aSYikeZhou
67c2a8ae00SYikeZhoutrait DecodeUnitConstants
684d24c305SYikeZhou{
694d24c305SYikeZhou  // abstract out instruction decode magic numbers
704d24c305SYikeZhou  val RD_MSB  = 11
714d24c305SYikeZhou  val RD_LSB  = 7
724d24c305SYikeZhou  val RS1_MSB = 19
734d24c305SYikeZhou  val RS1_LSB = 15
744d24c305SYikeZhou  val RS2_MSB = 24
754d24c305SYikeZhou  val RS2_LSB = 20
764d24c305SYikeZhou  val RS3_MSB = 31
774d24c305SYikeZhou  val RS3_LSB = 27
784d24c305SYikeZhou}
794d24c305SYikeZhou
80be25371aSYikeZhou/**
81be25371aSYikeZhou * Decoded control signals
824d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
83be25371aSYikeZhou */
84c2a8ae00SYikeZhou
8557a10886SXuan Huabstract class XSDecodeBase {
8657a10886SXuan Hu  def X = BitPat("b?")
8757a10886SXuan Hu  def N = BitPat("b0")
8857a10886SXuan Hu  def Y = BitPat("b1")
8957a10886SXuan Hu  def T = true
9057a10886SXuan Hu  def F = false
9157a10886SXuan Hu  def generate() : List[BitPat]
9257a10886SXuan Hu}
9357a10886SXuan Hu
9457a10886SXuan Hucase class XSDecode(
9557a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
96239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat,
97e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9857a10886SXuan Hu  xWen: Boolean = false,
9957a10886SXuan Hu  fWen: Boolean = false,
10057a10886SXuan Hu  vWen: Boolean = false,
10157a10886SXuan Hu  mWen: Boolean = false,
10257a10886SXuan Hu  xsTrap: Boolean = false,
10357a10886SXuan Hu  noSpec: Boolean = false,
10457a10886SXuan Hu  blockBack: Boolean = false,
10557a10886SXuan Hu  flushPipe: Boolean = false,
10689cc69c1STang Haojin  canRobCompress: Boolean = false,
10757a10886SXuan Hu) extends XSDecodeBase {
10857a10886SXuan Hu  def generate() : List[BitPat] = {
10989cc69c1STang Haojin    List (src1, src2, src3, BitPat(fu.U(FuType.num.W)), fuOp, xWen.B, fWen.B, (vWen || mWen).B, xsTrap.B, noSpec.B, blockBack.B, flushPipe.B, canRobCompress.B, uopSplitType, selImm)
11057a10886SXuan Hu  }
11157a10886SXuan Hu}
11257a10886SXuan Hu
11357a10886SXuan Hucase class FDecode(
11457a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
115239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X,
11617ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
11757a10886SXuan Hu  xWen: Boolean = false,
11857a10886SXuan Hu  fWen: Boolean = false,
11957a10886SXuan Hu  vWen: Boolean = false,
12057a10886SXuan Hu  mWen: Boolean = false,
12157a10886SXuan Hu  xsTrap: Boolean = false,
12257a10886SXuan Hu  noSpec: Boolean = false,
12357a10886SXuan Hu  blockBack: Boolean = false,
12457a10886SXuan Hu  flushPipe: Boolean = false,
12589cc69c1STang Haojin  canRobCompress: Boolean = false,
12657a10886SXuan Hu) extends XSDecodeBase {
12757a10886SXuan Hu  def generate() : List[BitPat] = {
12889cc69c1STang Haojin    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate()
12957a10886SXuan Hu  }
13057a10886SXuan Hu}
13157a10886SXuan Hu
132be25371aSYikeZhou/**
133be25371aSYikeZhou * Overall Decode constants
134be25371aSYikeZhou */
135be25371aSYikeZhouobject XDecode extends DecodeConstants {
13657a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
137768f5f91SYangyu Chen    // RV32I
13857a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
13957a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
14057a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
14157a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
14257a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
14357a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
14457a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
14557a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
14689cc69c1STang Haojin    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T),
14789cc69c1STang Haojin    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T),
14889cc69c1STang Haojin    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T),
14989cc69c1STang Haojin    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T, canRobCompress = T),
15089cc69c1STang Haojin    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T),
15189cc69c1STang Haojin    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T),
15289cc69c1STang Haojin    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T),
15389cc69c1STang Haojin    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T, canRobCompress = T),
15489cc69c1STang Haojin    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T, canRobCompress = T),
15589cc69c1STang Haojin    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T, canRobCompress = T),
15689cc69c1STang Haojin    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T, canRobCompress = T),
15789cc69c1STang Haojin    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T, canRobCompress = T),
15889cc69c1STang Haojin    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T, canRobCompress = T),
15989cc69c1STang Haojin    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T, canRobCompress = T),
16089cc69c1STang Haojin    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T, canRobCompress = T),
16189cc69c1STang Haojin    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T, canRobCompress = T),
16289cc69c1STang Haojin    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T, canRobCompress = T),
1634d24c305SYikeZhou
164768f5f91SYangyu Chen    // RV64I (extend from RV32I)
165768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
166768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
167768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
168768f5f91SYangyu Chen
169768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
170768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
171768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
172768f5f91SYangyu Chen
173768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
174768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
175768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
176768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
177768f5f91SYangyu Chen
178768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
179768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
180768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
181768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
182768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
183768f5f91SYangyu Chen
184768f5f91SYangyu Chen    // RV64M
18589cc69c1STang Haojin    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T, canRobCompress = T),
18689cc69c1STang Haojin    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T, canRobCompress = T),
18789cc69c1STang Haojin    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T),
18889cc69c1STang Haojin    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T),
18989cc69c1STang Haojin    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T, canRobCompress = T),
1904d24c305SYikeZhou
19189cc69c1STang Haojin    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T, canRobCompress = T),
19289cc69c1STang Haojin    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T, canRobCompress = T),
19389cc69c1STang Haojin    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T, canRobCompress = T),
19489cc69c1STang Haojin    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T, canRobCompress = T),
19589cc69c1STang Haojin    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T, canRobCompress = T),
19689cc69c1STang Haojin    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T),
19789cc69c1STang Haojin    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T, canRobCompress = T),
19889cc69c1STang Haojin    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T),
1994d24c305SYikeZhou
200f7af4c74Schengguanghui    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
20157a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
2025110577fSZiyue Zhang    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T),
2033b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
2043b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
2053b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2063b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2073b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2083b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2094d24c305SYikeZhou
210768f5f91SYangyu Chen    // System, the immediate12 holds the CSR register.
21140ac5bb1SXuan Hu
212fa16cf81Slewislzh    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
213fa16cf81Slewislzh    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
214fa16cf81Slewislzh    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2154d24c305SYikeZhou
21657a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21757a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21857a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2194d24c305SYikeZhou
22057a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22157a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22257a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22357a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
224c2a2229dSlewislzh    MNRET   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22557a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22657a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2274d24c305SYikeZhou
22857a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22957a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
23057a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2314d24c305SYikeZhou
232768f5f91SYangyu Chen    // RV64A
23357a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23457a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23557a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23657a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23757a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23857a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23957a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24057a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24157a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2424d24c305SYikeZhou
24357a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24457a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24557a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24757a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24857a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24957a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25057a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25157a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2524d24c305SYikeZhou
25357a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25457a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25557a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25657a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
257768f5f91SYangyu Chen  )
258768f5f91SYangyu Chen}
259ee8ff153Szfw
260768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
261768f5f91SYangyu Chen  /*
262768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
263768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
264768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
265768f5f91SYangyu Chen   */
266768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
267768f5f91SYangyu Chen    // Zba
268768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
269768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
270768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
271768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
272768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
273768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
274768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
275768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
276768f5f91SYangyu Chen
277768f5f91SYangyu Chen    // Zbb
27889cc69c1STang Haojin    ANDN      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn    , SelImm.X    , xWen = T, canRobCompress = T),
27989cc69c1STang Haojin    ORN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn     , SelImm.X    , xWen = T, canRobCompress = T),
28089cc69c1STang Haojin    XNOR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor    , SelImm.X    , xWen = T, canRobCompress = T),
281ee8ff153Szfw
282768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
283768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
284768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
285768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
286768f5f91SYangyu Chen
287768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
288768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
289768f5f91SYangyu Chen
29089cc69c1STang Haojin    MAX       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max     , SelImm.X    , xWen = T, canRobCompress = T),
29189cc69c1STang Haojin    MAXU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu    , SelImm.X    , xWen = T, canRobCompress = T),
292768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
293768f5f91SYangyu Chen    MINU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu    , SelImm.X    , xWen = T, canRobCompress = T),
294ee8ff153Szfw
29589cc69c1STang Haojin    SEXT_B    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb   , SelImm.X    , xWen = T, canRobCompress = T),
29689cc69c1STang Haojin    SEXT_H    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth   , SelImm.X    , xWen = T, canRobCompress = T),
297768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
298768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
299ee8ff153Szfw
300768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
301768f5f91SYangyu Chen    ROLW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw    , SelImm.X    , xWen = T, canRobCompress = T),
30289cc69c1STang Haojin    ROR       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.X    , xWen = T, canRobCompress = T),
30389cc69c1STang Haojin    RORI      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.IMM_I, xWen = T, canRobCompress = T),
304768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
305768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
306ee8ff153Szfw
307768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
308768f5f91SYangyu Chen
309768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
310768f5f91SYangyu Chen
311768f5f91SYangyu Chen    // Zbc
312768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
313768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
314768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
315768f5f91SYangyu Chen
316768f5f91SYangyu Chen    // Zbs
317768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
318768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
319768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
320768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
321768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
322768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
323768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
324768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
325768f5f91SYangyu Chen
326768f5f91SYangyu Chen    // Zbkb
327768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
328768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
329768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
330768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
331768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
332768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
333768f5f91SYangyu Chen
334768f5f91SYangyu Chen    // Zbkc
335768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
336768f5f91SYangyu Chen
337768f5f91SYangyu Chen    // Zbkx
338768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
339768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
340768f5f91SYangyu Chen  )
341768f5f91SYangyu Chen}
342768f5f91SYangyu Chen
343768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
344768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
345768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
346768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
347768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
348768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
349768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
350768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
351768f5f91SYangyu Chen
352768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
353768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
354768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
355768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
356768f5f91SYangyu Chen
357768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
358768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
359768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
360768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
361768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
362768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
363768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
364768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
365768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
366768f5f91SYangyu Chen
367768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
368768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
369768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
370768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
371768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
372768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
373768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
374768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
375768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
376768f5f91SYangyu Chen
377768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
378768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
379768f5f91SYangyu Chen    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1     , SelImm.X    , xWen = T, canRobCompress = T),
3804d24c305SYikeZhou  )
381be25371aSYikeZhou}
382be25371aSYikeZhou
383be25371aSYikeZhou/**
384be25371aSYikeZhou * FP Decode constants
385be25371aSYikeZhou */
38657a10886SXuan Huobject FpDecode extends DecodeConstants{
38757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
388b189aafaSzmx    FLH     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T),
38957a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
39057a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
391b189aafaSzmx    FSH     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S          ),
39257a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
39357a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3944d24c305SYikeZhou
395964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
396964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
397b189aafaSzmx    FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T),
398c2a8ae00SYikeZhou
3994d24c305SYikeZhou    // Int to FP
40089cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40189cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40289cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40389cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4044d24c305SYikeZhou
40589cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40689cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40789cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40889cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4094d24c305SYikeZhou
4104d24c305SYikeZhou  )
411be25371aSYikeZhou}
412be25371aSYikeZhou
413be25371aSYikeZhou/**
414be25371aSYikeZhou * FP Divide SquareRoot Constants
415be25371aSYikeZhou */
416be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
41757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
41889cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41989cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
42089cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
42189cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4224d24c305SYikeZhou  )
423be25371aSYikeZhou}
424be25371aSYikeZhou
4254d24c305SYikeZhou/**
426af2f7849Shappy-lx * Svinval extension Constants
427af2f7849Shappy-lx */
428af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
42957a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
430af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
431af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
432af2f7849Shappy-lx     */
43357a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
434af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
435af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
436af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
437af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
438af2f7849Shappy-lx     */
43957a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
440af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
441af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
442af2f7849Shappy-lx     * then dispatch and issue this instrucion
443af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
444af2f7849Shappy-lx     */
44557a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
446af2f7849Shappy-lx    /* what is Svinval extension ?
447af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
448af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
449af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
450af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
451af2f7849Shappy-lx     *
452af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
453af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
454af2f7849Shappy-lx     */
455af2f7849Shappy-lx  )
456af2f7849Shappy-lx}
45757a10886SXuan Hu
458af2f7849Shappy-lx/*
459ca18a0b4SWilliam Wang * CBO decode
460ca18a0b4SWilliam Wang */
461ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
46257a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
46357a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
46457a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
46557a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
46657a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
467ca18a0b4SWilliam Wang  )
468ca18a0b4SWilliam Wang}
469ca18a0b4SWilliam Wang
470d0de7e4aSpeixiaokun/*
471d0de7e4aSpeixiaokun * Hypervisor decode
472d0de7e4aSpeixiaokun */
473d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
474e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
475e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
476e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
477e25e4d90SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X),
478e25e4d90SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X),
479e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
480e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
481e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
482e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
483e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
484e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
485e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
486e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
487e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
488e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
489e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
490e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
491e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
492d0de7e4aSpeixiaokun  )
493d0de7e4aSpeixiaokun}
494d0de7e4aSpeixiaokun
495545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
496545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
497545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
498545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
499545d7be0SYangyu Chen  )
500545d7be0SYangyu Chen}
501545d7be0SYangyu Chen
502ca18a0b4SWilliam Wang/**
503499d2763SZiyue Zhang  * "Zimop" Extension for May-Be-Operations
504499d2763SZiyue Zhang  */
505499d2763SZiyue Zhangobject ZimopDecode extends DecodeConstants {
506499d2763SZiyue Zhang  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
507499d2763SZiyue Zhang    // temp use addi to decode MOP_R and MOP_RR
508499d2763SZiyue Zhang    MOP_R  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
509499d2763SZiyue Zhang    MOP_RR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
510499d2763SZiyue Zhang  )
511499d2763SZiyue Zhang}
512499d2763SZiyue Zhang
51320b2b626SsinceforYyobject ZfaDecode extends DecodeConstants {
51420b2b626SsinceforYy  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
51520b2b626SsinceforYy    FLI_H       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
51620b2b626SsinceforYy    FLI_S       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
51720b2b626SsinceforYy    FLI_D       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
51820b2b626SsinceforYy    FMINM_H     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
51920b2b626SsinceforYy    FMINM_S     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
52020b2b626SsinceforYy    FMINM_D     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
52120b2b626SsinceforYy    FMAXM_H     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
52220b2b626SsinceforYy    FMAXM_S     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
52320b2b626SsinceforYy    FMAXM_D     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
52420b2b626SsinceforYy    FROUND_H    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
52520b2b626SsinceforYy    FROUND_S    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
52620b2b626SsinceforYy    FROUND_D    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
52720b2b626SsinceforYy    FROUNDNX_H  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
52820b2b626SsinceforYy    FROUNDNX_S  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
52920b2b626SsinceforYy    FROUNDNX_D  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
53020b2b626SsinceforYy    FCVTMOD_W_D -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fcvtmod_w_d, xWen = T, canRobCompress = T),
53120b2b626SsinceforYy    FLEQ_H      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
53220b2b626SsinceforYy    FLEQ_S      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
53320b2b626SsinceforYy    FLEQ_D      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
53420b2b626SsinceforYy    FLTQ_H      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
53520b2b626SsinceforYy    FLTQ_S      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
53620b2b626SsinceforYy    FLTQ_D      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
53720b2b626SsinceforYy  )
53820b2b626SsinceforYy}
53920b2b626SsinceforYy
540499d2763SZiyue Zhang/**
5414d24c305SYikeZhou * XiangShan Trap Decode constants
5424d24c305SYikeZhou */
5434d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
544361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
54557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
54657a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
5474d24c305SYikeZhou  )
5484d24c305SYikeZhou}
549be25371aSYikeZhou
55049f433deSXuan Huabstract class Imm(val len: Int) {
551b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
552b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
553b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
554b0ae3ac4SLinJiawei}
555b0ae3ac4SLinJiawei
556b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
557fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
558b0ae3ac4SLinJiawei
559b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
560b0ae3ac4SLinJiawei    Cat(instr(31, 20))
561b0ae3ac4SLinJiawei}
562b0ae3ac4SLinJiawei
563b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
564b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
565b0ae3ac4SLinJiawei
566b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
567b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
568b0ae3ac4SLinJiawei}
569b0ae3ac4SLinJiawei
570b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
571b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
572b0ae3ac4SLinJiawei
573b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
574b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
575b0ae3ac4SLinJiawei}
576b0ae3ac4SLinJiawei
577b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
578fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
579b0ae3ac4SLinJiawei
580b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
581b0ae3ac4SLinJiawei    instr(31, 12)
582c2a8ae00SYikeZhou  }
583c2a8ae00SYikeZhou}
584c2a8ae00SYikeZhou
585b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
586b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
587b0ae3ac4SLinJiawei
588b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
589b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
590b0ae3ac4SLinJiawei  }
591b0ae3ac4SLinJiawei}
592b0ae3ac4SLinJiawei
593fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){
594b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
595b0ae3ac4SLinJiawei
596b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
597fa16cf81Slewislzh    Cat(instr(11, 7), instr(19, 15), instr(31, 20))
598b0ae3ac4SLinJiawei  }
59992c61038SXuan Hu
60092c61038SXuan Hu  def getCSRAddr(imm: UInt): UInt = {
60192c61038SXuan Hu    require(imm.getWidth == this.len)
60292c61038SXuan Hu    imm(11, 0)
60392c61038SXuan Hu  }
60492c61038SXuan Hu
60592c61038SXuan Hu  def getRS1(imm: UInt): UInt = {
60692c61038SXuan Hu    require(imm.getWidth == this.len)
60792c61038SXuan Hu    imm(16, 12)
60892c61038SXuan Hu  }
60992c61038SXuan Hu
61092c61038SXuan Hu  def getRD(imm: UInt): UInt = {
61192c61038SXuan Hu    require(imm.getWidth == this.len)
61292c61038SXuan Hu    imm(21, 17)
61392c61038SXuan Hu  }
61492c61038SXuan Hu
61592c61038SXuan Hu  def getImm5(imm: UInt): UInt = {
61692c61038SXuan Hu    require(imm.getWidth == this.len)
61792c61038SXuan Hu    imm(16, 12)
61892c61038SXuan Hu  }
619b0ae3ac4SLinJiawei}
620b0ae3ac4SLinJiawei
621ee8ff153Szfwcase class Imm_B6() extends Imm(6){
622ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
623ee8ff153Szfw
624ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
625ee8ff153Szfw    instr(25, 20)
626ee8ff153Szfw  }
627ee8ff153Szfw}
628ee8ff153Szfw
62958c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
63058c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
63158c35d23Shuxuan0307
63258c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
63358c35d23Shuxuan0307    instr(19, 15)
63458c35d23Shuxuan0307  }
63558c35d23Shuxuan0307}
636b52d4755SXuan Hu
63758c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
63858c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
63958c35d23Shuxuan0307
64058c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
64158c35d23Shuxuan0307    instr(19, 15)
64258c35d23Shuxuan0307  }
64358c35d23Shuxuan0307}
644b52d4755SXuan Hu
6454aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
6464aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6474aa9ed34Sfdy
6484aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6494aa9ed34Sfdy    instr(30, 20)
6504aa9ed34Sfdy  }
651e6ac7fe1SZiyue Zhang  /**
652e6ac7fe1SZiyue Zhang    * get VType from extended imm
653e6ac7fe1SZiyue Zhang    * @param extedImm
654e6ac7fe1SZiyue Zhang    * @return VType
655e6ac7fe1SZiyue Zhang    */
656e6ac7fe1SZiyue Zhang  def getVType(extedImm: UInt): InstVType = {
657e6ac7fe1SZiyue Zhang    val vtype = Wire(new InstVType)
658e6ac7fe1SZiyue Zhang    vtype := extedImm(10, 0).asTypeOf(new InstVType)
659e6ac7fe1SZiyue Zhang    vtype
660e6ac7fe1SZiyue Zhang  }
6614aa9ed34Sfdy}
662b52d4755SXuan Hu
663e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){
6644aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6654aa9ed34Sfdy
6664aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6675c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
668b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
669e6ac7fe1SZiyue Zhang    val vtype8 = rvInst.ZIMM_VSETIVLI
670b52d4755SXuan Hu    Cat(uimm5, vtype8)
671b52d4755SXuan Hu  }
672b52d4755SXuan Hu  /**
673b52d4755SXuan Hu    * get VType from extended imm
674b52d4755SXuan Hu    * @param extedImm
675b52d4755SXuan Hu    * @return VType
676b52d4755SXuan Hu    */
677b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
678b52d4755SXuan Hu    val vtype = Wire(new InstVType)
679e6ac7fe1SZiyue Zhang    vtype := extedImm(9, 0).asTypeOf(new InstVType)
680b52d4755SXuan Hu    vtype
681b52d4755SXuan Hu  }
682b52d4755SXuan Hu
683b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
684e6ac7fe1SZiyue Zhang    extedImm(14, 10)
6854aa9ed34Sfdy  }
6864aa9ed34Sfdy}
687fe528fd6Ssinsanction
688fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
689fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
690fe528fd6Ssinsanction
691fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
692fe528fd6Ssinsanction    instr(31, 0)
693fe528fd6Ssinsanction  }
694fe528fd6Ssinsanction}
695fe528fd6Ssinsanction
6967e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
6977e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
6987e30d16cSZhaoyang You
6997e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
7007e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
7017e30d16cSZhaoyang You  }
7027e30d16cSZhaoyang You}
7037e30d16cSZhaoyang You
704b0ae3ac4SLinJiaweiobject ImmUnion {
705b0ae3ac4SLinJiawei  val I = Imm_I()
706b0ae3ac4SLinJiawei  val S = Imm_S()
707b0ae3ac4SLinJiawei  val B = Imm_B()
708b0ae3ac4SLinJiawei  val U = Imm_U()
709b0ae3ac4SLinJiawei  val J = Imm_J()
710b0ae3ac4SLinJiawei  val Z = Imm_Z()
711ee8ff153Szfw  val B6 = Imm_B6()
71258c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
71358c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
7144aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
7154aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
716fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
7177e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
7184aa9ed34Sfdy
719520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
7207e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
721b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
722b0ae3ac4SLinJiawei  val immSelMap = Seq(
723b0ae3ac4SLinJiawei    SelImm.IMM_I,
724b0ae3ac4SLinJiawei    SelImm.IMM_S,
725b0ae3ac4SLinJiawei    SelImm.IMM_SB,
726b0ae3ac4SLinJiawei    SelImm.IMM_U,
727b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
728ee8ff153Szfw    SelImm.IMM_Z,
72958c35d23Shuxuan0307    SelImm.IMM_B6,
73058c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
7314aa9ed34Sfdy    SelImm.IMM_OPIVIU,
7324aa9ed34Sfdy    SelImm.IMM_VSETVLI,
733fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
7347e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
735b0ae3ac4SLinJiawei  ).zip(imms)
736b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
737b0ae3ac4SLinJiawei}
738b0ae3ac4SLinJiawei
739fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
740fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
741fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
742765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
743fd7603d9SYinan Xu  }
7443b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
745fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
7463b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
747f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
748fd7603d9SYinan Xu  }
749fd7603d9SYinan Xu}
750b0ae3ac4SLinJiawei
751be25371aSYikeZhou/**
752be25371aSYikeZhou * IO bundle for the Decode unit
753be25371aSYikeZhou */
754aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
755aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
756aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
757aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
758aaa08c5aSxiaofeibao-xjtu}
7592225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
7603b739f49SXuan Hu  val enq = new Bundle {
7613b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
762d91483a6Sfdy    val vtype = Input(new VType)
7635110577fSZiyue Zhang    val vstart = Input(Vl())
7644aa9ed34Sfdy  }
7653b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
766aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
767af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
76815ed99a7SXuan Hu  val fromCSR = Input(new CSRToDecode)
769be25371aSYikeZhou}
770be25371aSYikeZhou
771be25371aSYikeZhou/**
772be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
773be25371aSYikeZhou */
7742225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
775be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
776be25371aSYikeZhou
7773b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
778be25371aSYikeZhou
77975e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
78075e2c883SXuan Hu
78157a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
78257a10886SXuan Hu    FpDecode.table ++
783bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
784768f5f91SYangyu Chen    BitmanipDecode.table ++
785768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
786a19215ddSYinan Xu    XSTrapDecode.table ++
787a19215ddSYinan Xu    CBODecode.table ++
788b65b9ebaSXuan Hu    SvinvalDecode.table ++
789e25e4d90SXuan Hu    HypervisorDecode.table ++
790545d7be0SYangyu Chen    VecDecoder.table ++
791499d2763SZiyue Zhang    ZicondDecode.table ++
79220b2b626SsinceforYy    ZimopDecode.table ++
79320b2b626SsinceforYy    ZfaDecode.table
794b65b9ebaSXuan Hu
79589cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
796a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
797239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
798a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
799a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
800be25371aSYikeZhou
8014d24c305SYikeZhou  // output
8023b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
803be25371aSYikeZhou
8042ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
8057ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
8063b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
807ec427417Slinzhida  decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags
8081a1319cbSLinJiawei
8093b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
8103b739f49SXuan Hu
811a8db15d8Sfdy  decodedInst.uopIdx := 0.U
812d91483a6Sfdy  decodedInst.firstUop := true.B
813d91483a6Sfdy  decodedInst.lastUop := true.B
814f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
8153235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
816deb6421eSHaojin Tang
817499d2763SZiyue Zhang  val isZimop = (BitPat("b1?00??0111??_?????_100_?????_1110011") === ctrl_flow.instr) ||
818499d2763SZiyue Zhang                (BitPat("b1?00??1?????_?????_100_?????_1110011") === ctrl_flow.instr)
819499d2763SZiyue Zhang
82073c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
821499d2763SZiyue Zhang  // temp decode zimop as move
822499d2763SZiyue Zhang  decodedInst.isMove := (isMove || isZimop) && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
82373c4359eSYikeZhou
82449a2cda2SXuan Hu  // fmadd - b1000011
82549a2cda2SXuan Hu  // fmsub - b1000111
82649a2cda2SXuan Hu  // fnmsub- b1001011
82749a2cda2SXuan Hu  // fnmadd- b1001111
82849a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
829e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
830e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
83149a2cda2SXuan Hu
832178dd38cSYikeZhou  // read src1~3 location
83398cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
83498cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
83549a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
83649a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
8379c5a1080Sxiaofeibao  decodedInst.lsrc(3) := V0_IDX.U
8389c5a1080Sxiaofeibao  decodedInst.lsrc(4) := Vl_IDX.U
839b6b11f60SXuan Hu
840178dd38cSYikeZhou  // read dest location
84198cfe81bSxgkiri  decodedInst.ldest := inst.RD
8424d24c305SYikeZhou
843e4e68f86Sxiaofeibao  // init v0Wen vlWen
844e4e68f86Sxiaofeibao  decodedInst.v0Wen := false.B
845e4e68f86Sxiaofeibao  decodedInst.vlWen := false.B
846e4e68f86Sxiaofeibao
847c2a8ae00SYikeZhou  // fill in exception vector
848567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
849567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
850567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
851bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
8525110577fSZiyue Zhang  vecException.io.vstart := decodedInst.vpu.vstart
8534d24c305SYikeZhou
85415ed99a7SXuan Hu  private val exceptionII =
85515ed99a7SXuan Hu    decodedInst.selImm === SelImm.INVALID_INSTR ||
85615ed99a7SXuan Hu    vecException.io.illegalInst ||
85715ed99a7SXuan Hu    io.fromCSR.illegalInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence  ||
85815ed99a7SXuan Hu    io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
85915ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g ||
86015ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v ||
86115ed99a7SXuan Hu    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
8628b7dc6f5SsinceforYy    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
8638b7dc6f5SsinceforYy    io.fromCSR.illegalInst.fsIsOff    && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) ||
8648b7dc6f5SsinceforYy                                          (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) ||
865d60bfe5aSsinceforYy                                           FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) ||
866d60bfe5aSsinceforYy                                           isVecOPF) ||
867b50a88ecSXuan Hu    io.fromCSR.illegalInst.vsIsOff    && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) ||
868689f6b88SsinceforYy    io.fromCSR.illegalInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType) ||
869689f6b88SsinceforYy    (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)) ||
870689f6b88SsinceforYy    (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm
87115ed99a7SXuan Hu
87215ed99a7SXuan Hu  private val exceptionVI =
87315ed99a7SXuan Hu    io.fromCSR.virtualInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence ||
87415ed99a7SXuan Hu    io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
87515ed99a7SXuan Hu    io.fromCSR.virtualInst.hfence     && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) ||
87615ed99a7SXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
877b50a88ecSXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
878b50a88ecSXuan Hu    io.fromCSR.virtualInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType)
87915ed99a7SXuan Hu
8805a9dd560SXuan Hu  decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II)
88115ed99a7SXuan Hu  decodedInst.exceptionVec(virtualInstr) := exceptionVI
882d0de7e4aSpeixiaokun
8837e0f64b0SGuanghui Cheng  //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry.
8847e0f64b0SGuanghui Cheng  decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger)
8857e0f64b0SGuanghui Cheng
8863b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
887b0ae3ac4SLinJiawei    x => {
8887ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
889b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
890b0ae3ac4SLinJiawei      x._1 -> minBits
891b0ae3ac4SLinJiawei    }
892b0ae3ac4SLinJiawei  ))
893aac4464eSYinan Xu
8947531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
8957531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
8967531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
8977531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
8987531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
8997531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
9007531c765SXuan Hu
9017531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
90275e2c883SXuan Hu
90375e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
904be25371aSYikeZhou
9050bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
90639c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
90739c388b5SXuan Hu  private val narrowInsts = Seq(
90839c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
90939c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
91039c388b5SXuan Hu  )
91139c388b5SXuan Hu  private val maskDstInsts = Seq(
91239c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
91339c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
91439c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
9159eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
9169eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
9179eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
9189eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
919f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
92039c388b5SXuan Hu  )
92130fcc710SZiyue Zhang  private val maskOpInsts = Seq(
92230fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
92330fcc710SZiyue Zhang  )
92494e6af68SZiyue-Zhang  private val vmaInsts = Seq(
92594e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
92694e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
92794e6af68SZiyue-Zhang  )
928bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
929bdda74fdSxiaofeibao-xjtu    // opfff
930bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
931bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
932bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
933bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
934bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
935bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
936bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
937bdda74fdSxiaofeibao-xjtu    // opfvv
938bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
939bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
940bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
941bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
942bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
943bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
944bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
945bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
946bdda74fdSxiaofeibao-xjtu    // opfvf
947bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
948bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
949bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
950bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
951bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
952bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
953bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
954aab8ef9cSxiaofeibao-xjtu    // vfred
955aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
956bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
957bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
958bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
959bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
960bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
961b189aafaSzmx    FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H,
962ba899681Schengguanghui    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,
963ba899681Schengguanghui    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,
964ba899681Schengguanghui    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,
965ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
96620b2b626SsinceforYy    // zfa
96720b2b626SsinceforYy    FLEQ_H, FLEQ_S, FLEQ_D, FLTQ_H, FLTQ_S, FLTQ_D,
96820b2b626SsinceforYy    FMINM_H, FMINM_S, FMINM_D, FMAXM_H, FMAXM_S, FMAXM_D,
96920b2b626SsinceforYy    FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D,
97020b2b626SsinceforYy    FCVTMOD_W_D,
971bdda74fdSxiaofeibao-xjtu  )
972689f6b88SsinceforYy
973689f6b88SsinceforYy  private val scalaNeedFrmInsts = Seq(
974689f6b88SsinceforYy    FADD_S, FSUB_S, FADD_D, FSUB_D,
975689f6b88SsinceforYy    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
976689f6b88SsinceforYy    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
97720b2b626SsinceforYy    FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D,
978689f6b88SsinceforYy  )
979689f6b88SsinceforYy
980689f6b88SsinceforYy  private val vectorNeedFrmInsts = Seq (
981689f6b88SsinceforYy    VFSLIDE1UP_VF, VFSLIDE1DOWN_VF,
982689f6b88SsinceforYy  )
983689f6b88SsinceforYy
984bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
985689f6b88SsinceforYy  decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
986689f6b88SsinceforYy  decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
987bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
988bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
989bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
9903b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
991bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
992bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
993bdda74fdSxiaofeibao-xjtu  }.otherwise{
99475e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
99575e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
99675e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
99775e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
99875e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
99975e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
100075e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
1001d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
100294e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
100339c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
1004b6279fc6SZiyue Zhang    val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
1005b6279fc6SZiyue Zhang    val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
1006b6279fc6SZiyue Zhang    val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
1007b6279fc6SZiyue Zhang    val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe
1008dab1ad8cSsinsanction    val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse
1009dab1ad8cSsinsanction    val isVlm = decodedInst.fuOpType === VlduType.vlm
101081229133SZiyue Zhang    val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV || decodedInst.uopSplitType === UopSplitType.VEC_VWW
101194e6af68SZiyue-Zhang    val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
1012dab1ad8cSsinsanction    val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew
1013b6279fc6SZiyue Zhang    decodedInst.vpu.isNarrow := isNarrow
1014b6279fc6SZiyue Zhang    decodedInst.vpu.isDstMask := isDstMask
1015b6279fc6SZiyue Zhang    decodedInst.vpu.isOpMask := isOpMask
101694e6af68SZiyue-Zhang    decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma
1017dab1ad8cSsinsanction    decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac
10185110577fSZiyue Zhang    decodedInst.vpu.vstart := io.enq.vstart
1019bdda74fdSxiaofeibao-xjtu  }
102006f0a37aSZiyue Zhang  decodedInst.vpu.specVill := io.enq.vtype.illegal
102106f0a37aSZiyue Zhang  decodedInst.vpu.specVma := io.enq.vtype.vma
102206f0a37aSZiyue Zhang  decodedInst.vpu.specVta := io.enq.vtype.vta
102306f0a37aSZiyue Zhang  decodedInst.vpu.specVsew := io.enq.vtype.vsew
102406f0a37aSZiyue Zhang  decodedInst.vpu.specVlmul := io.enq.vtype.vlmul
102575e2c883SXuan Hu
102631c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
102731c51290Szhanglinjuan
10286d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
10296d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
10306d56ac16Ssinsanction
10317f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
103287dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
103387dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
103406cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
103587dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
10360a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
1037c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
103806cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
1039c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
10407f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
1041ddc88dadSxiaofeibao  // numOfUop should be 1 when vector instruction is illegalInst
1042ddc88dadSxiaofeibao  io.deq.uopInfo.numOfUop := Mux(vecException.io.illegalInst, 1.U, uopInfoGen.io.out.uopInfo.numOfUop)
10433235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
10447f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
10457f9f0a79SzhanglyGit
1046*a9becb0dSJunxiong Ji  val isCsr = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U
1047*a9becb0dSJunxiong Ji  val isCsrr = isCsr && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U
1048*a9becb0dSJunxiong Ji  val isCsrw = isCsr && inst.FUNCT3 === BitPat("b?01") && inst.RD  === 0.U
1049*a9becb0dSJunxiong Ji  dontTouch(isCsrr)
1050*a9becb0dSJunxiong Ji  dontTouch(isCsrw)
1051cc1eb70dSXuan Hu
105287c5d21dSZiyue Zhang  // for csrr vl instruction, convert to vsetvl
1053*a9becb0dSJunxiong Ji  val isCsrrVlenb = isCsrr && inst.CSRIDX === CSRs.vlenb.U
1054*a9becb0dSJunxiong Ji  val isCsrrVl    = isCsrr && inst.CSRIDX === CSRs.vl.U
1055cc1eb70dSXuan Hu
1056ac17908cSHuijin Li  // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i)
1057ac17908cSHuijin Li  val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U
1058ac17908cSHuijin Li  val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W)
1059ac17908cSHuijin Li  val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W)
1060ac17908cSHuijin Li  val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W)
1061ac17908cSHuijin Li
106220b2b626SsinceforYy  // for fli.s|fli.d instruction
106320b2b626SsinceforYy  val isFLI = inst.FUNCT7 === BitPat("b11110??") && inst.RS2 === 1.U && inst.RM === 0.U && inst.OPCODE5Bit === OPCODE5Bit.OP_FP
106420b2b626SsinceforYy
106587c5d21dSZiyue Zhang  when (isCsrrVl) {
106663cb3754SZiyue Zhang    // convert to vsetvl instruction
106787c5d21dSZiyue Zhang    decodedInst.srcType(0) := SrcType.no
106887c5d21dSZiyue Zhang    decodedInst.srcType(1) := SrcType.no
106987c5d21dSZiyue Zhang    decodedInst.srcType(2) := SrcType.no
107087c5d21dSZiyue Zhang    decodedInst.srcType(3) := SrcType.no
107187c5d21dSZiyue Zhang    decodedInst.srcType(4) := SrcType.vp
107287c5d21dSZiyue Zhang    decodedInst.lsrc(4)    := Vl_IDX.U
107363cb3754SZiyue Zhang    decodedInst.waitForward   := false.B
107487c5d21dSZiyue Zhang    decodedInst.blockBackward := false.B
10758c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
107663cb3754SZiyue Zhang  }.elsewhen (isCsrrVlenb) {
107763cb3754SZiyue Zhang    // convert to addi instruction
1078828a8a48SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1079828a8a48SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
108063cb3754SZiyue Zhang    decodedInst.srcType(2) := SrcType.no
108163cb3754SZiyue Zhang    decodedInst.srcType(3) := SrcType.no
108263cb3754SZiyue Zhang    decodedInst.srcType(4) := SrcType.no
108363cb3754SZiyue Zhang    decodedInst.selImm := SelImm.IMM_I
108463cb3754SZiyue Zhang    decodedInst.waitForward := false.B
108563cb3754SZiyue Zhang    decodedInst.blockBackward := false.B
108663cb3754SZiyue Zhang    decodedInst.canRobCompress := true.B
10878c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
1088ac17908cSHuijin Li  }.elsewhen (isPreW || isPreR || isPreI) {
1089ac17908cSHuijin Li    decodedInst.selImm := SelImm.IMM_S
1090ac17908cSHuijin Li    decodedInst.fuType := FuType.ldu.U
1091ac17908cSHuijin Li    decodedInst.canRobCompress := false.B
1092ac17908cSHuijin Li    decodedInst.fuOpType := Mux1H(Seq(
1093ac17908cSHuijin Li      isPreW -> LSUOpType.prefetch_w,
1094ac17908cSHuijin Li      isPreR -> LSUOpType.prefetch_r,
1095ac17908cSHuijin Li      isPreI -> LSUOpType.prefetch_i,
1096ac17908cSHuijin Li    ))
1097499d2763SZiyue Zhang  }.elsewhen (isZimop) {
1098499d2763SZiyue Zhang    // set srcType for zimop
1099499d2763SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1100499d2763SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
1101499d2763SZiyue Zhang    // use x0 as src1
1102499d2763SZiyue Zhang    decodedInst.lsrc(0) := 0.U
110387c5d21dSZiyue Zhang  }
110487c5d21dSZiyue Zhang
110575e2c883SXuan Hu  io.deq.decodedInst := decodedInst
11069faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
1107985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
1108cc1eb70dSXuan Hu    // keep condition
1109cc1eb70dSXuan Hu    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType,
111087c5d21dSZiyue Zhang    (isCsrrVl) -> FuType.vsetfwf.U,
111163cb3754SZiyue Zhang    (isCsrrVlenb) -> FuType.alu.U,
1112cc1eb70dSXuan Hu
1113cc1eb70dSXuan Hu    // change vlsu to vseglsu when NF =/= 0.U
1114f94f6503SXuan 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,
1115f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
1116f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
1117f94f6503SXuan 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,
1118f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
1119f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
1120f94f6503SXuan 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,
1121985804e6SXuan Hu  ))
1122499d2763SZiyue Zhang  io.deq.decodedInst.imm := MuxCase(decodedInst.imm, Seq(
1123499d2763SZiyue Zhang    isCsrrVlenb -> (VLEN / 8).U,
1124499d2763SZiyue Zhang    isZimop     -> 0.U,
1125499d2763SZiyue Zhang  ))
1126cc1eb70dSXuan Hu
11274fe0a83eSXuan Hu  io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq(
1128cc1eb70dSXuan Hu    isCsrrVl    -> VSETOpType.csrrvl,
1129cc1eb70dSXuan Hu    isCsrrVlenb -> ALUOpType.add,
113020b2b626SsinceforYy    isFLI       -> Cat(1.U, inst.FMT, inst.RS1),
11314fe0a83eSXuan Hu  ))
11324fe0a83eSXuan Hu
1133*a9becb0dSJunxiong Ji  // io.deq.decodedInst.blockBackward := MuxCase(decodedInst.blockBackward, Seq(
1134*a9becb0dSJunxiong Ji  //   isRoCsrr -> false.B,
1135*a9becb0dSJunxiong Ji  // ))
1136be25371aSYikeZhou  //-------------------------------------------------------------
1137be25371aSYikeZhou  // Debug Info
11383b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
11393b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
11403b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
11413b739f49SXuan 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",
11423b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
11433b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
11443b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
11453b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
11463b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
11473b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
11483b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
11493b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
1150be25371aSYikeZhou}
1151