xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 20b2b626df334d81ef257109d46d530f01639020)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
17be25371aSYikeZhoupackage xiangshan.backend.decode
18be25371aSYikeZhou
198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
20be25371aSYikeZhouimport chisel3._
21be25371aSYikeZhouimport chisel3.util._
22cc1eb70dSXuan Huimport freechips.rocketchip.rocket.CSRs
233b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._
246ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat
253c02ee8fSwakafaimport utility._
263b739f49SXuan Huimport utils._
275a9dd560SXuan Huimport xiangshan.ExceptionNO.{EX_II, breakPoint, illegalInstr, virtualInstr}
286ab6918fSYinan Xuimport xiangshan._
29730cfbc0SXuan Huimport xiangshan.backend.fu.FuType
30730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst}
311be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions
32cc1eb70dSXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, OPCODE5Bit, XSInstBitFields}
335110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl}
3415ed99a7SXuan Huimport xiangshan.backend.fu.wrapper.CSRToDecode
35499d2763SZiyue Zhangimport xiangshan.backend.decode.Zimop._
36*20b2b626SsinceforYyimport yunsuan.{VfaluType, VfcvtType}
37be25371aSYikeZhou
38be25371aSYikeZhou/**
39be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
40be25371aSYikeZhou */
41be25371aSYikeZhouabstract trait DecodeConstants {
42361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
4357a10886SXuan Hu  def X = BitPat("b0")
444d24c305SYikeZhou  def N = BitPat("b0")
454d24c305SYikeZhou  def Y = BitPat("b1")
4657a10886SXuan Hu  def T = true
4757a10886SXuan Hu  def F = false
484d24c305SYikeZhou
49c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
5020e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
514d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
5257a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
5357a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
5457a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5557a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5657a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
5789cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  canRobCompress
5889cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  uopSplitType
5989cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  |             selImm
6089cc69c1STang 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
614d24c305SYikeZhou
6257a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
6357a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
64be25371aSYikeZhou}
65be25371aSYikeZhou
66c2a8ae00SYikeZhoutrait DecodeUnitConstants
674d24c305SYikeZhou{
684d24c305SYikeZhou  // abstract out instruction decode magic numbers
694d24c305SYikeZhou  val RD_MSB  = 11
704d24c305SYikeZhou  val RD_LSB  = 7
714d24c305SYikeZhou  val RS1_MSB = 19
724d24c305SYikeZhou  val RS1_LSB = 15
734d24c305SYikeZhou  val RS2_MSB = 24
744d24c305SYikeZhou  val RS2_LSB = 20
754d24c305SYikeZhou  val RS3_MSB = 31
764d24c305SYikeZhou  val RS3_LSB = 27
774d24c305SYikeZhou}
784d24c305SYikeZhou
79be25371aSYikeZhou/**
80be25371aSYikeZhou * Decoded control signals
814d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
82be25371aSYikeZhou */
83c2a8ae00SYikeZhou
8457a10886SXuan Huabstract class XSDecodeBase {
8557a10886SXuan Hu  def X = BitPat("b?")
8657a10886SXuan Hu  def N = BitPat("b0")
8757a10886SXuan Hu  def Y = BitPat("b1")
8857a10886SXuan Hu  def T = true
8957a10886SXuan Hu  def F = false
9057a10886SXuan Hu  def generate() : List[BitPat]
9157a10886SXuan Hu}
9257a10886SXuan Hu
9357a10886SXuan Hucase class XSDecode(
9457a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
95239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat,
96e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9757a10886SXuan Hu  xWen: Boolean = false,
9857a10886SXuan Hu  fWen: Boolean = false,
9957a10886SXuan Hu  vWen: Boolean = false,
10057a10886SXuan Hu  mWen: Boolean = false,
10157a10886SXuan Hu  xsTrap: Boolean = false,
10257a10886SXuan Hu  noSpec: Boolean = false,
10357a10886SXuan Hu  blockBack: Boolean = false,
10457a10886SXuan Hu  flushPipe: Boolean = false,
10589cc69c1STang Haojin  canRobCompress: Boolean = false,
10657a10886SXuan Hu) extends XSDecodeBase {
10757a10886SXuan Hu  def generate() : List[BitPat] = {
10889cc69c1STang 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)
10957a10886SXuan Hu  }
11057a10886SXuan Hu}
11157a10886SXuan Hu
11257a10886SXuan Hucase class FDecode(
11357a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
114239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X,
11517ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
11657a10886SXuan Hu  xWen: Boolean = false,
11757a10886SXuan Hu  fWen: Boolean = false,
11857a10886SXuan Hu  vWen: Boolean = false,
11957a10886SXuan Hu  mWen: Boolean = false,
12057a10886SXuan Hu  xsTrap: Boolean = false,
12157a10886SXuan Hu  noSpec: Boolean = false,
12257a10886SXuan Hu  blockBack: Boolean = false,
12357a10886SXuan Hu  flushPipe: Boolean = false,
12489cc69c1STang Haojin  canRobCompress: Boolean = false,
12557a10886SXuan Hu) extends XSDecodeBase {
12657a10886SXuan Hu  def generate() : List[BitPat] = {
12789cc69c1STang Haojin    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate()
12857a10886SXuan Hu  }
12957a10886SXuan Hu}
13057a10886SXuan Hu
131be25371aSYikeZhou/**
132be25371aSYikeZhou * Overall Decode constants
133be25371aSYikeZhou */
134be25371aSYikeZhouobject XDecode extends DecodeConstants {
13557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
136768f5f91SYangyu Chen    // RV32I
13757a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
13857a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
13957a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
14057a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
14157a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
14257a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
14357a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
14457a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
14589cc69c1STang Haojin    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T),
14689cc69c1STang Haojin    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T),
14789cc69c1STang Haojin    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T),
14889cc69c1STang Haojin    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T, canRobCompress = T),
14989cc69c1STang Haojin    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T),
15089cc69c1STang Haojin    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T),
15189cc69c1STang Haojin    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T),
15289cc69c1STang Haojin    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T, canRobCompress = T),
15389cc69c1STang Haojin    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T, canRobCompress = T),
15489cc69c1STang Haojin    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T, canRobCompress = T),
15589cc69c1STang Haojin    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T, canRobCompress = T),
15689cc69c1STang Haojin    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T, canRobCompress = T),
15789cc69c1STang Haojin    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T, canRobCompress = T),
15889cc69c1STang Haojin    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T, canRobCompress = T),
15989cc69c1STang Haojin    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T, canRobCompress = T),
16089cc69c1STang Haojin    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T, canRobCompress = T),
16189cc69c1STang Haojin    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T, canRobCompress = T),
1624d24c305SYikeZhou
163768f5f91SYangyu Chen    // RV64I (extend from RV32I)
164768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
165768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
166768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
167768f5f91SYangyu Chen
168768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
169768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
170768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
171768f5f91SYangyu Chen
172768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
173768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
174768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
175768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
176768f5f91SYangyu Chen
177768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
178768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
179768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
180768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
181768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
182768f5f91SYangyu Chen
183768f5f91SYangyu Chen    // RV64M
18489cc69c1STang Haojin    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T, canRobCompress = T),
18589cc69c1STang Haojin    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T, canRobCompress = T),
18689cc69c1STang Haojin    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T),
18789cc69c1STang Haojin    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T),
18889cc69c1STang Haojin    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T, canRobCompress = T),
1894d24c305SYikeZhou
19089cc69c1STang Haojin    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T, canRobCompress = T),
19189cc69c1STang Haojin    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T, canRobCompress = T),
19289cc69c1STang Haojin    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T, canRobCompress = T),
19389cc69c1STang Haojin    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T, canRobCompress = T),
19489cc69c1STang Haojin    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T, canRobCompress = T),
19589cc69c1STang Haojin    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T),
19689cc69c1STang Haojin    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T, canRobCompress = T),
19789cc69c1STang Haojin    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T),
1984d24c305SYikeZhou
199f7af4c74Schengguanghui    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
20057a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
2015110577fSZiyue Zhang    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T),
2023b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
2033b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
2043b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2053b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2063b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2073b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2084d24c305SYikeZhou
209768f5f91SYangyu Chen    // System, the immediate12 holds the CSR register.
21040ac5bb1SXuan Hu
211fa16cf81Slewislzh    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
212fa16cf81Slewislzh    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
213fa16cf81Slewislzh    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2144d24c305SYikeZhou
21557a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21657a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21757a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2184d24c305SYikeZhou
21957a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22057a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22157a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22257a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22357a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22457a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2254d24c305SYikeZhou
22657a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22757a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22857a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2294d24c305SYikeZhou
230768f5f91SYangyu Chen    // RV64A
23157a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23257a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23357a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23457a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23557a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23657a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23757a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23857a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23957a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2404d24c305SYikeZhou
24157a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24257a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24357a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24457a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24557a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24757a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24857a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24957a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2504d24c305SYikeZhou
25157a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25257a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25357a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25457a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
255768f5f91SYangyu Chen  )
256768f5f91SYangyu Chen}
257ee8ff153Szfw
258768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
259768f5f91SYangyu Chen  /*
260768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
261768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
262768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
263768f5f91SYangyu Chen   */
264768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
265768f5f91SYangyu Chen    // Zba
266768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
267768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
268768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
269768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
270768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
271768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
272768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
273768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
274768f5f91SYangyu Chen
275768f5f91SYangyu Chen    // Zbb
27689cc69c1STang Haojin    ANDN      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn    , SelImm.X    , xWen = T, canRobCompress = T),
27789cc69c1STang Haojin    ORN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn     , SelImm.X    , xWen = T, canRobCompress = T),
27889cc69c1STang Haojin    XNOR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor    , SelImm.X    , xWen = T, canRobCompress = T),
279ee8ff153Szfw
280768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
281768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
282768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
283768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
284768f5f91SYangyu Chen
285768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
286768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
287768f5f91SYangyu Chen
28889cc69c1STang Haojin    MAX       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max     , SelImm.X    , xWen = T, canRobCompress = T),
28989cc69c1STang Haojin    MAXU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu    , SelImm.X    , xWen = T, canRobCompress = T),
290768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
291768f5f91SYangyu Chen    MINU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu    , SelImm.X    , xWen = T, canRobCompress = T),
292ee8ff153Szfw
29389cc69c1STang Haojin    SEXT_B    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb   , SelImm.X    , xWen = T, canRobCompress = T),
29489cc69c1STang Haojin    SEXT_H    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth   , SelImm.X    , xWen = T, canRobCompress = T),
295768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
296768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
297ee8ff153Szfw
298768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
299768f5f91SYangyu Chen    ROLW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw    , SelImm.X    , xWen = T, canRobCompress = T),
30089cc69c1STang Haojin    ROR       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.X    , xWen = T, canRobCompress = T),
30189cc69c1STang Haojin    RORI      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.IMM_I, xWen = T, canRobCompress = T),
302768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
303768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
304ee8ff153Szfw
305768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
306768f5f91SYangyu Chen
307768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
308768f5f91SYangyu Chen
309768f5f91SYangyu Chen    // Zbc
310768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
311768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
312768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
313768f5f91SYangyu Chen
314768f5f91SYangyu Chen    // Zbs
315768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
316768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
317768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
318768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
319768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
320768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
321768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
322768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
323768f5f91SYangyu Chen
324768f5f91SYangyu Chen    // Zbkb
325768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
326768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
327768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
328768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
329768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
330768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
331768f5f91SYangyu Chen
332768f5f91SYangyu Chen    // Zbkc
333768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
334768f5f91SYangyu Chen
335768f5f91SYangyu Chen    // Zbkx
336768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
337768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
338768f5f91SYangyu Chen  )
339768f5f91SYangyu Chen}
340768f5f91SYangyu Chen
341768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
342768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
343768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
344768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
345768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
346768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
347768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
348768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
349768f5f91SYangyu Chen
350768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
351768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
352768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
353768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
354768f5f91SYangyu Chen
355768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
356768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
357768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
358768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
359768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
360768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
361768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
362768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
363768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
364768f5f91SYangyu Chen
365768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
366768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
367768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
368768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
369768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
370768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
371768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
372768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
373768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
374768f5f91SYangyu Chen
375768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
376768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
377768f5f91SYangyu Chen    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1     , SelImm.X    , xWen = T, canRobCompress = T),
3784d24c305SYikeZhou  )
379be25371aSYikeZhou}
380be25371aSYikeZhou
381be25371aSYikeZhou/**
382be25371aSYikeZhou * FP Decode constants
383be25371aSYikeZhou */
38457a10886SXuan Huobject FpDecode extends DecodeConstants{
38557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
386b189aafaSzmx    FLH     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T),
38757a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
38857a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
389b189aafaSzmx    FSH     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S          ),
39057a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
39157a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3924d24c305SYikeZhou
393964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
394964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
395b189aafaSzmx    FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T),
396c2a8ae00SYikeZhou
3974d24c305SYikeZhou    // Int to FP
39889cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39989cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40089cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40189cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4024d24c305SYikeZhou
40389cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40489cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40589cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40689cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4074d24c305SYikeZhou
4084d24c305SYikeZhou  )
409be25371aSYikeZhou}
410be25371aSYikeZhou
411be25371aSYikeZhou/**
412be25371aSYikeZhou * FP Divide SquareRoot Constants
413be25371aSYikeZhou */
414be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
41557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
41689cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41789cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41889cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41989cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4204d24c305SYikeZhou  )
421be25371aSYikeZhou}
422be25371aSYikeZhou
4234d24c305SYikeZhou/**
424af2f7849Shappy-lx * Svinval extension Constants
425af2f7849Shappy-lx */
426af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
42757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
428af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
429af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
430af2f7849Shappy-lx     */
43157a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
432af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
433af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
434af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
435af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
436af2f7849Shappy-lx     */
43757a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
438af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
439af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
440af2f7849Shappy-lx     * then dispatch and issue this instrucion
441af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
442af2f7849Shappy-lx     */
44357a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
444af2f7849Shappy-lx    /* what is Svinval extension ?
445af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
446af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
447af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
448af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
449af2f7849Shappy-lx     *
450af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
451af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
452af2f7849Shappy-lx     */
453af2f7849Shappy-lx  )
454af2f7849Shappy-lx}
45557a10886SXuan Hu
456af2f7849Shappy-lx/*
457ca18a0b4SWilliam Wang * CBO decode
458ca18a0b4SWilliam Wang */
459ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
46057a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
46157a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
46257a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
46357a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
46457a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
465ca18a0b4SWilliam Wang  )
466ca18a0b4SWilliam Wang}
467ca18a0b4SWilliam Wang
468d0de7e4aSpeixiaokun/*
469d0de7e4aSpeixiaokun * Hypervisor decode
470d0de7e4aSpeixiaokun */
471d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
472e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
473e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
474e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
475e25e4d90SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X),
476e25e4d90SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X),
477e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
478e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
479e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
480e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
481e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
482e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
483e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
484e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
485e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
486e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
487e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
488e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
489e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
490d0de7e4aSpeixiaokun  )
491d0de7e4aSpeixiaokun}
492d0de7e4aSpeixiaokun
493545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
494545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
495545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
496545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
497545d7be0SYangyu Chen  )
498545d7be0SYangyu Chen}
499545d7be0SYangyu Chen
500ca18a0b4SWilliam Wang/**
501499d2763SZiyue Zhang  * "Zimop" Extension for May-Be-Operations
502499d2763SZiyue Zhang  */
503499d2763SZiyue Zhangobject ZimopDecode extends DecodeConstants {
504499d2763SZiyue Zhang  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
505499d2763SZiyue Zhang    // temp use addi to decode MOP_R and MOP_RR
506499d2763SZiyue Zhang    MOP_R  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
507499d2763SZiyue Zhang    MOP_RR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
508499d2763SZiyue Zhang  )
509499d2763SZiyue Zhang}
510499d2763SZiyue Zhang
511*20b2b626SsinceforYyobject ZfaDecode extends DecodeConstants {
512*20b2b626SsinceforYy  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
513*20b2b626SsinceforYy    FLI_H       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
514*20b2b626SsinceforYy    FLI_S       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
515*20b2b626SsinceforYy    FLI_D       -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T),
516*20b2b626SsinceforYy    FMINM_H     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
517*20b2b626SsinceforYy    FMINM_S     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
518*20b2b626SsinceforYy    FMINM_D     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T),
519*20b2b626SsinceforYy    FMAXM_H     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
520*20b2b626SsinceforYy    FMAXM_S     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
521*20b2b626SsinceforYy    FMAXM_D     -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T),
522*20b2b626SsinceforYy    FROUND_H    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
523*20b2b626SsinceforYy    FROUND_S    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
524*20b2b626SsinceforYy    FROUND_D    -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fround,   fWen = T, canRobCompress = T),
525*20b2b626SsinceforYy    FROUNDNX_H  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
526*20b2b626SsinceforYy    FROUNDNX_S  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
527*20b2b626SsinceforYy    FROUNDNX_D  -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T),
528*20b2b626SsinceforYy    FCVTMOD_W_D -> FDecode(SrcType.fp, SrcType.X,  SrcType.X, FuType.fcvt, VfcvtType.fcvtmod_w_d, xWen = T, canRobCompress = T),
529*20b2b626SsinceforYy    FLEQ_H      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
530*20b2b626SsinceforYy    FLEQ_S      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
531*20b2b626SsinceforYy    FLEQ_D      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T),
532*20b2b626SsinceforYy    FLTQ_H      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
533*20b2b626SsinceforYy    FLTQ_S      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
534*20b2b626SsinceforYy    FLTQ_D      -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T),
535*20b2b626SsinceforYy  )
536*20b2b626SsinceforYy}
537*20b2b626SsinceforYy
538499d2763SZiyue Zhang/**
5394d24c305SYikeZhou * XiangShan Trap Decode constants
5404d24c305SYikeZhou */
5414d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
542361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
54357a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
54457a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
5454d24c305SYikeZhou  )
5464d24c305SYikeZhou}
547be25371aSYikeZhou
54849f433deSXuan Huabstract class Imm(val len: Int) {
549b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
550b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
551b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
552b0ae3ac4SLinJiawei}
553b0ae3ac4SLinJiawei
554b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
555fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
556b0ae3ac4SLinJiawei
557b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
558b0ae3ac4SLinJiawei    Cat(instr(31, 20))
559b0ae3ac4SLinJiawei}
560b0ae3ac4SLinJiawei
561b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
562b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
563b0ae3ac4SLinJiawei
564b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
565b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
566b0ae3ac4SLinJiawei}
567b0ae3ac4SLinJiawei
568b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
569b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
570b0ae3ac4SLinJiawei
571b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
572b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
573b0ae3ac4SLinJiawei}
574b0ae3ac4SLinJiawei
575b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
576fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
577b0ae3ac4SLinJiawei
578b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
579b0ae3ac4SLinJiawei    instr(31, 12)
580c2a8ae00SYikeZhou  }
581c2a8ae00SYikeZhou}
582c2a8ae00SYikeZhou
583b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
584b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
585b0ae3ac4SLinJiawei
586b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
587b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
588b0ae3ac4SLinJiawei  }
589b0ae3ac4SLinJiawei}
590b0ae3ac4SLinJiawei
591fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){
592b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
593b0ae3ac4SLinJiawei
594b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
595fa16cf81Slewislzh    Cat(instr(11, 7), instr(19, 15), instr(31, 20))
596b0ae3ac4SLinJiawei  }
59792c61038SXuan Hu
59892c61038SXuan Hu  def getCSRAddr(imm: UInt): UInt = {
59992c61038SXuan Hu    require(imm.getWidth == this.len)
60092c61038SXuan Hu    imm(11, 0)
60192c61038SXuan Hu  }
60292c61038SXuan Hu
60392c61038SXuan Hu  def getRS1(imm: UInt): UInt = {
60492c61038SXuan Hu    require(imm.getWidth == this.len)
60592c61038SXuan Hu    imm(16, 12)
60692c61038SXuan Hu  }
60792c61038SXuan Hu
60892c61038SXuan Hu  def getRD(imm: UInt): UInt = {
60992c61038SXuan Hu    require(imm.getWidth == this.len)
61092c61038SXuan Hu    imm(21, 17)
61192c61038SXuan Hu  }
61292c61038SXuan Hu
61392c61038SXuan Hu  def getImm5(imm: UInt): UInt = {
61492c61038SXuan Hu    require(imm.getWidth == this.len)
61592c61038SXuan Hu    imm(16, 12)
61692c61038SXuan Hu  }
617b0ae3ac4SLinJiawei}
618b0ae3ac4SLinJiawei
619ee8ff153Szfwcase class Imm_B6() extends Imm(6){
620ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
621ee8ff153Szfw
622ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
623ee8ff153Szfw    instr(25, 20)
624ee8ff153Szfw  }
625ee8ff153Szfw}
626ee8ff153Szfw
62758c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
62858c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
62958c35d23Shuxuan0307
63058c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
63158c35d23Shuxuan0307    instr(19, 15)
63258c35d23Shuxuan0307  }
63358c35d23Shuxuan0307}
634b52d4755SXuan Hu
63558c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
63658c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
63758c35d23Shuxuan0307
63858c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
63958c35d23Shuxuan0307    instr(19, 15)
64058c35d23Shuxuan0307  }
64158c35d23Shuxuan0307}
642b52d4755SXuan Hu
6434aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
6444aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6454aa9ed34Sfdy
6464aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6474aa9ed34Sfdy    instr(30, 20)
6484aa9ed34Sfdy  }
649e6ac7fe1SZiyue Zhang  /**
650e6ac7fe1SZiyue Zhang    * get VType from extended imm
651e6ac7fe1SZiyue Zhang    * @param extedImm
652e6ac7fe1SZiyue Zhang    * @return VType
653e6ac7fe1SZiyue Zhang    */
654e6ac7fe1SZiyue Zhang  def getVType(extedImm: UInt): InstVType = {
655e6ac7fe1SZiyue Zhang    val vtype = Wire(new InstVType)
656e6ac7fe1SZiyue Zhang    vtype := extedImm(10, 0).asTypeOf(new InstVType)
657e6ac7fe1SZiyue Zhang    vtype
658e6ac7fe1SZiyue Zhang  }
6594aa9ed34Sfdy}
660b52d4755SXuan Hu
661e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){
6624aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6634aa9ed34Sfdy
6644aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6655c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
666b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
667e6ac7fe1SZiyue Zhang    val vtype8 = rvInst.ZIMM_VSETIVLI
668b52d4755SXuan Hu    Cat(uimm5, vtype8)
669b52d4755SXuan Hu  }
670b52d4755SXuan Hu  /**
671b52d4755SXuan Hu    * get VType from extended imm
672b52d4755SXuan Hu    * @param extedImm
673b52d4755SXuan Hu    * @return VType
674b52d4755SXuan Hu    */
675b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
676b52d4755SXuan Hu    val vtype = Wire(new InstVType)
677e6ac7fe1SZiyue Zhang    vtype := extedImm(9, 0).asTypeOf(new InstVType)
678b52d4755SXuan Hu    vtype
679b52d4755SXuan Hu  }
680b52d4755SXuan Hu
681b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
682e6ac7fe1SZiyue Zhang    extedImm(14, 10)
6834aa9ed34Sfdy  }
6844aa9ed34Sfdy}
685fe528fd6Ssinsanction
686fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
687fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
688fe528fd6Ssinsanction
689fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
690fe528fd6Ssinsanction    instr(31, 0)
691fe528fd6Ssinsanction  }
692fe528fd6Ssinsanction}
693fe528fd6Ssinsanction
6947e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
6957e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
6967e30d16cSZhaoyang You
6977e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
6987e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
6997e30d16cSZhaoyang You  }
7007e30d16cSZhaoyang You}
7017e30d16cSZhaoyang You
702b0ae3ac4SLinJiaweiobject ImmUnion {
703b0ae3ac4SLinJiawei  val I = Imm_I()
704b0ae3ac4SLinJiawei  val S = Imm_S()
705b0ae3ac4SLinJiawei  val B = Imm_B()
706b0ae3ac4SLinJiawei  val U = Imm_U()
707b0ae3ac4SLinJiawei  val J = Imm_J()
708b0ae3ac4SLinJiawei  val Z = Imm_Z()
709ee8ff153Szfw  val B6 = Imm_B6()
71058c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
71158c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
7124aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
7134aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
714fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
7157e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
7164aa9ed34Sfdy
717520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
7187e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
719b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
720b0ae3ac4SLinJiawei  val immSelMap = Seq(
721b0ae3ac4SLinJiawei    SelImm.IMM_I,
722b0ae3ac4SLinJiawei    SelImm.IMM_S,
723b0ae3ac4SLinJiawei    SelImm.IMM_SB,
724b0ae3ac4SLinJiawei    SelImm.IMM_U,
725b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
726ee8ff153Szfw    SelImm.IMM_Z,
72758c35d23Shuxuan0307    SelImm.IMM_B6,
72858c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
7294aa9ed34Sfdy    SelImm.IMM_OPIVIU,
7304aa9ed34Sfdy    SelImm.IMM_VSETVLI,
731fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
7327e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
733b0ae3ac4SLinJiawei  ).zip(imms)
734b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
735b0ae3ac4SLinJiawei}
736b0ae3ac4SLinJiawei
737fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
738fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
739fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
740765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
741fd7603d9SYinan Xu  }
7423b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
743fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
7443b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
745f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
746fd7603d9SYinan Xu  }
747fd7603d9SYinan Xu}
748b0ae3ac4SLinJiawei
749be25371aSYikeZhou/**
750be25371aSYikeZhou * IO bundle for the Decode unit
751be25371aSYikeZhou */
752aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
753aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
754aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
755aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
756aaa08c5aSxiaofeibao-xjtu}
7572225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
7583b739f49SXuan Hu  val enq = new Bundle {
7593b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
760d91483a6Sfdy    val vtype = Input(new VType)
7615110577fSZiyue Zhang    val vstart = Input(Vl())
7624aa9ed34Sfdy  }
7633b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
764aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
765af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
76615ed99a7SXuan Hu  val fromCSR = Input(new CSRToDecode)
767be25371aSYikeZhou}
768be25371aSYikeZhou
769be25371aSYikeZhou/**
770be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
771be25371aSYikeZhou */
7722225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
773be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
774be25371aSYikeZhou
7753b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
776be25371aSYikeZhou
77775e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
77875e2c883SXuan Hu
77957a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
78057a10886SXuan Hu    FpDecode.table ++
781bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
782768f5f91SYangyu Chen    BitmanipDecode.table ++
783768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
784a19215ddSYinan Xu    XSTrapDecode.table ++
785a19215ddSYinan Xu    CBODecode.table ++
786b65b9ebaSXuan Hu    SvinvalDecode.table ++
787e25e4d90SXuan Hu    HypervisorDecode.table ++
788545d7be0SYangyu Chen    VecDecoder.table ++
789499d2763SZiyue Zhang    ZicondDecode.table ++
790*20b2b626SsinceforYy    ZimopDecode.table ++
791*20b2b626SsinceforYy    ZfaDecode.table
792b65b9ebaSXuan Hu
79389cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
794a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
795239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
796a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
797a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
798be25371aSYikeZhou
7994d24c305SYikeZhou  // output
8003b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
801be25371aSYikeZhou
8022ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
8037ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
8043b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
805ec427417Slinzhida  decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags
8061a1319cbSLinJiawei
8073b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
8083b739f49SXuan Hu
809a8db15d8Sfdy  decodedInst.uopIdx := 0.U
810d91483a6Sfdy  decodedInst.firstUop := true.B
811d91483a6Sfdy  decodedInst.lastUop := true.B
812f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
8133235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
814deb6421eSHaojin Tang
815499d2763SZiyue Zhang  val isZimop = (BitPat("b1?00??0111??_?????_100_?????_1110011") === ctrl_flow.instr) ||
816499d2763SZiyue Zhang                (BitPat("b1?00??1?????_?????_100_?????_1110011") === ctrl_flow.instr)
817499d2763SZiyue Zhang
81873c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
819499d2763SZiyue Zhang  // temp decode zimop as move
820499d2763SZiyue Zhang  decodedInst.isMove := (isMove || isZimop) && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
82173c4359eSYikeZhou
82249a2cda2SXuan Hu  // fmadd - b1000011
82349a2cda2SXuan Hu  // fmsub - b1000111
82449a2cda2SXuan Hu  // fnmsub- b1001011
82549a2cda2SXuan Hu  // fnmadd- b1001111
82649a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
827e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
828e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
82949a2cda2SXuan Hu
830178dd38cSYikeZhou  // read src1~3 location
83198cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
83298cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
83349a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
83449a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
8359c5a1080Sxiaofeibao  decodedInst.lsrc(3) := V0_IDX.U
8369c5a1080Sxiaofeibao  decodedInst.lsrc(4) := Vl_IDX.U
837b6b11f60SXuan Hu
838178dd38cSYikeZhou  // read dest location
83998cfe81bSxgkiri  decodedInst.ldest := inst.RD
8404d24c305SYikeZhou
841e4e68f86Sxiaofeibao  // init v0Wen vlWen
842e4e68f86Sxiaofeibao  decodedInst.v0Wen := false.B
843e4e68f86Sxiaofeibao  decodedInst.vlWen := false.B
844e4e68f86Sxiaofeibao
845c2a8ae00SYikeZhou  // fill in exception vector
846567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
847567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
848567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
849bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
8505110577fSZiyue Zhang  vecException.io.vstart := decodedInst.vpu.vstart
8514d24c305SYikeZhou
85215ed99a7SXuan Hu  private val exceptionII =
85315ed99a7SXuan Hu    decodedInst.selImm === SelImm.INVALID_INSTR ||
85415ed99a7SXuan Hu    vecException.io.illegalInst ||
85515ed99a7SXuan Hu    io.fromCSR.illegalInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence  ||
85615ed99a7SXuan Hu    io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
85715ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g ||
85815ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v ||
85915ed99a7SXuan Hu    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
8608b7dc6f5SsinceforYy    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
8618b7dc6f5SsinceforYy    io.fromCSR.illegalInst.fsIsOff    && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) ||
8628b7dc6f5SsinceforYy                                          (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) ||
863d60bfe5aSsinceforYy                                           FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) ||
864d60bfe5aSsinceforYy                                           isVecOPF) ||
865b50a88ecSXuan Hu    io.fromCSR.illegalInst.vsIsOff    && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) ||
866689f6b88SsinceforYy    io.fromCSR.illegalInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType) ||
867689f6b88SsinceforYy    (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)) ||
868689f6b88SsinceforYy    (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm
86915ed99a7SXuan Hu
87015ed99a7SXuan Hu  private val exceptionVI =
87115ed99a7SXuan Hu    io.fromCSR.virtualInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence ||
87215ed99a7SXuan Hu    io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
87315ed99a7SXuan Hu    io.fromCSR.virtualInst.hfence     && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) ||
87415ed99a7SXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
875b50a88ecSXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
876b50a88ecSXuan Hu    io.fromCSR.virtualInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType)
87715ed99a7SXuan Hu
8785a9dd560SXuan Hu  decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II)
87915ed99a7SXuan Hu  decodedInst.exceptionVec(virtualInstr) := exceptionVI
880d0de7e4aSpeixiaokun
8817e0f64b0SGuanghui Cheng  //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry.
8827e0f64b0SGuanghui Cheng  decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger)
8837e0f64b0SGuanghui Cheng
8843b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
885b0ae3ac4SLinJiawei    x => {
8867ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
887b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
888b0ae3ac4SLinJiawei      x._1 -> minBits
889b0ae3ac4SLinJiawei    }
890b0ae3ac4SLinJiawei  ))
891aac4464eSYinan Xu
8927531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
8937531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
8947531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
8957531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
8967531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
8977531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
8987531c765SXuan Hu
8997531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
90075e2c883SXuan Hu
90175e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
902be25371aSYikeZhou
9030bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
90439c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
90539c388b5SXuan Hu  private val narrowInsts = Seq(
90639c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
90739c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
90839c388b5SXuan Hu  )
90939c388b5SXuan Hu  private val maskDstInsts = Seq(
91039c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
91139c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
91239c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
9139eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
9149eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
9159eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
9169eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
917f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
91839c388b5SXuan Hu  )
91930fcc710SZiyue Zhang  private val maskOpInsts = Seq(
92030fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
92130fcc710SZiyue Zhang  )
92294e6af68SZiyue-Zhang  private val vmaInsts = Seq(
92394e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
92494e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
92594e6af68SZiyue-Zhang  )
926bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
927bdda74fdSxiaofeibao-xjtu    // opfff
928bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
929bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
930bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
931bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
932bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
933bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
934bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
935bdda74fdSxiaofeibao-xjtu    // opfvv
936bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
937bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
938bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
939bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
940bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
941bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
942bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
943bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
944bdda74fdSxiaofeibao-xjtu    // opfvf
945bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
946bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
947bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
948bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
949bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
950bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
951bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
952aab8ef9cSxiaofeibao-xjtu    // vfred
953aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
954bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
955bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
956bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
957bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
958bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
959b189aafaSzmx    FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H,
960ba899681Schengguanghui    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,
961ba899681Schengguanghui    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,
962ba899681Schengguanghui    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,
963ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
964*20b2b626SsinceforYy    // zfa
965*20b2b626SsinceforYy    FLEQ_H, FLEQ_S, FLEQ_D, FLTQ_H, FLTQ_S, FLTQ_D,
966*20b2b626SsinceforYy    FMINM_H, FMINM_S, FMINM_D, FMAXM_H, FMAXM_S, FMAXM_D,
967*20b2b626SsinceforYy    FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D,
968*20b2b626SsinceforYy    FCVTMOD_W_D,
969bdda74fdSxiaofeibao-xjtu  )
970689f6b88SsinceforYy
971689f6b88SsinceforYy  private val scalaNeedFrmInsts = Seq(
972689f6b88SsinceforYy    FADD_S, FSUB_S, FADD_D, FSUB_D,
973689f6b88SsinceforYy    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
974689f6b88SsinceforYy    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
975*20b2b626SsinceforYy    FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D,
976689f6b88SsinceforYy  )
977689f6b88SsinceforYy
978689f6b88SsinceforYy  private val vectorNeedFrmInsts = Seq (
979689f6b88SsinceforYy    VFSLIDE1UP_VF, VFSLIDE1DOWN_VF,
980689f6b88SsinceforYy  )
981689f6b88SsinceforYy
982bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
983689f6b88SsinceforYy  decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
984689f6b88SsinceforYy  decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
985bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
986bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
987bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
9883b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
989bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
990bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
991bdda74fdSxiaofeibao-xjtu  }.otherwise{
99275e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
99375e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
99475e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
99575e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
99675e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
99775e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
99875e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
999d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
100094e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
100139c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
1002b6279fc6SZiyue Zhang    val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
1003b6279fc6SZiyue Zhang    val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
1004b6279fc6SZiyue Zhang    val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
1005b6279fc6SZiyue Zhang    val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe
1006dab1ad8cSsinsanction    val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse
1007dab1ad8cSsinsanction    val isVlm = decodedInst.fuOpType === VlduType.vlm
1008d8ceb649SZiyue Zhang    val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV
100994e6af68SZiyue-Zhang    val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
1010dab1ad8cSsinsanction    val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew
1011b6279fc6SZiyue Zhang    decodedInst.vpu.isNarrow := isNarrow
1012b6279fc6SZiyue Zhang    decodedInst.vpu.isDstMask := isDstMask
1013b6279fc6SZiyue Zhang    decodedInst.vpu.isOpMask := isOpMask
101494e6af68SZiyue-Zhang    decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma
1015dab1ad8cSsinsanction    decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac
10165110577fSZiyue Zhang    decodedInst.vpu.vstart := io.enq.vstart
1017bdda74fdSxiaofeibao-xjtu  }
101806f0a37aSZiyue Zhang  decodedInst.vpu.specVill := io.enq.vtype.illegal
101906f0a37aSZiyue Zhang  decodedInst.vpu.specVma := io.enq.vtype.vma
102006f0a37aSZiyue Zhang  decodedInst.vpu.specVta := io.enq.vtype.vta
102106f0a37aSZiyue Zhang  decodedInst.vpu.specVsew := io.enq.vtype.vsew
102206f0a37aSZiyue Zhang  decodedInst.vpu.specVlmul := io.enq.vtype.vlmul
102375e2c883SXuan Hu
102431c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
102531c51290Szhanglinjuan
10266d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
10276d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
10286d56ac16Ssinsanction
10297f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
103087dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
103187dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
103206cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
103387dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
10340a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
1035c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
103606cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
1037c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
10387f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
1039ddc88dadSxiaofeibao  // numOfUop should be 1 when vector instruction is illegalInst
1040ddc88dadSxiaofeibao  io.deq.uopInfo.numOfUop := Mux(vecException.io.illegalInst, 1.U, uopInfoGen.io.out.uopInfo.numOfUop)
10413235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
10427f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
10437f9f0a79SzhanglyGit
1044cc1eb70dSXuan Hu  val isCSR = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U
1045cc1eb70dSXuan Hu  val isCSRR = isCSR && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U
1046cc1eb70dSXuan Hu  val isCSRW = isCSR && inst.FUNCT3 === BitPat("b?10") && inst.RD  === 0.U
1047cc1eb70dSXuan Hu  dontTouch(isCSRR)
1048cc1eb70dSXuan Hu  dontTouch(isCSRW)
1049cc1eb70dSXuan Hu
105087c5d21dSZiyue Zhang  // for csrr vl instruction, convert to vsetvl
1051cc1eb70dSXuan Hu  val isCsrrVlenb = isCSRR && inst.CSRIDX === CSRs.vlenb.U
1052cc1eb70dSXuan Hu  val isCsrrVl    = isCSRR && inst.CSRIDX === CSRs.vl.U
1053cc1eb70dSXuan Hu
1054ac17908cSHuijin Li  // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i)
1055ac17908cSHuijin Li  val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U
1056ac17908cSHuijin Li  val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W)
1057ac17908cSHuijin Li  val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W)
1058ac17908cSHuijin Li  val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W)
1059ac17908cSHuijin Li
1060*20b2b626SsinceforYy  // for fli.s|fli.d instruction
1061*20b2b626SsinceforYy  val isFLI = inst.FUNCT7 === BitPat("b11110??") && inst.RS2 === 1.U && inst.RM === 0.U && inst.OPCODE5Bit === OPCODE5Bit.OP_FP
1062*20b2b626SsinceforYy
106387c5d21dSZiyue Zhang  when (isCsrrVl) {
106463cb3754SZiyue Zhang    // convert to vsetvl instruction
106587c5d21dSZiyue Zhang    decodedInst.srcType(0) := SrcType.no
106687c5d21dSZiyue Zhang    decodedInst.srcType(1) := SrcType.no
106787c5d21dSZiyue Zhang    decodedInst.srcType(2) := SrcType.no
106887c5d21dSZiyue Zhang    decodedInst.srcType(3) := SrcType.no
106987c5d21dSZiyue Zhang    decodedInst.srcType(4) := SrcType.vp
107087c5d21dSZiyue Zhang    decodedInst.lsrc(4)    := Vl_IDX.U
107163cb3754SZiyue Zhang    decodedInst.waitForward   := false.B
107287c5d21dSZiyue Zhang    decodedInst.blockBackward := false.B
10738c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
107463cb3754SZiyue Zhang  }.elsewhen (isCsrrVlenb) {
107563cb3754SZiyue Zhang    // convert to addi instruction
1076828a8a48SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1077828a8a48SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
107863cb3754SZiyue Zhang    decodedInst.srcType(2) := SrcType.no
107963cb3754SZiyue Zhang    decodedInst.srcType(3) := SrcType.no
108063cb3754SZiyue Zhang    decodedInst.srcType(4) := SrcType.no
108163cb3754SZiyue Zhang    decodedInst.selImm := SelImm.IMM_I
108263cb3754SZiyue Zhang    decodedInst.waitForward := false.B
108363cb3754SZiyue Zhang    decodedInst.blockBackward := false.B
108463cb3754SZiyue Zhang    decodedInst.canRobCompress := true.B
10858c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
1086ac17908cSHuijin Li  }.elsewhen (isPreW || isPreR || isPreI) {
1087ac17908cSHuijin Li    decodedInst.selImm := SelImm.IMM_S
1088ac17908cSHuijin Li    decodedInst.fuType := FuType.ldu.U
1089ac17908cSHuijin Li    decodedInst.canRobCompress := false.B
1090ac17908cSHuijin Li    decodedInst.fuOpType := Mux1H(Seq(
1091ac17908cSHuijin Li      isPreW -> LSUOpType.prefetch_w,
1092ac17908cSHuijin Li      isPreR -> LSUOpType.prefetch_r,
1093ac17908cSHuijin Li      isPreI -> LSUOpType.prefetch_i,
1094ac17908cSHuijin Li    ))
1095499d2763SZiyue Zhang  }.elsewhen (isZimop) {
1096499d2763SZiyue Zhang    // set srcType for zimop
1097499d2763SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1098499d2763SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
1099499d2763SZiyue Zhang    // use x0 as src1
1100499d2763SZiyue Zhang    decodedInst.lsrc(0) := 0.U
110187c5d21dSZiyue Zhang  }
110287c5d21dSZiyue Zhang
110375e2c883SXuan Hu  io.deq.decodedInst := decodedInst
11049faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
1105985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
1106cc1eb70dSXuan Hu    // keep condition
1107cc1eb70dSXuan Hu    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType,
110887c5d21dSZiyue Zhang    (isCsrrVl) -> FuType.vsetfwf.U,
110963cb3754SZiyue Zhang    (isCsrrVlenb) -> FuType.alu.U,
1110cc1eb70dSXuan Hu
1111cc1eb70dSXuan Hu    // change vlsu to vseglsu when NF =/= 0.U
1112f94f6503SXuan 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,
1113f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
1114f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
1115f94f6503SXuan 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,
1116f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
1117f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
1118f94f6503SXuan 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,
1119985804e6SXuan Hu  ))
1120499d2763SZiyue Zhang  io.deq.decodedInst.imm := MuxCase(decodedInst.imm, Seq(
1121499d2763SZiyue Zhang    isCsrrVlenb -> (VLEN / 8).U,
1122499d2763SZiyue Zhang    isZimop     -> 0.U,
1123499d2763SZiyue Zhang  ))
1124cc1eb70dSXuan Hu
11254fe0a83eSXuan Hu  io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq(
1126cc1eb70dSXuan Hu    isCsrrVl    -> VSETOpType.csrrvl,
1127cc1eb70dSXuan Hu    isCsrrVlenb -> ALUOpType.add,
1128*20b2b626SsinceforYy    isFLI       -> Cat(1.U, inst.FMT, inst.RS1),
11294fe0a83eSXuan Hu  ))
11304fe0a83eSXuan Hu
11314fe0a83eSXuan Hu  io.deq.decodedInst.blockBackward := MuxCase(decodedInst.blockBackward, Seq(
11324fe0a83eSXuan Hu    isCSRR -> false.B,
1133cc1eb70dSXuan Hu  ))
1134be25371aSYikeZhou  //-------------------------------------------------------------
1135be25371aSYikeZhou  // Debug Info
11363b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
11373b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
11383b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
11393b739f49SXuan 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",
11403b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
11413b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
11423b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
11433b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
11443b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
11453b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
11463b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
11473b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
1148be25371aSYikeZhou}
1149