xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 1be7b39a9640ffabacccf4307e32b993cd4b26c8)
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._
223b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._
236ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat
243c02ee8fSwakafaimport utility._
253b739f49SXuan Huimport utils._
26d0de7e4aSpeixiaokunimport xiangshan.ExceptionNO.{illegalInstr, virtualInstr}
276ab6918fSYinan Xuimport xiangshan._
28730cfbc0SXuan Huimport xiangshan.backend.fu.FuType
29730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst}
30*1be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions
315c1681d0SXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, XSInstBitFields}
325110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl}
33be25371aSYikeZhou
34be25371aSYikeZhou/**
35be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
36be25371aSYikeZhou */
37be25371aSYikeZhouabstract trait DecodeConstants {
38361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
3957a10886SXuan Hu  def X = BitPat("b0")
404d24c305SYikeZhou  def N = BitPat("b0")
414d24c305SYikeZhou  def Y = BitPat("b1")
4257a10886SXuan Hu  def T = true
4357a10886SXuan Hu  def F = false
444d24c305SYikeZhou
45c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
4620e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
474d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
4857a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
4957a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
5057a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5157a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5257a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
5389cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  canRobCompress
5489cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  uopSplitType
5589cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  |             selImm
5689cc69c1STang 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
574d24c305SYikeZhou
5857a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
5957a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
60be25371aSYikeZhou}
61be25371aSYikeZhou
62c2a8ae00SYikeZhoutrait DecodeUnitConstants
634d24c305SYikeZhou{
644d24c305SYikeZhou  // abstract out instruction decode magic numbers
654d24c305SYikeZhou  val RD_MSB  = 11
664d24c305SYikeZhou  val RD_LSB  = 7
674d24c305SYikeZhou  val RS1_MSB = 19
684d24c305SYikeZhou  val RS1_LSB = 15
694d24c305SYikeZhou  val RS2_MSB = 24
704d24c305SYikeZhou  val RS2_LSB = 20
714d24c305SYikeZhou  val RS3_MSB = 31
724d24c305SYikeZhou  val RS3_LSB = 27
734d24c305SYikeZhou}
744d24c305SYikeZhou
75be25371aSYikeZhou/**
76be25371aSYikeZhou * Decoded control signals
774d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
78be25371aSYikeZhou */
79c2a8ae00SYikeZhou
8057a10886SXuan Huabstract class XSDecodeBase {
8157a10886SXuan Hu  def X = BitPat("b?")
8257a10886SXuan Hu  def N = BitPat("b0")
8357a10886SXuan Hu  def Y = BitPat("b1")
8457a10886SXuan Hu  def T = true
8557a10886SXuan Hu  def F = false
8657a10886SXuan Hu  def generate() : List[BitPat]
8757a10886SXuan Hu}
8857a10886SXuan Hu
8957a10886SXuan Hucase class XSDecode(
9057a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
91239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat,
92e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9357a10886SXuan Hu  xWen: Boolean = false,
9457a10886SXuan Hu  fWen: Boolean = false,
9557a10886SXuan Hu  vWen: Boolean = false,
9657a10886SXuan Hu  mWen: Boolean = false,
9757a10886SXuan Hu  xsTrap: Boolean = false,
9857a10886SXuan Hu  noSpec: Boolean = false,
9957a10886SXuan Hu  blockBack: Boolean = false,
10057a10886SXuan Hu  flushPipe: Boolean = false,
10189cc69c1STang Haojin  canRobCompress: Boolean = false,
10257a10886SXuan Hu) extends XSDecodeBase {
10357a10886SXuan Hu  def generate() : List[BitPat] = {
10489cc69c1STang 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)
10557a10886SXuan Hu  }
10657a10886SXuan Hu}
10757a10886SXuan Hu
10857a10886SXuan Hucase class FDecode(
10957a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
110239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X,
11117ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
11257a10886SXuan Hu  xWen: Boolean = false,
11357a10886SXuan Hu  fWen: Boolean = false,
11457a10886SXuan Hu  vWen: Boolean = false,
11557a10886SXuan Hu  mWen: Boolean = false,
11657a10886SXuan Hu  xsTrap: Boolean = false,
11757a10886SXuan Hu  noSpec: Boolean = false,
11857a10886SXuan Hu  blockBack: Boolean = false,
11957a10886SXuan Hu  flushPipe: Boolean = false,
12089cc69c1STang Haojin  canRobCompress: Boolean = false,
12157a10886SXuan Hu) extends XSDecodeBase {
12257a10886SXuan Hu  def generate() : List[BitPat] = {
12389cc69c1STang Haojin    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate()
12457a10886SXuan Hu  }
12557a10886SXuan Hu}
12657a10886SXuan Hu
127be25371aSYikeZhou/**
128be25371aSYikeZhou * Overall Decode constants
129be25371aSYikeZhou */
130be25371aSYikeZhouobject XDecode extends DecodeConstants {
131*1be7b39aSXuan Hu  import PseudoInstructions.{CSRRC_RO, CSRRS_RO}
132*1be7b39aSXuan Hu
13357a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
134768f5f91SYangyu Chen    // RV32I
13557a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
13657a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
13757a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
13857a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
13957a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
14057a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
14157a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
14257a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
14389cc69c1STang Haojin    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T),
14489cc69c1STang Haojin    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T),
14589cc69c1STang Haojin    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T),
14689cc69c1STang Haojin    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T, canRobCompress = T),
14789cc69c1STang Haojin    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T),
14889cc69c1STang Haojin    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T),
14989cc69c1STang Haojin    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T),
15089cc69c1STang Haojin    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T, canRobCompress = T),
15189cc69c1STang Haojin    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T, canRobCompress = T),
15289cc69c1STang Haojin    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T, canRobCompress = T),
15389cc69c1STang Haojin    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T, canRobCompress = T),
15489cc69c1STang Haojin    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T, canRobCompress = T),
15589cc69c1STang Haojin    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T, canRobCompress = T),
15689cc69c1STang Haojin    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T, canRobCompress = T),
15789cc69c1STang Haojin    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T, canRobCompress = T),
15889cc69c1STang Haojin    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T, canRobCompress = T),
15989cc69c1STang Haojin    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T, canRobCompress = T),
1604d24c305SYikeZhou
161768f5f91SYangyu Chen    // RV64I (extend from RV32I)
162768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
163768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
164768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
165768f5f91SYangyu Chen
166768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
167768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
168768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
169768f5f91SYangyu Chen
170768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
171768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
172768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
173768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
174768f5f91SYangyu Chen
175768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
176768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
177768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
178768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
179768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
180768f5f91SYangyu Chen
181768f5f91SYangyu Chen    // RV64M
18289cc69c1STang Haojin    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T, canRobCompress = T),
18389cc69c1STang Haojin    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T, canRobCompress = T),
18489cc69c1STang Haojin    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T),
18589cc69c1STang Haojin    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T),
18689cc69c1STang Haojin    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T, canRobCompress = T),
1874d24c305SYikeZhou
18889cc69c1STang Haojin    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T, canRobCompress = T),
18989cc69c1STang Haojin    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T, canRobCompress = T),
19089cc69c1STang Haojin    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T, canRobCompress = T),
19189cc69c1STang Haojin    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T, canRobCompress = T),
19289cc69c1STang Haojin    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T, canRobCompress = T),
19389cc69c1STang Haojin    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T),
19489cc69c1STang Haojin    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T, canRobCompress = T),
19589cc69c1STang Haojin    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T),
1964d24c305SYikeZhou
197f7af4c74Schengguanghui    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
19857a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
1995110577fSZiyue Zhang    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T),
2003b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
2013b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
2023b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2033b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2043b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2053b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2064d24c305SYikeZhou
207768f5f91SYangyu Chen    // System, the immediate12 holds the CSR register.
20857a10886SXuan Hu    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
20957a10886SXuan Hu    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21057a10886SXuan Hu    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2114d24c305SYikeZhou
21257a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21357a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21457a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2154d24c305SYikeZhou
216*1be7b39aSXuan Hu    CSRRS_RO-> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro  , SelImm.IMM_I, xWen = F, noSpec = T, blockBack = T),
217*1be7b39aSXuan Hu    CSRRC_RO-> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro  , SelImm.IMM_I, xWen = F, noSpec = T, blockBack = T),
218*1be7b39aSXuan Hu
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(
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),
38857a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
38957a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3904d24c305SYikeZhou
391964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
392964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
393c2a8ae00SYikeZhou
3944d24c305SYikeZhou    // Int to FP
39589cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39689cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39789cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39889cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
3994d24c305SYikeZhou
40089cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40189cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40289cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40389cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4044d24c305SYikeZhou
4054d24c305SYikeZhou  )
406be25371aSYikeZhou}
407be25371aSYikeZhou
408be25371aSYikeZhou/**
409be25371aSYikeZhou * FP Divide SquareRoot Constants
410be25371aSYikeZhou */
411be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
41257a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
41389cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41489cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41589cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41689cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4174d24c305SYikeZhou  )
418be25371aSYikeZhou}
419be25371aSYikeZhou
4204d24c305SYikeZhou/**
421af2f7849Shappy-lx * Svinval extension Constants
422af2f7849Shappy-lx */
423af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
42457a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
425af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
426af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
427af2f7849Shappy-lx     */
42857a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
429af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
430af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
431af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
432af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
433af2f7849Shappy-lx     */
43457a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
435af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
436af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
437af2f7849Shappy-lx     * then dispatch and issue this instrucion
438af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
439af2f7849Shappy-lx     */
44057a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
441af2f7849Shappy-lx    /* what is Svinval extension ?
442af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
443af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
444af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
445af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
446af2f7849Shappy-lx     *
447af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
448af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
449af2f7849Shappy-lx     */
450af2f7849Shappy-lx  )
451af2f7849Shappy-lx}
45257a10886SXuan Hu
453af2f7849Shappy-lx/*
454ca18a0b4SWilliam Wang * CBO decode
455ca18a0b4SWilliam Wang */
456ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
45757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
45857a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
45957a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
46057a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
46157a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
462ca18a0b4SWilliam Wang  )
463ca18a0b4SWilliam Wang}
464ca18a0b4SWilliam Wang
465d0de7e4aSpeixiaokun/*
466d0de7e4aSpeixiaokun * Hypervisor decode
467d0de7e4aSpeixiaokun */
468d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
469e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
470e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
471e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
472e25e4d90SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X),
473e25e4d90SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X),
474e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
475e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
476e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
477e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
478e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
479e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
480e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
481e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
482e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
483e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
484e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
485e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
486e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
487d0de7e4aSpeixiaokun  )
488d0de7e4aSpeixiaokun}
489d0de7e4aSpeixiaokun
490545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
491545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
492545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
493545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
494545d7be0SYangyu Chen  )
495545d7be0SYangyu Chen}
496545d7be0SYangyu Chen
497ca18a0b4SWilliam Wang/**
4984d24c305SYikeZhou * XiangShan Trap Decode constants
4994d24c305SYikeZhou */
5004d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
501361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
50257a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
50357a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
5044d24c305SYikeZhou  )
5054d24c305SYikeZhou}
506be25371aSYikeZhou
50749f433deSXuan Huabstract class Imm(val len: Int) {
508b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
509b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
510b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
511b0ae3ac4SLinJiawei}
512b0ae3ac4SLinJiawei
513b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
514fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
515b0ae3ac4SLinJiawei
516b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
517b0ae3ac4SLinJiawei    Cat(instr(31, 20))
518b0ae3ac4SLinJiawei}
519b0ae3ac4SLinJiawei
520b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
521b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
522b0ae3ac4SLinJiawei
523b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
524b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
525b0ae3ac4SLinJiawei}
526b0ae3ac4SLinJiawei
527b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
528b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
529b0ae3ac4SLinJiawei
530b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
531b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
532b0ae3ac4SLinJiawei}
533b0ae3ac4SLinJiawei
534b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
535fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
536b0ae3ac4SLinJiawei
537b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
538b0ae3ac4SLinJiawei    instr(31, 12)
539c2a8ae00SYikeZhou  }
540c2a8ae00SYikeZhou}
541c2a8ae00SYikeZhou
542b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
543b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
544b0ae3ac4SLinJiawei
545b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
546b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
547b0ae3ac4SLinJiawei  }
548b0ae3ac4SLinJiawei}
549b0ae3ac4SLinJiawei
550b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){
551b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
552b0ae3ac4SLinJiawei
553b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
554b0ae3ac4SLinJiawei    Cat(instr(19, 15), instr(31, 20))
555b0ae3ac4SLinJiawei  }
556b0ae3ac4SLinJiawei}
557b0ae3ac4SLinJiawei
558ee8ff153Szfwcase class Imm_B6() extends Imm(6){
559ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
560ee8ff153Szfw
561ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
562ee8ff153Szfw    instr(25, 20)
563ee8ff153Szfw  }
564ee8ff153Szfw}
565ee8ff153Szfw
56658c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
56758c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
56858c35d23Shuxuan0307
56958c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
57058c35d23Shuxuan0307    instr(19, 15)
57158c35d23Shuxuan0307  }
57258c35d23Shuxuan0307}
573b52d4755SXuan Hu
57458c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
57558c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
57658c35d23Shuxuan0307
57758c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
57858c35d23Shuxuan0307    instr(19, 15)
57958c35d23Shuxuan0307  }
58058c35d23Shuxuan0307}
581b52d4755SXuan Hu
5824aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
5834aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
5844aa9ed34Sfdy
5854aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
5864aa9ed34Sfdy    instr(30, 20)
5874aa9ed34Sfdy  }
588e6ac7fe1SZiyue Zhang  /**
589e6ac7fe1SZiyue Zhang    * get VType from extended imm
590e6ac7fe1SZiyue Zhang    * @param extedImm
591e6ac7fe1SZiyue Zhang    * @return VType
592e6ac7fe1SZiyue Zhang    */
593e6ac7fe1SZiyue Zhang  def getVType(extedImm: UInt): InstVType = {
594e6ac7fe1SZiyue Zhang    val vtype = Wire(new InstVType)
595e6ac7fe1SZiyue Zhang    vtype := extedImm(10, 0).asTypeOf(new InstVType)
596e6ac7fe1SZiyue Zhang    vtype
597e6ac7fe1SZiyue Zhang  }
5984aa9ed34Sfdy}
599b52d4755SXuan Hu
600e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){
6014aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6024aa9ed34Sfdy
6034aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6045c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
605b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
606e6ac7fe1SZiyue Zhang    val vtype8 = rvInst.ZIMM_VSETIVLI
607b52d4755SXuan Hu    Cat(uimm5, vtype8)
608b52d4755SXuan Hu  }
609b52d4755SXuan Hu  /**
610b52d4755SXuan Hu    * get VType from extended imm
611b52d4755SXuan Hu    * @param extedImm
612b52d4755SXuan Hu    * @return VType
613b52d4755SXuan Hu    */
614b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
615b52d4755SXuan Hu    val vtype = Wire(new InstVType)
616e6ac7fe1SZiyue Zhang    vtype := extedImm(9, 0).asTypeOf(new InstVType)
617b52d4755SXuan Hu    vtype
618b52d4755SXuan Hu  }
619b52d4755SXuan Hu
620b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
621e6ac7fe1SZiyue Zhang    extedImm(14, 10)
6224aa9ed34Sfdy  }
6234aa9ed34Sfdy}
624fe528fd6Ssinsanction
625fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
626fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
627fe528fd6Ssinsanction
628fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
629fe528fd6Ssinsanction    instr(31, 0)
630fe528fd6Ssinsanction  }
631fe528fd6Ssinsanction}
632fe528fd6Ssinsanction
6337e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
6347e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
6357e30d16cSZhaoyang You
6367e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
6377e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
6387e30d16cSZhaoyang You  }
6397e30d16cSZhaoyang You}
6407e30d16cSZhaoyang You
641b0ae3ac4SLinJiaweiobject ImmUnion {
642b0ae3ac4SLinJiawei  val I = Imm_I()
643b0ae3ac4SLinJiawei  val S = Imm_S()
644b0ae3ac4SLinJiawei  val B = Imm_B()
645b0ae3ac4SLinJiawei  val U = Imm_U()
646b0ae3ac4SLinJiawei  val J = Imm_J()
647b0ae3ac4SLinJiawei  val Z = Imm_Z()
648ee8ff153Szfw  val B6 = Imm_B6()
64958c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
65058c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
6514aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
6524aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
653fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
6547e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
6554aa9ed34Sfdy
656520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
6577e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
658b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
659b0ae3ac4SLinJiawei  val immSelMap = Seq(
660b0ae3ac4SLinJiawei    SelImm.IMM_I,
661b0ae3ac4SLinJiawei    SelImm.IMM_S,
662b0ae3ac4SLinJiawei    SelImm.IMM_SB,
663b0ae3ac4SLinJiawei    SelImm.IMM_U,
664b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
665ee8ff153Szfw    SelImm.IMM_Z,
66658c35d23Shuxuan0307    SelImm.IMM_B6,
66758c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
6684aa9ed34Sfdy    SelImm.IMM_OPIVIU,
6694aa9ed34Sfdy    SelImm.IMM_VSETVLI,
670fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
6717e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
672b0ae3ac4SLinJiawei  ).zip(imms)
673b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
674b0ae3ac4SLinJiawei}
675b0ae3ac4SLinJiawei
676fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
677fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
678fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
679765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
680fd7603d9SYinan Xu  }
6813b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
682fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
6833b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
684f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
685fd7603d9SYinan Xu  }
686fd7603d9SYinan Xu}
687b0ae3ac4SLinJiawei
688be25371aSYikeZhou/**
689be25371aSYikeZhou * IO bundle for the Decode unit
690be25371aSYikeZhou */
691aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
692aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
693aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
694aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
695aaa08c5aSxiaofeibao-xjtu}
6962225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
6973b739f49SXuan Hu  val enq = new Bundle {
6983b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
699d91483a6Sfdy    val vtype = Input(new VType)
7005110577fSZiyue Zhang    val vstart = Input(Vl())
7014aa9ed34Sfdy  }
7023b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
703aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
704af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
705be25371aSYikeZhou}
706be25371aSYikeZhou
707be25371aSYikeZhou/**
708be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
709be25371aSYikeZhou */
7102225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
711be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
712be25371aSYikeZhou
7133b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
714be25371aSYikeZhou
71575e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
71675e2c883SXuan Hu
71757a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
71857a10886SXuan Hu    FpDecode.table ++
719bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
720768f5f91SYangyu Chen    BitmanipDecode.table ++
721768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
722a19215ddSYinan Xu    XSTrapDecode.table ++
723a19215ddSYinan Xu    CBODecode.table ++
724b65b9ebaSXuan Hu    SvinvalDecode.table ++
725e25e4d90SXuan Hu    HypervisorDecode.table ++
726545d7be0SYangyu Chen    VecDecoder.table ++
727545d7be0SYangyu Chen    ZicondDecode.table
728b65b9ebaSXuan Hu
72989cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
730a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
731239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
732a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
733a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
734be25371aSYikeZhou
7354d24c305SYikeZhou  // output
7363b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
737be25371aSYikeZhou
7382ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
7397ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
7403b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
7411a1319cbSLinJiawei
7423b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
7433b739f49SXuan Hu
744a8db15d8Sfdy  decodedInst.uopIdx := 0.U
745d91483a6Sfdy  decodedInst.firstUop := true.B
746d91483a6Sfdy  decodedInst.lastUop := true.B
747f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
7483235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
749deb6421eSHaojin Tang
75073c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
751f7af4c74Schengguanghui  decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
75273c4359eSYikeZhou
75349a2cda2SXuan Hu  // fmadd - b1000011
75449a2cda2SXuan Hu  // fmsub - b1000111
75549a2cda2SXuan Hu  // fnmsub- b1001011
75649a2cda2SXuan Hu  // fnmadd- b1001111
75749a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
758e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
759e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
76049a2cda2SXuan Hu
761178dd38cSYikeZhou  // read src1~3 location
76298cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
76398cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
76449a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
76549a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
7669c5a1080Sxiaofeibao  decodedInst.lsrc(3) := V0_IDX.U
7679c5a1080Sxiaofeibao  decodedInst.lsrc(4) := Vl_IDX.U
768b6b11f60SXuan Hu
769178dd38cSYikeZhou  // read dest location
77098cfe81bSxgkiri  decodedInst.ldest := inst.RD
7714d24c305SYikeZhou
772e4e68f86Sxiaofeibao  // init v0Wen vlWen
773e4e68f86Sxiaofeibao  decodedInst.v0Wen := false.B
774e4e68f86Sxiaofeibao  decodedInst.vlWen := false.B
775e4e68f86Sxiaofeibao
776c2a8ae00SYikeZhou  // fill in exception vector
777567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
778567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
779567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
780bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
7815110577fSZiyue Zhang  vecException.io.vstart := decodedInst.vpu.vstart
782567f0269Ssinsanction  decodedInst.exceptionVec(illegalInstr) := decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst
7834d24c305SYikeZhou
784af2f7849Shappy-lx  when (!io.csrCtrl.svinval_enable) {
785567f0269Ssinsanction    val base_ii = decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst
786af2f7849Shappy-lx    val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr
787af2f7849Shappy-lx    val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr
788af2f7849Shappy-lx    val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr
789d0de7e4aSpeixiaokun    val hinval_gvma = HINVAL_GVMA === ctrl_flow.instr
790d0de7e4aSpeixiaokun    val hinval_vvma = HINVAL_VVMA === ctrl_flow.instr
791d0de7e4aSpeixiaokun    val svinval_ii = sinval || w_inval || inval_ir || hinval_gvma || hinval_vvma
7923b739f49SXuan Hu    decodedInst.exceptionVec(illegalInstr) := base_ii || svinval_ii
7933b739f49SXuan Hu    decodedInst.flushPipe := false.B
794af2f7849Shappy-lx  }
795af2f7849Shappy-lx
796d0de7e4aSpeixiaokun  when(io.csrCtrl.virtMode){
797e25e4d90SXuan Hu    // Todo: optimize EX_VI decode
798d0de7e4aSpeixiaokun    // vs/vu attempting to exec hyperinst will raise virtual instruction
799e25e4d90SXuan Hu    decodedInst.exceptionVec(virtualInstr) := ctrl_flow.instr === HLV_B || ctrl_flow.instr === HLV_BU ||
800d0de7e4aSpeixiaokun      ctrl_flow.instr === HLV_H   || ctrl_flow.instr === HLV_HU ||
801d0de7e4aSpeixiaokun      ctrl_flow.instr === HLVX_HU || ctrl_flow.instr === HLV_W  ||
802d0de7e4aSpeixiaokun      ctrl_flow.instr === HLVX_WU || ctrl_flow.instr === HLV_WU ||
803d0de7e4aSpeixiaokun      ctrl_flow.instr === HLV_D   || ctrl_flow.instr === HSV_B  ||
804d0de7e4aSpeixiaokun      ctrl_flow.instr === HSV_H   || ctrl_flow.instr === HSV_W  ||
805d0de7e4aSpeixiaokun      ctrl_flow.instr === HSV_D   || ctrl_flow.instr === HFENCE_VVMA ||
806d0de7e4aSpeixiaokun      ctrl_flow.instr === HFENCE_GVMA || ctrl_flow.instr === HINVAL_GVMA ||
807d0de7e4aSpeixiaokun      ctrl_flow.instr === HINVAL_VVMA
808d0de7e4aSpeixiaokun  }
809d0de7e4aSpeixiaokun
8103b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
811b0ae3ac4SLinJiawei    x => {
8127ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
813b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
814b0ae3ac4SLinJiawei      x._1 -> minBits
815b0ae3ac4SLinJiawei    }
816b0ae3ac4SLinJiawei  ))
817aac4464eSYinan Xu
8187531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
8197531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
8207531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
8217531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
8227531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
8237531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
8247531c765SXuan Hu
8257531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
82675e2c883SXuan Hu
82775e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
828be25371aSYikeZhou
8290bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
83039c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
83139c388b5SXuan Hu  private val narrowInsts = Seq(
83239c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
83339c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
83439c388b5SXuan Hu  )
83539c388b5SXuan Hu  private val maskDstInsts = Seq(
83639c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
83739c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
83839c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
8399eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
8409eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
8419eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
8429eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
843f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
84439c388b5SXuan Hu  )
84530fcc710SZiyue Zhang  private val maskOpInsts = Seq(
84630fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
84730fcc710SZiyue Zhang  )
84894e6af68SZiyue-Zhang  private val vmaInsts = Seq(
84994e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
85094e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
85194e6af68SZiyue-Zhang  )
852bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
853bdda74fdSxiaofeibao-xjtu    // opfff
854bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
855bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
856bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
857bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
858bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
859bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
860bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
861bdda74fdSxiaofeibao-xjtu    // opfvv
862bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
863bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
864bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
865bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
866bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
867bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
868bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
869bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
870bdda74fdSxiaofeibao-xjtu    // opfvf
871bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
872bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
873bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
874bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
875bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
876bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
877bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
878aab8ef9cSxiaofeibao-xjtu    // vfred
879aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
880bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
881bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
882bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
883bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
884bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
885ba899681Schengguanghui    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,
886ba899681Schengguanghui    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,
887ba899681Schengguanghui    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,
888ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
889bdda74fdSxiaofeibao-xjtu  )
890bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
891bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
892bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
893bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
8943b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
895bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
896bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
897bdda74fdSxiaofeibao-xjtu  }.otherwise{
89875e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
89975e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
90075e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
90175e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
90275e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
90375e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
90475e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
905d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
90694e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
90739c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
908b6279fc6SZiyue Zhang    val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
909b6279fc6SZiyue Zhang    val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
910b6279fc6SZiyue Zhang    val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
911b6279fc6SZiyue Zhang    val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe
912dab1ad8cSsinsanction    val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse
913dab1ad8cSsinsanction    val isVlm = decodedInst.fuOpType === VlduType.vlm
914d8ceb649SZiyue Zhang    val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV
91594e6af68SZiyue-Zhang    val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
916dab1ad8cSsinsanction    val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew
917b6279fc6SZiyue Zhang    decodedInst.vpu.isNarrow := isNarrow
918b6279fc6SZiyue Zhang    decodedInst.vpu.isDstMask := isDstMask
919b6279fc6SZiyue Zhang    decodedInst.vpu.isOpMask := isOpMask
92094e6af68SZiyue-Zhang    decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma
921dab1ad8cSsinsanction    decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac
9225110577fSZiyue Zhang    decodedInst.vpu.vstart := io.enq.vstart
923bdda74fdSxiaofeibao-xjtu  }
92475e2c883SXuan Hu
92531c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
92631c51290Szhanglinjuan
9276d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
9286d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
9296d56ac16Ssinsanction
9307f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
93187dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
93287dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
93306cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
93487dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
9350a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
936c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
93706cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
938c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
9397f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
9407f9f0a79SzhanglyGit  io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop
9413235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
9427f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
9437f9f0a79SzhanglyGit
94487c5d21dSZiyue Zhang  // for csrr vl instruction, convert to vsetvl
94587c5d21dSZiyue Zhang  val Vl = 0xC20.U
94663cb3754SZiyue Zhang  val Vlenb = 0xC22.U
94763cb3754SZiyue Zhang  val isCsrInst = FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)
94863cb3754SZiyue Zhang  //  rs1 is x0 or uimm == 0
94963cb3754SZiyue Zhang  val isCsrRead = (decodedInst.fuOpType === CSROpType.set || decodedInst.fuOpType === CSROpType.clr) && inst.RS1 === 0.U
95063cb3754SZiyue Zhang  val isCsrrVl = isCsrInst && isCsrRead && inst.CSRIDX === Vl
95163cb3754SZiyue Zhang  val isCsrrVlenb = isCsrInst && isCsrRead && inst.CSRIDX === Vlenb
95287c5d21dSZiyue Zhang  when (isCsrrVl) {
95363cb3754SZiyue Zhang    // convert to vsetvl instruction
95487c5d21dSZiyue Zhang    decodedInst.srcType(0) := SrcType.no
95587c5d21dSZiyue Zhang    decodedInst.srcType(1) := SrcType.no
95687c5d21dSZiyue Zhang    decodedInst.srcType(2) := SrcType.no
95787c5d21dSZiyue Zhang    decodedInst.srcType(3) := SrcType.no
95887c5d21dSZiyue Zhang    decodedInst.srcType(4) := SrcType.vp
95987c5d21dSZiyue Zhang    decodedInst.lsrc(4) := Vl_IDX.U
96063cb3754SZiyue Zhang    decodedInst.waitForward := false.B
96187c5d21dSZiyue Zhang    decodedInst.blockBackward := false.B
96263cb3754SZiyue Zhang  }.elsewhen(isCsrrVlenb){
96363cb3754SZiyue Zhang    // convert to addi instruction
964828a8a48SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
965828a8a48SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
96663cb3754SZiyue Zhang    decodedInst.srcType(2) := SrcType.no
96763cb3754SZiyue Zhang    decodedInst.srcType(3) := SrcType.no
96863cb3754SZiyue Zhang    decodedInst.srcType(4) := SrcType.no
96963cb3754SZiyue Zhang    decodedInst.selImm := SelImm.IMM_I
97063cb3754SZiyue Zhang    decodedInst.waitForward := false.B
97163cb3754SZiyue Zhang    decodedInst.blockBackward := false.B
97263cb3754SZiyue Zhang    decodedInst.canRobCompress := true.B
97387c5d21dSZiyue Zhang  }
97487c5d21dSZiyue Zhang
97575e2c883SXuan Hu  io.deq.decodedInst := decodedInst
9769faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
977985804e6SXuan Hu  // change vlsu to vseglsu when NF =/= 0.U
978985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
97987c5d21dSZiyue Zhang    ( isCsrrVl) -> FuType.vsetfwf.U,
98063cb3754SZiyue Zhang    ( isCsrrVlenb) -> FuType.alu.U,
98163cb3754SZiyue Zhang    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType,
982f94f6503SXuan 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,
983f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
984f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
985f94f6503SXuan 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,
986f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
987f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
988f94f6503SXuan 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,
989985804e6SXuan Hu  ))
99063cb3754SZiyue Zhang  io.deq.decodedInst.fuOpType := Mux(isCsrrVlenb, ALUOpType.add, decodedInst.fuOpType)
99163cb3754SZiyue Zhang  io.deq.decodedInst.imm := Mux(isCsrrVlenb, (VLEN / 8).U, decodedInst.imm)
992be25371aSYikeZhou  //-------------------------------------------------------------
993be25371aSYikeZhou  // Debug Info
9943b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
9953b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
9963b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
9973b739f49SXuan 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",
9983b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
9993b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
10003b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
10013b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
10023b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
10033b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
10043b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
10053b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
1006be25371aSYikeZhou}
1007