xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 499d27637f60e4d83da0354dd511fc584a2ab93f)
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
35*499d2763SZiyue Zhangimport xiangshan.backend.decode.Zimop._
36be25371aSYikeZhou
37be25371aSYikeZhou/**
38be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
39be25371aSYikeZhou */
40be25371aSYikeZhouabstract trait DecodeConstants {
41361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
4257a10886SXuan Hu  def X = BitPat("b0")
434d24c305SYikeZhou  def N = BitPat("b0")
444d24c305SYikeZhou  def Y = BitPat("b1")
4557a10886SXuan Hu  def T = true
4657a10886SXuan Hu  def F = false
474d24c305SYikeZhou
48c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
4920e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
504d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
5157a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
5257a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
5357a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5457a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5557a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
5689cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  canRobCompress
5789cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  uopSplitType
5889cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  |             selImm
5989cc69c1STang 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
604d24c305SYikeZhou
6157a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
6257a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
63be25371aSYikeZhou}
64be25371aSYikeZhou
65c2a8ae00SYikeZhoutrait DecodeUnitConstants
664d24c305SYikeZhou{
674d24c305SYikeZhou  // abstract out instruction decode magic numbers
684d24c305SYikeZhou  val RD_MSB  = 11
694d24c305SYikeZhou  val RD_LSB  = 7
704d24c305SYikeZhou  val RS1_MSB = 19
714d24c305SYikeZhou  val RS1_LSB = 15
724d24c305SYikeZhou  val RS2_MSB = 24
734d24c305SYikeZhou  val RS2_LSB = 20
744d24c305SYikeZhou  val RS3_MSB = 31
754d24c305SYikeZhou  val RS3_LSB = 27
764d24c305SYikeZhou}
774d24c305SYikeZhou
78be25371aSYikeZhou/**
79be25371aSYikeZhou * Decoded control signals
804d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
81be25371aSYikeZhou */
82c2a8ae00SYikeZhou
8357a10886SXuan Huabstract class XSDecodeBase {
8457a10886SXuan Hu  def X = BitPat("b?")
8557a10886SXuan Hu  def N = BitPat("b0")
8657a10886SXuan Hu  def Y = BitPat("b1")
8757a10886SXuan Hu  def T = true
8857a10886SXuan Hu  def F = false
8957a10886SXuan Hu  def generate() : List[BitPat]
9057a10886SXuan Hu}
9157a10886SXuan Hu
9257a10886SXuan Hucase class XSDecode(
9357a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
94239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat,
95e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9657a10886SXuan Hu  xWen: Boolean = false,
9757a10886SXuan Hu  fWen: Boolean = false,
9857a10886SXuan Hu  vWen: Boolean = false,
9957a10886SXuan Hu  mWen: Boolean = false,
10057a10886SXuan Hu  xsTrap: Boolean = false,
10157a10886SXuan Hu  noSpec: Boolean = false,
10257a10886SXuan Hu  blockBack: Boolean = false,
10357a10886SXuan Hu  flushPipe: Boolean = false,
10489cc69c1STang Haojin  canRobCompress: Boolean = false,
10557a10886SXuan Hu) extends XSDecodeBase {
10657a10886SXuan Hu  def generate() : List[BitPat] = {
10789cc69c1STang 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)
10857a10886SXuan Hu  }
10957a10886SXuan Hu}
11057a10886SXuan Hu
11157a10886SXuan Hucase class FDecode(
11257a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
113239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X,
11417ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
11557a10886SXuan Hu  xWen: Boolean = false,
11657a10886SXuan Hu  fWen: Boolean = false,
11757a10886SXuan Hu  vWen: Boolean = false,
11857a10886SXuan Hu  mWen: Boolean = false,
11957a10886SXuan Hu  xsTrap: Boolean = false,
12057a10886SXuan Hu  noSpec: Boolean = false,
12157a10886SXuan Hu  blockBack: Boolean = false,
12257a10886SXuan Hu  flushPipe: Boolean = false,
12389cc69c1STang Haojin  canRobCompress: Boolean = false,
12457a10886SXuan Hu) extends XSDecodeBase {
12557a10886SXuan Hu  def generate() : List[BitPat] = {
12689cc69c1STang Haojin    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate()
12757a10886SXuan Hu  }
12857a10886SXuan Hu}
12957a10886SXuan Hu
130be25371aSYikeZhou/**
131be25371aSYikeZhou * Overall Decode constants
132be25371aSYikeZhou */
133be25371aSYikeZhouobject XDecode extends DecodeConstants {
13457a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
135768f5f91SYangyu Chen    // RV32I
13657a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
13757a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
13857a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
13957a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
14057a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
14157a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
14257a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
14357a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
14489cc69c1STang Haojin    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T),
14589cc69c1STang Haojin    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T),
14689cc69c1STang Haojin    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T),
14789cc69c1STang Haojin    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T, canRobCompress = T),
14889cc69c1STang Haojin    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T),
14989cc69c1STang Haojin    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T),
15089cc69c1STang Haojin    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T),
15189cc69c1STang Haojin    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T, canRobCompress = T),
15289cc69c1STang Haojin    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T, canRobCompress = T),
15389cc69c1STang Haojin    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T, canRobCompress = T),
15489cc69c1STang Haojin    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T, canRobCompress = T),
15589cc69c1STang Haojin    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T, canRobCompress = T),
15689cc69c1STang Haojin    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T, canRobCompress = T),
15789cc69c1STang Haojin    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T, canRobCompress = T),
15889cc69c1STang Haojin    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T, canRobCompress = T),
15989cc69c1STang Haojin    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T, canRobCompress = T),
16089cc69c1STang Haojin    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T, canRobCompress = T),
1614d24c305SYikeZhou
162768f5f91SYangyu Chen    // RV64I (extend from RV32I)
163768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
164768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
165768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
166768f5f91SYangyu Chen
167768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
168768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
169768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
170768f5f91SYangyu Chen
171768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
172768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
173768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
174768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
175768f5f91SYangyu Chen
176768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
177768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
178768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
179768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
180768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
181768f5f91SYangyu Chen
182768f5f91SYangyu Chen    // RV64M
18389cc69c1STang Haojin    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T, canRobCompress = T),
18489cc69c1STang Haojin    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T, canRobCompress = T),
18589cc69c1STang Haojin    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T),
18689cc69c1STang Haojin    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T),
18789cc69c1STang Haojin    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T, canRobCompress = T),
1884d24c305SYikeZhou
18989cc69c1STang Haojin    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T, canRobCompress = T),
19089cc69c1STang Haojin    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T, canRobCompress = T),
19189cc69c1STang Haojin    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T, canRobCompress = T),
19289cc69c1STang Haojin    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T, canRobCompress = T),
19389cc69c1STang Haojin    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T, canRobCompress = T),
19489cc69c1STang Haojin    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T),
19589cc69c1STang Haojin    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T, canRobCompress = T),
19689cc69c1STang Haojin    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T),
1974d24c305SYikeZhou
198f7af4c74Schengguanghui    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
19957a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
2005110577fSZiyue Zhang    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T),
2013b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
2023b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
2033b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2043b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2053b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2063b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2074d24c305SYikeZhou
208768f5f91SYangyu Chen    // System, the immediate12 holds the CSR register.
20940ac5bb1SXuan Hu
210fa16cf81Slewislzh    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
211fa16cf81Slewislzh    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
212fa16cf81Slewislzh    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2134d24c305SYikeZhou
21457a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21557a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21657a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2174d24c305SYikeZhou
21857a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21957a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22057a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22157a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22257a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22357a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2244d24c305SYikeZhou
22557a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22657a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22757a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2284d24c305SYikeZhou
229768f5f91SYangyu Chen    // RV64A
23057a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23157a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23257a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23357a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23457a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23557a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23657a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23757a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23857a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2394d24c305SYikeZhou
24057a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24157a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24257a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24357a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24457a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24557a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24757a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24857a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2494d24c305SYikeZhou
25057a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25157a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25257a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25357a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
254768f5f91SYangyu Chen  )
255768f5f91SYangyu Chen}
256ee8ff153Szfw
257768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
258768f5f91SYangyu Chen  /*
259768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
260768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
261768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
262768f5f91SYangyu Chen   */
263768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
264768f5f91SYangyu Chen    // Zba
265768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
266768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
267768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
268768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
269768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
270768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
271768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
272768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
273768f5f91SYangyu Chen
274768f5f91SYangyu Chen    // Zbb
27589cc69c1STang Haojin    ANDN      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn    , SelImm.X    , xWen = T, canRobCompress = T),
27689cc69c1STang Haojin    ORN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn     , SelImm.X    , xWen = T, canRobCompress = T),
27789cc69c1STang Haojin    XNOR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor    , SelImm.X    , xWen = T, canRobCompress = T),
278ee8ff153Szfw
279768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
280768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
281768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
282768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
283768f5f91SYangyu Chen
284768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
285768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
286768f5f91SYangyu Chen
28789cc69c1STang Haojin    MAX       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max     , SelImm.X    , xWen = T, canRobCompress = T),
28889cc69c1STang Haojin    MAXU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu    , SelImm.X    , xWen = T, canRobCompress = T),
289768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
290768f5f91SYangyu Chen    MINU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu    , SelImm.X    , xWen = T, canRobCompress = T),
291ee8ff153Szfw
29289cc69c1STang Haojin    SEXT_B    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb   , SelImm.X    , xWen = T, canRobCompress = T),
29389cc69c1STang Haojin    SEXT_H    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth   , SelImm.X    , xWen = T, canRobCompress = T),
294768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
295768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
296ee8ff153Szfw
297768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
298768f5f91SYangyu Chen    ROLW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw    , SelImm.X    , xWen = T, canRobCompress = T),
29989cc69c1STang Haojin    ROR       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.X    , xWen = T, canRobCompress = T),
30089cc69c1STang Haojin    RORI      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.IMM_I, xWen = T, canRobCompress = T),
301768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
302768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
303ee8ff153Szfw
304768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
305768f5f91SYangyu Chen
306768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
307768f5f91SYangyu Chen
308768f5f91SYangyu Chen    // Zbc
309768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
310768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
311768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
312768f5f91SYangyu Chen
313768f5f91SYangyu Chen    // Zbs
314768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
315768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
316768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
317768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
318768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
319768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
320768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
321768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
322768f5f91SYangyu Chen
323768f5f91SYangyu Chen    // Zbkb
324768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
325768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
326768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
327768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
328768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
329768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
330768f5f91SYangyu Chen
331768f5f91SYangyu Chen    // Zbkc
332768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
333768f5f91SYangyu Chen
334768f5f91SYangyu Chen    // Zbkx
335768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
336768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
337768f5f91SYangyu Chen  )
338768f5f91SYangyu Chen}
339768f5f91SYangyu Chen
340768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
341768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
342768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
343768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
344768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
345768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
346768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
347768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
348768f5f91SYangyu Chen
349768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
350768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
351768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
352768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
353768f5f91SYangyu Chen
354768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
355768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
356768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
357768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
358768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
359768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
360768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
361768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
362768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
363768f5f91SYangyu Chen
364768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
365768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
366768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
367768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
368768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
369768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
370768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
371768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
372768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
373768f5f91SYangyu Chen
374768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
375768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
376768f5f91SYangyu Chen    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1     , SelImm.X    , xWen = T, canRobCompress = T),
3774d24c305SYikeZhou  )
378be25371aSYikeZhou}
379be25371aSYikeZhou
380be25371aSYikeZhou/**
381be25371aSYikeZhou * FP Decode constants
382be25371aSYikeZhou */
38357a10886SXuan Huobject FpDecode extends DecodeConstants{
38457a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
385b189aafaSzmx    FLH     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T),
38657a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
38757a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
388b189aafaSzmx    FSH     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S          ),
38957a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
39057a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3914d24c305SYikeZhou
392964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
393964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
394b189aafaSzmx    FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T),
395c2a8ae00SYikeZhou
3964d24c305SYikeZhou    // Int to FP
39789cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39889cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39989cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40089cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4014d24c305SYikeZhou
40289cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40389cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40489cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40589cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4064d24c305SYikeZhou
4074d24c305SYikeZhou  )
408be25371aSYikeZhou}
409be25371aSYikeZhou
410be25371aSYikeZhou/**
411be25371aSYikeZhou * FP Divide SquareRoot Constants
412be25371aSYikeZhou */
413be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
41457a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
41589cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41689cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41789cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41889cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4194d24c305SYikeZhou  )
420be25371aSYikeZhou}
421be25371aSYikeZhou
4224d24c305SYikeZhou/**
423af2f7849Shappy-lx * Svinval extension Constants
424af2f7849Shappy-lx */
425af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
42657a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
427af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
428af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
429af2f7849Shappy-lx     */
43057a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
431af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
432af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
433af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
434af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
435af2f7849Shappy-lx     */
43657a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
437af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
438af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
439af2f7849Shappy-lx     * then dispatch and issue this instrucion
440af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
441af2f7849Shappy-lx     */
44257a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
443af2f7849Shappy-lx    /* what is Svinval extension ?
444af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
445af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
446af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
447af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
448af2f7849Shappy-lx     *
449af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
450af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
451af2f7849Shappy-lx     */
452af2f7849Shappy-lx  )
453af2f7849Shappy-lx}
45457a10886SXuan Hu
455af2f7849Shappy-lx/*
456ca18a0b4SWilliam Wang * CBO decode
457ca18a0b4SWilliam Wang */
458ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
45957a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
46057a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
46157a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
46257a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
46357a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
464ca18a0b4SWilliam Wang  )
465ca18a0b4SWilliam Wang}
466ca18a0b4SWilliam Wang
467d0de7e4aSpeixiaokun/*
468d0de7e4aSpeixiaokun * Hypervisor decode
469d0de7e4aSpeixiaokun */
470d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
471e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
472e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
473e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
474e25e4d90SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X),
475e25e4d90SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X),
476e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
477e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
478e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
479e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
480e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
481e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
482e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
483e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
484e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
485e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
486e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
487e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
488e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
489d0de7e4aSpeixiaokun  )
490d0de7e4aSpeixiaokun}
491d0de7e4aSpeixiaokun
492545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
493545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
494545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
495545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
496545d7be0SYangyu Chen  )
497545d7be0SYangyu Chen}
498545d7be0SYangyu Chen
499ca18a0b4SWilliam Wang/**
500*499d2763SZiyue Zhang  * "Zimop" Extension for May-Be-Operations
501*499d2763SZiyue Zhang  */
502*499d2763SZiyue Zhangobject ZimopDecode extends DecodeConstants {
503*499d2763SZiyue Zhang  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
504*499d2763SZiyue Zhang    // temp use addi to decode MOP_R and MOP_RR
505*499d2763SZiyue Zhang    MOP_R  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
506*499d2763SZiyue Zhang    MOP_RR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T),
507*499d2763SZiyue Zhang  )
508*499d2763SZiyue Zhang}
509*499d2763SZiyue Zhang
510*499d2763SZiyue Zhang/**
5114d24c305SYikeZhou * XiangShan Trap Decode constants
5124d24c305SYikeZhou */
5134d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
514361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
51557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
51657a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
5174d24c305SYikeZhou  )
5184d24c305SYikeZhou}
519be25371aSYikeZhou
52049f433deSXuan Huabstract class Imm(val len: Int) {
521b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
522b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
523b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
524b0ae3ac4SLinJiawei}
525b0ae3ac4SLinJiawei
526b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
527fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
528b0ae3ac4SLinJiawei
529b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
530b0ae3ac4SLinJiawei    Cat(instr(31, 20))
531b0ae3ac4SLinJiawei}
532b0ae3ac4SLinJiawei
533b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
534b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
535b0ae3ac4SLinJiawei
536b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
537b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
538b0ae3ac4SLinJiawei}
539b0ae3ac4SLinJiawei
540b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
541b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
542b0ae3ac4SLinJiawei
543b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
544b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
545b0ae3ac4SLinJiawei}
546b0ae3ac4SLinJiawei
547b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
548fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
549b0ae3ac4SLinJiawei
550b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
551b0ae3ac4SLinJiawei    instr(31, 12)
552c2a8ae00SYikeZhou  }
553c2a8ae00SYikeZhou}
554c2a8ae00SYikeZhou
555b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
556b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
557b0ae3ac4SLinJiawei
558b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
559b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
560b0ae3ac4SLinJiawei  }
561b0ae3ac4SLinJiawei}
562b0ae3ac4SLinJiawei
563fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){
564b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
565b0ae3ac4SLinJiawei
566b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
567fa16cf81Slewislzh    Cat(instr(11, 7), instr(19, 15), instr(31, 20))
568b0ae3ac4SLinJiawei  }
56992c61038SXuan Hu
57092c61038SXuan Hu  def getCSRAddr(imm: UInt): UInt = {
57192c61038SXuan Hu    require(imm.getWidth == this.len)
57292c61038SXuan Hu    imm(11, 0)
57392c61038SXuan Hu  }
57492c61038SXuan Hu
57592c61038SXuan Hu  def getRS1(imm: UInt): UInt = {
57692c61038SXuan Hu    require(imm.getWidth == this.len)
57792c61038SXuan Hu    imm(16, 12)
57892c61038SXuan Hu  }
57992c61038SXuan Hu
58092c61038SXuan Hu  def getRD(imm: UInt): UInt = {
58192c61038SXuan Hu    require(imm.getWidth == this.len)
58292c61038SXuan Hu    imm(21, 17)
58392c61038SXuan Hu  }
58492c61038SXuan Hu
58592c61038SXuan Hu  def getImm5(imm: UInt): UInt = {
58692c61038SXuan Hu    require(imm.getWidth == this.len)
58792c61038SXuan Hu    imm(16, 12)
58892c61038SXuan Hu  }
589b0ae3ac4SLinJiawei}
590b0ae3ac4SLinJiawei
591ee8ff153Szfwcase class Imm_B6() extends Imm(6){
592ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
593ee8ff153Szfw
594ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
595ee8ff153Szfw    instr(25, 20)
596ee8ff153Szfw  }
597ee8ff153Szfw}
598ee8ff153Szfw
59958c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
60058c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
60158c35d23Shuxuan0307
60258c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
60358c35d23Shuxuan0307    instr(19, 15)
60458c35d23Shuxuan0307  }
60558c35d23Shuxuan0307}
606b52d4755SXuan Hu
60758c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
60858c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
60958c35d23Shuxuan0307
61058c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
61158c35d23Shuxuan0307    instr(19, 15)
61258c35d23Shuxuan0307  }
61358c35d23Shuxuan0307}
614b52d4755SXuan Hu
6154aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
6164aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6174aa9ed34Sfdy
6184aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6194aa9ed34Sfdy    instr(30, 20)
6204aa9ed34Sfdy  }
621e6ac7fe1SZiyue Zhang  /**
622e6ac7fe1SZiyue Zhang    * get VType from extended imm
623e6ac7fe1SZiyue Zhang    * @param extedImm
624e6ac7fe1SZiyue Zhang    * @return VType
625e6ac7fe1SZiyue Zhang    */
626e6ac7fe1SZiyue Zhang  def getVType(extedImm: UInt): InstVType = {
627e6ac7fe1SZiyue Zhang    val vtype = Wire(new InstVType)
628e6ac7fe1SZiyue Zhang    vtype := extedImm(10, 0).asTypeOf(new InstVType)
629e6ac7fe1SZiyue Zhang    vtype
630e6ac7fe1SZiyue Zhang  }
6314aa9ed34Sfdy}
632b52d4755SXuan Hu
633e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){
6344aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6354aa9ed34Sfdy
6364aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6375c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
638b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
639e6ac7fe1SZiyue Zhang    val vtype8 = rvInst.ZIMM_VSETIVLI
640b52d4755SXuan Hu    Cat(uimm5, vtype8)
641b52d4755SXuan Hu  }
642b52d4755SXuan Hu  /**
643b52d4755SXuan Hu    * get VType from extended imm
644b52d4755SXuan Hu    * @param extedImm
645b52d4755SXuan Hu    * @return VType
646b52d4755SXuan Hu    */
647b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
648b52d4755SXuan Hu    val vtype = Wire(new InstVType)
649e6ac7fe1SZiyue Zhang    vtype := extedImm(9, 0).asTypeOf(new InstVType)
650b52d4755SXuan Hu    vtype
651b52d4755SXuan Hu  }
652b52d4755SXuan Hu
653b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
654e6ac7fe1SZiyue Zhang    extedImm(14, 10)
6554aa9ed34Sfdy  }
6564aa9ed34Sfdy}
657fe528fd6Ssinsanction
658fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
659fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
660fe528fd6Ssinsanction
661fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
662fe528fd6Ssinsanction    instr(31, 0)
663fe528fd6Ssinsanction  }
664fe528fd6Ssinsanction}
665fe528fd6Ssinsanction
6667e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
6677e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
6687e30d16cSZhaoyang You
6697e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
6707e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
6717e30d16cSZhaoyang You  }
6727e30d16cSZhaoyang You}
6737e30d16cSZhaoyang You
674b0ae3ac4SLinJiaweiobject ImmUnion {
675b0ae3ac4SLinJiawei  val I = Imm_I()
676b0ae3ac4SLinJiawei  val S = Imm_S()
677b0ae3ac4SLinJiawei  val B = Imm_B()
678b0ae3ac4SLinJiawei  val U = Imm_U()
679b0ae3ac4SLinJiawei  val J = Imm_J()
680b0ae3ac4SLinJiawei  val Z = Imm_Z()
681ee8ff153Szfw  val B6 = Imm_B6()
68258c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
68358c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
6844aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
6854aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
686fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
6877e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
6884aa9ed34Sfdy
689520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
6907e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
691b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
692b0ae3ac4SLinJiawei  val immSelMap = Seq(
693b0ae3ac4SLinJiawei    SelImm.IMM_I,
694b0ae3ac4SLinJiawei    SelImm.IMM_S,
695b0ae3ac4SLinJiawei    SelImm.IMM_SB,
696b0ae3ac4SLinJiawei    SelImm.IMM_U,
697b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
698ee8ff153Szfw    SelImm.IMM_Z,
69958c35d23Shuxuan0307    SelImm.IMM_B6,
70058c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
7014aa9ed34Sfdy    SelImm.IMM_OPIVIU,
7024aa9ed34Sfdy    SelImm.IMM_VSETVLI,
703fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
7047e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
705b0ae3ac4SLinJiawei  ).zip(imms)
706b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
707b0ae3ac4SLinJiawei}
708b0ae3ac4SLinJiawei
709fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
710fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
711fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
712765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
713fd7603d9SYinan Xu  }
7143b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
715fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
7163b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
717f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
718fd7603d9SYinan Xu  }
719fd7603d9SYinan Xu}
720b0ae3ac4SLinJiawei
721be25371aSYikeZhou/**
722be25371aSYikeZhou * IO bundle for the Decode unit
723be25371aSYikeZhou */
724aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
725aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
726aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
727aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
728aaa08c5aSxiaofeibao-xjtu}
7292225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
7303b739f49SXuan Hu  val enq = new Bundle {
7313b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
732d91483a6Sfdy    val vtype = Input(new VType)
7335110577fSZiyue Zhang    val vstart = Input(Vl())
7344aa9ed34Sfdy  }
7353b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
736aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
737af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
73815ed99a7SXuan Hu  val fromCSR = Input(new CSRToDecode)
739be25371aSYikeZhou}
740be25371aSYikeZhou
741be25371aSYikeZhou/**
742be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
743be25371aSYikeZhou */
7442225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
745be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
746be25371aSYikeZhou
7473b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
748be25371aSYikeZhou
74975e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
75075e2c883SXuan Hu
75157a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
75257a10886SXuan Hu    FpDecode.table ++
753bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
754768f5f91SYangyu Chen    BitmanipDecode.table ++
755768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
756a19215ddSYinan Xu    XSTrapDecode.table ++
757a19215ddSYinan Xu    CBODecode.table ++
758b65b9ebaSXuan Hu    SvinvalDecode.table ++
759e25e4d90SXuan Hu    HypervisorDecode.table ++
760545d7be0SYangyu Chen    VecDecoder.table ++
761*499d2763SZiyue Zhang    ZicondDecode.table ++
762*499d2763SZiyue Zhang    ZimopDecode.table
763b65b9ebaSXuan Hu
76489cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
765a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
766239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
767a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
768a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
769be25371aSYikeZhou
7704d24c305SYikeZhou  // output
7713b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
772be25371aSYikeZhou
7732ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
7747ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
7753b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
776ec427417Slinzhida  decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags
7771a1319cbSLinJiawei
7783b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
7793b739f49SXuan Hu
780a8db15d8Sfdy  decodedInst.uopIdx := 0.U
781d91483a6Sfdy  decodedInst.firstUop := true.B
782d91483a6Sfdy  decodedInst.lastUop := true.B
783f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
7843235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
785deb6421eSHaojin Tang
786*499d2763SZiyue Zhang  val isZimop = (BitPat("b1?00??0111??_?????_100_?????_1110011") === ctrl_flow.instr) ||
787*499d2763SZiyue Zhang                (BitPat("b1?00??1?????_?????_100_?????_1110011") === ctrl_flow.instr)
788*499d2763SZiyue Zhang
78973c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
790*499d2763SZiyue Zhang  // temp decode zimop as move
791*499d2763SZiyue Zhang  decodedInst.isMove := (isMove || isZimop) && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
79273c4359eSYikeZhou
79349a2cda2SXuan Hu  // fmadd - b1000011
79449a2cda2SXuan Hu  // fmsub - b1000111
79549a2cda2SXuan Hu  // fnmsub- b1001011
79649a2cda2SXuan Hu  // fnmadd- b1001111
79749a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
798e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
799e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
80049a2cda2SXuan Hu
801178dd38cSYikeZhou  // read src1~3 location
80298cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
80398cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
80449a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
80549a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
8069c5a1080Sxiaofeibao  decodedInst.lsrc(3) := V0_IDX.U
8079c5a1080Sxiaofeibao  decodedInst.lsrc(4) := Vl_IDX.U
808b6b11f60SXuan Hu
809178dd38cSYikeZhou  // read dest location
81098cfe81bSxgkiri  decodedInst.ldest := inst.RD
8114d24c305SYikeZhou
812e4e68f86Sxiaofeibao  // init v0Wen vlWen
813e4e68f86Sxiaofeibao  decodedInst.v0Wen := false.B
814e4e68f86Sxiaofeibao  decodedInst.vlWen := false.B
815e4e68f86Sxiaofeibao
816c2a8ae00SYikeZhou  // fill in exception vector
817567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
818567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
819567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
820bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
8215110577fSZiyue Zhang  vecException.io.vstart := decodedInst.vpu.vstart
8224d24c305SYikeZhou
82315ed99a7SXuan Hu  private val exceptionII =
82415ed99a7SXuan Hu    decodedInst.selImm === SelImm.INVALID_INSTR ||
82515ed99a7SXuan Hu    vecException.io.illegalInst ||
82615ed99a7SXuan Hu    io.fromCSR.illegalInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence  ||
82715ed99a7SXuan Hu    io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
82815ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g ||
82915ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v ||
83015ed99a7SXuan Hu    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
8318b7dc6f5SsinceforYy    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
8328b7dc6f5SsinceforYy    io.fromCSR.illegalInst.fsIsOff    && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) ||
8338b7dc6f5SsinceforYy                                          (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) ||
834d60bfe5aSsinceforYy                                           FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) ||
835d60bfe5aSsinceforYy                                           isVecOPF) ||
836b50a88ecSXuan Hu    io.fromCSR.illegalInst.vsIsOff    && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) ||
837689f6b88SsinceforYy    io.fromCSR.illegalInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType) ||
838689f6b88SsinceforYy    (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)) ||
839689f6b88SsinceforYy    (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm
84015ed99a7SXuan Hu
84115ed99a7SXuan Hu  private val exceptionVI =
84215ed99a7SXuan Hu    io.fromCSR.virtualInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence ||
84315ed99a7SXuan Hu    io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
84415ed99a7SXuan Hu    io.fromCSR.virtualInst.hfence     && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) ||
84515ed99a7SXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
846b50a88ecSXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
847b50a88ecSXuan Hu    io.fromCSR.virtualInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType)
84815ed99a7SXuan Hu
8495a9dd560SXuan Hu  decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II)
85015ed99a7SXuan Hu  decodedInst.exceptionVec(virtualInstr) := exceptionVI
851d0de7e4aSpeixiaokun
8527e0f64b0SGuanghui Cheng  //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry.
8537e0f64b0SGuanghui Cheng  decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger)
8547e0f64b0SGuanghui Cheng
8553b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
856b0ae3ac4SLinJiawei    x => {
8577ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
858b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
859b0ae3ac4SLinJiawei      x._1 -> minBits
860b0ae3ac4SLinJiawei    }
861b0ae3ac4SLinJiawei  ))
862aac4464eSYinan Xu
8637531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
8647531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
8657531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
8667531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
8677531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
8687531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
8697531c765SXuan Hu
8707531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
87175e2c883SXuan Hu
87275e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
873be25371aSYikeZhou
8740bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
87539c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
87639c388b5SXuan Hu  private val narrowInsts = Seq(
87739c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
87839c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
87939c388b5SXuan Hu  )
88039c388b5SXuan Hu  private val maskDstInsts = Seq(
88139c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
88239c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
88339c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
8849eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
8859eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
8869eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
8879eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
888f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
88939c388b5SXuan Hu  )
89030fcc710SZiyue Zhang  private val maskOpInsts = Seq(
89130fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
89230fcc710SZiyue Zhang  )
89394e6af68SZiyue-Zhang  private val vmaInsts = Seq(
89494e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
89594e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
89694e6af68SZiyue-Zhang  )
897bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
898bdda74fdSxiaofeibao-xjtu    // opfff
899bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
900bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
901bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
902bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
903bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
904bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
905bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
906bdda74fdSxiaofeibao-xjtu    // opfvv
907bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
908bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
909bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
910bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
911bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
912bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
913bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
914bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
915bdda74fdSxiaofeibao-xjtu    // opfvf
916bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
917bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
918bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
919bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
920bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
921bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
922bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
923aab8ef9cSxiaofeibao-xjtu    // vfred
924aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
925bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
926bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
927bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
928bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
929bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
930b189aafaSzmx    FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H,
931ba899681Schengguanghui    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,
932ba899681Schengguanghui    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,
933ba899681Schengguanghui    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,
934ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
935bdda74fdSxiaofeibao-xjtu  )
936689f6b88SsinceforYy
937689f6b88SsinceforYy  private val scalaNeedFrmInsts = Seq(
938689f6b88SsinceforYy    FADD_S, FSUB_S, FADD_D, FSUB_D,
939689f6b88SsinceforYy    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
940689f6b88SsinceforYy    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
941689f6b88SsinceforYy  )
942689f6b88SsinceforYy
943689f6b88SsinceforYy  private val vectorNeedFrmInsts = Seq (
944689f6b88SsinceforYy    VFSLIDE1UP_VF, VFSLIDE1DOWN_VF,
945689f6b88SsinceforYy  )
946689f6b88SsinceforYy
947bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
948689f6b88SsinceforYy  decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
949689f6b88SsinceforYy  decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _)
950bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
951bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
952bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
9533b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
954bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
955bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
956bdda74fdSxiaofeibao-xjtu  }.otherwise{
95775e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
95875e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
95975e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
96075e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
96175e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
96275e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
96375e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
964d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
96594e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
96639c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
967b6279fc6SZiyue Zhang    val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
968b6279fc6SZiyue Zhang    val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
969b6279fc6SZiyue Zhang    val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
970b6279fc6SZiyue Zhang    val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe
971dab1ad8cSsinsanction    val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse
972dab1ad8cSsinsanction    val isVlm = decodedInst.fuOpType === VlduType.vlm
973d8ceb649SZiyue Zhang    val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV
97494e6af68SZiyue-Zhang    val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
975dab1ad8cSsinsanction    val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew
976b6279fc6SZiyue Zhang    decodedInst.vpu.isNarrow := isNarrow
977b6279fc6SZiyue Zhang    decodedInst.vpu.isDstMask := isDstMask
978b6279fc6SZiyue Zhang    decodedInst.vpu.isOpMask := isOpMask
97994e6af68SZiyue-Zhang    decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma
980dab1ad8cSsinsanction    decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac
9815110577fSZiyue Zhang    decodedInst.vpu.vstart := io.enq.vstart
982bdda74fdSxiaofeibao-xjtu  }
98306f0a37aSZiyue Zhang  decodedInst.vpu.specVill := io.enq.vtype.illegal
98406f0a37aSZiyue Zhang  decodedInst.vpu.specVma := io.enq.vtype.vma
98506f0a37aSZiyue Zhang  decodedInst.vpu.specVta := io.enq.vtype.vta
98606f0a37aSZiyue Zhang  decodedInst.vpu.specVsew := io.enq.vtype.vsew
98706f0a37aSZiyue Zhang  decodedInst.vpu.specVlmul := io.enq.vtype.vlmul
98875e2c883SXuan Hu
98931c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
99031c51290Szhanglinjuan
9916d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
9926d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
9936d56ac16Ssinsanction
9947f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
99587dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
99687dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
99706cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
99887dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
9990a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
1000c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
100106cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
1002c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
10037f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
1004ddc88dadSxiaofeibao  // numOfUop should be 1 when vector instruction is illegalInst
1005ddc88dadSxiaofeibao  io.deq.uopInfo.numOfUop := Mux(vecException.io.illegalInst, 1.U, uopInfoGen.io.out.uopInfo.numOfUop)
10063235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
10077f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
10087f9f0a79SzhanglyGit
1009cc1eb70dSXuan Hu  val isCSR = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U
1010cc1eb70dSXuan Hu  val isCSRR = isCSR && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U
1011cc1eb70dSXuan Hu  val isCSRW = isCSR && inst.FUNCT3 === BitPat("b?10") && inst.RD  === 0.U
1012cc1eb70dSXuan Hu  dontTouch(isCSRR)
1013cc1eb70dSXuan Hu  dontTouch(isCSRW)
1014cc1eb70dSXuan Hu
101587c5d21dSZiyue Zhang  // for csrr vl instruction, convert to vsetvl
1016cc1eb70dSXuan Hu  val isCsrrVlenb = isCSRR && inst.CSRIDX === CSRs.vlenb.U
1017cc1eb70dSXuan Hu  val isCsrrVl    = isCSRR && inst.CSRIDX === CSRs.vl.U
1018cc1eb70dSXuan Hu
1019ac17908cSHuijin Li  // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i)
1020ac17908cSHuijin Li  val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U
1021ac17908cSHuijin Li  val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W)
1022ac17908cSHuijin Li  val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W)
1023ac17908cSHuijin Li  val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W)
1024ac17908cSHuijin Li
102587c5d21dSZiyue Zhang  when (isCsrrVl) {
102663cb3754SZiyue Zhang    // convert to vsetvl instruction
102787c5d21dSZiyue Zhang    decodedInst.srcType(0) := SrcType.no
102887c5d21dSZiyue Zhang    decodedInst.srcType(1) := SrcType.no
102987c5d21dSZiyue Zhang    decodedInst.srcType(2) := SrcType.no
103087c5d21dSZiyue Zhang    decodedInst.srcType(3) := SrcType.no
103187c5d21dSZiyue Zhang    decodedInst.srcType(4) := SrcType.vp
103287c5d21dSZiyue Zhang    decodedInst.lsrc(4)    := Vl_IDX.U
103363cb3754SZiyue Zhang    decodedInst.waitForward   := false.B
103487c5d21dSZiyue Zhang    decodedInst.blockBackward := false.B
10358c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
103663cb3754SZiyue Zhang  }.elsewhen (isCsrrVlenb) {
103763cb3754SZiyue Zhang    // convert to addi instruction
1038828a8a48SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1039828a8a48SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
104063cb3754SZiyue Zhang    decodedInst.srcType(2) := SrcType.no
104163cb3754SZiyue Zhang    decodedInst.srcType(3) := SrcType.no
104263cb3754SZiyue Zhang    decodedInst.srcType(4) := SrcType.no
104363cb3754SZiyue Zhang    decodedInst.selImm := SelImm.IMM_I
104463cb3754SZiyue Zhang    decodedInst.waitForward := false.B
104563cb3754SZiyue Zhang    decodedInst.blockBackward := false.B
104663cb3754SZiyue Zhang    decodedInst.canRobCompress := true.B
10478c5acf73SsinceforYy    decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff
1048ac17908cSHuijin Li  }.elsewhen (isPreW || isPreR || isPreI) {
1049ac17908cSHuijin Li    decodedInst.selImm := SelImm.IMM_S
1050ac17908cSHuijin Li    decodedInst.fuType := FuType.ldu.U
1051ac17908cSHuijin Li    decodedInst.canRobCompress := false.B
1052ac17908cSHuijin Li    decodedInst.fuOpType := Mux1H(Seq(
1053ac17908cSHuijin Li      isPreW -> LSUOpType.prefetch_w,
1054ac17908cSHuijin Li      isPreR -> LSUOpType.prefetch_r,
1055ac17908cSHuijin Li      isPreI -> LSUOpType.prefetch_i,
1056ac17908cSHuijin Li    ))
1057*499d2763SZiyue Zhang  }.elsewhen (isZimop) {
1058*499d2763SZiyue Zhang    // set srcType for zimop
1059*499d2763SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
1060*499d2763SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
1061*499d2763SZiyue Zhang    // use x0 as src1
1062*499d2763SZiyue Zhang    decodedInst.lsrc(0) := 0.U
106387c5d21dSZiyue Zhang  }
106487c5d21dSZiyue Zhang
106575e2c883SXuan Hu  io.deq.decodedInst := decodedInst
10669faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
1067985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
1068cc1eb70dSXuan Hu    // keep condition
1069cc1eb70dSXuan Hu    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType,
107087c5d21dSZiyue Zhang    (isCsrrVl) -> FuType.vsetfwf.U,
107163cb3754SZiyue Zhang    (isCsrrVlenb) -> FuType.alu.U,
1072cc1eb70dSXuan Hu
1073cc1eb70dSXuan Hu    // change vlsu to vseglsu when NF =/= 0.U
1074f94f6503SXuan 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,
1075f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
1076f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
1077f94f6503SXuan 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,
1078f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
1079f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
1080f94f6503SXuan 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,
1081985804e6SXuan Hu  ))
1082*499d2763SZiyue Zhang  io.deq.decodedInst.imm := MuxCase(decodedInst.imm, Seq(
1083*499d2763SZiyue Zhang    isCsrrVlenb -> (VLEN / 8).U,
1084*499d2763SZiyue Zhang    isZimop     -> 0.U,
1085*499d2763SZiyue Zhang  ))
1086cc1eb70dSXuan Hu
10874fe0a83eSXuan Hu  io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq(
1088cc1eb70dSXuan Hu    isCsrrVl    -> VSETOpType.csrrvl,
1089cc1eb70dSXuan Hu    isCsrrVlenb -> ALUOpType.add,
10904fe0a83eSXuan Hu  ))
10914fe0a83eSXuan Hu
10924fe0a83eSXuan Hu  io.deq.decodedInst.blockBackward := MuxCase(decodedInst.blockBackward, Seq(
10934fe0a83eSXuan Hu    isCSRR -> false.B,
1094cc1eb70dSXuan Hu  ))
1095be25371aSYikeZhou  //-------------------------------------------------------------
1096be25371aSYikeZhou  // Debug Info
10973b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
10983b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
10993b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
11003b739f49SXuan 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",
11013b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
11023b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
11033b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
11043b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
11053b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
11063b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
11073b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
11083b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
1109be25371aSYikeZhou}
1110