xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision cc1eb70ddc8a82e88a4bb868a34725c834b703c5)
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._
22*cc1eb70dSXuan Huimport freechips.rocketchip.rocket.CSRs
233b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._
246ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat
253c02ee8fSwakafaimport utility._
263b739f49SXuan Huimport utils._
27d0de7e4aSpeixiaokunimport xiangshan.ExceptionNO.{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
32*cc1eb70dSXuan 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
35be25371aSYikeZhou
36be25371aSYikeZhou/**
37be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
38be25371aSYikeZhou */
39be25371aSYikeZhouabstract trait DecodeConstants {
40361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
4157a10886SXuan Hu  def X = BitPat("b0")
424d24c305SYikeZhou  def N = BitPat("b0")
434d24c305SYikeZhou  def Y = BitPat("b1")
4457a10886SXuan Hu  def T = true
4557a10886SXuan Hu  def F = false
464d24c305SYikeZhou
47c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
4820e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
494d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
5057a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
5157a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
5257a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5357a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5457a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
5589cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  canRobCompress
5689cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  uopSplitType
5789cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  |             selImm
5889cc69c1STang 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
594d24c305SYikeZhou
6057a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
6157a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
62be25371aSYikeZhou}
63be25371aSYikeZhou
64c2a8ae00SYikeZhoutrait DecodeUnitConstants
654d24c305SYikeZhou{
664d24c305SYikeZhou  // abstract out instruction decode magic numbers
674d24c305SYikeZhou  val RD_MSB  = 11
684d24c305SYikeZhou  val RD_LSB  = 7
694d24c305SYikeZhou  val RS1_MSB = 19
704d24c305SYikeZhou  val RS1_LSB = 15
714d24c305SYikeZhou  val RS2_MSB = 24
724d24c305SYikeZhou  val RS2_LSB = 20
734d24c305SYikeZhou  val RS3_MSB = 31
744d24c305SYikeZhou  val RS3_LSB = 27
754d24c305SYikeZhou}
764d24c305SYikeZhou
77be25371aSYikeZhou/**
78be25371aSYikeZhou * Decoded control signals
794d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
80be25371aSYikeZhou */
81c2a8ae00SYikeZhou
8257a10886SXuan Huabstract class XSDecodeBase {
8357a10886SXuan Hu  def X = BitPat("b?")
8457a10886SXuan Hu  def N = BitPat("b0")
8557a10886SXuan Hu  def Y = BitPat("b1")
8657a10886SXuan Hu  def T = true
8757a10886SXuan Hu  def F = false
8857a10886SXuan Hu  def generate() : List[BitPat]
8957a10886SXuan Hu}
9057a10886SXuan Hu
9157a10886SXuan Hucase class XSDecode(
9257a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
93239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat,
94e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9557a10886SXuan Hu  xWen: Boolean = false,
9657a10886SXuan Hu  fWen: Boolean = false,
9757a10886SXuan Hu  vWen: Boolean = false,
9857a10886SXuan Hu  mWen: Boolean = false,
9957a10886SXuan Hu  xsTrap: Boolean = false,
10057a10886SXuan Hu  noSpec: Boolean = false,
10157a10886SXuan Hu  blockBack: Boolean = false,
10257a10886SXuan Hu  flushPipe: Boolean = false,
10389cc69c1STang Haojin  canRobCompress: Boolean = false,
10457a10886SXuan Hu) extends XSDecodeBase {
10557a10886SXuan Hu  def generate() : List[BitPat] = {
10689cc69c1STang 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)
10757a10886SXuan Hu  }
10857a10886SXuan Hu}
10957a10886SXuan Hu
11057a10886SXuan Hucase class FDecode(
11157a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
112239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X,
11317ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
11457a10886SXuan Hu  xWen: Boolean = false,
11557a10886SXuan Hu  fWen: Boolean = false,
11657a10886SXuan Hu  vWen: Boolean = false,
11757a10886SXuan Hu  mWen: Boolean = false,
11857a10886SXuan Hu  xsTrap: Boolean = false,
11957a10886SXuan Hu  noSpec: Boolean = false,
12057a10886SXuan Hu  blockBack: Boolean = false,
12157a10886SXuan Hu  flushPipe: Boolean = false,
12289cc69c1STang Haojin  canRobCompress: Boolean = false,
12357a10886SXuan Hu) extends XSDecodeBase {
12457a10886SXuan Hu  def generate() : List[BitPat] = {
12589cc69c1STang Haojin    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate()
12657a10886SXuan Hu  }
12757a10886SXuan Hu}
12857a10886SXuan Hu
129be25371aSYikeZhou/**
130be25371aSYikeZhou * Overall Decode constants
131be25371aSYikeZhou */
132be25371aSYikeZhouobject XDecode extends DecodeConstants {
1331be7b39aSXuan Hu  import PseudoInstructions.{CSRRC_RO, CSRRS_RO}
1341be7b39aSXuan Hu
13557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
136768f5f91SYangyu Chen    // RV32I
13757a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
13857a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
13957a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
14057a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
14157a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
14257a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
14357a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
14457a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
14589cc69c1STang Haojin    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T),
14689cc69c1STang Haojin    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T),
14789cc69c1STang Haojin    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T),
14889cc69c1STang Haojin    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T, canRobCompress = T),
14989cc69c1STang Haojin    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T),
15089cc69c1STang Haojin    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T),
15189cc69c1STang Haojin    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T),
15289cc69c1STang Haojin    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T, canRobCompress = T),
15389cc69c1STang Haojin    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T, canRobCompress = T),
15489cc69c1STang Haojin    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T, canRobCompress = T),
15589cc69c1STang Haojin    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T, canRobCompress = T),
15689cc69c1STang Haojin    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T, canRobCompress = T),
15789cc69c1STang Haojin    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T, canRobCompress = T),
15889cc69c1STang Haojin    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T, canRobCompress = T),
15989cc69c1STang Haojin    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T, canRobCompress = T),
16089cc69c1STang Haojin    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T, canRobCompress = T),
16189cc69c1STang Haojin    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T, canRobCompress = T),
1624d24c305SYikeZhou
163768f5f91SYangyu Chen    // RV64I (extend from RV32I)
164768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
165768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
166768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
167768f5f91SYangyu Chen
168768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
169768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
170768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
171768f5f91SYangyu Chen
172768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
173768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
174768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
175768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
176768f5f91SYangyu Chen
177768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
178768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
179768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
180768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
181768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
182768f5f91SYangyu Chen
183768f5f91SYangyu Chen    // RV64M
18489cc69c1STang Haojin    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T, canRobCompress = T),
18589cc69c1STang Haojin    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T, canRobCompress = T),
18689cc69c1STang Haojin    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T),
18789cc69c1STang Haojin    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T),
18889cc69c1STang Haojin    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T, canRobCompress = T),
1894d24c305SYikeZhou
19089cc69c1STang Haojin    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T, canRobCompress = T),
19189cc69c1STang Haojin    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T, canRobCompress = T),
19289cc69c1STang Haojin    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T, canRobCompress = T),
19389cc69c1STang Haojin    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T, canRobCompress = T),
19489cc69c1STang Haojin    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T, canRobCompress = T),
19589cc69c1STang Haojin    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T),
19689cc69c1STang Haojin    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T, canRobCompress = T),
19789cc69c1STang Haojin    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T),
1984d24c305SYikeZhou
199f7af4c74Schengguanghui    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
20057a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
2015110577fSZiyue Zhang    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T),
2023b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
2033b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
2043b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2053b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2063b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2073b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2084d24c305SYikeZhou
209768f5f91SYangyu Chen    // System, the immediate12 holds the CSR register.
21040ac5bb1SXuan Hu
21140ac5bb1SXuan Hu    // CSR RO should be ahead of CSRRS and CSRRC, since decoder don't handle the inclusive relation-ship among the patterns.
2125fa145b9SXuan Hu    CSRRS_RO -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2135fa145b9SXuan Hu    CSRRC_RO -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2145fa145b9SXuan Hu
21557a10886SXuan Hu    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21657a10886SXuan Hu    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21757a10886SXuan Hu    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2184d24c305SYikeZhou
21957a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
22057a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
22157a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2224d24c305SYikeZhou
22357a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22457a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22557a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22657a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22757a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22857a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2294d24c305SYikeZhou
23057a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
23157a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
23257a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2334d24c305SYikeZhou
234768f5f91SYangyu Chen    // RV64A
23557a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23657a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23757a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23857a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23957a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24057a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24157a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24257a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24357a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2444d24c305SYikeZhou
24557a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24757a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24857a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24957a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25057a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25157a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25257a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25357a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2544d24c305SYikeZhou
25557a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25657a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25757a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25857a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
259768f5f91SYangyu Chen  )
260768f5f91SYangyu Chen}
261ee8ff153Szfw
262768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
263768f5f91SYangyu Chen  /*
264768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
265768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
266768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
267768f5f91SYangyu Chen   */
268768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
269768f5f91SYangyu Chen    // Zba
270768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
271768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
272768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
273768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
274768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
275768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
276768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
277768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
278768f5f91SYangyu Chen
279768f5f91SYangyu Chen    // Zbb
28089cc69c1STang Haojin    ANDN      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn    , SelImm.X    , xWen = T, canRobCompress = T),
28189cc69c1STang Haojin    ORN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn     , SelImm.X    , xWen = T, canRobCompress = T),
28289cc69c1STang Haojin    XNOR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor    , SelImm.X    , xWen = T, canRobCompress = T),
283ee8ff153Szfw
284768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
285768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
286768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
287768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
288768f5f91SYangyu Chen
289768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
290768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
291768f5f91SYangyu Chen
29289cc69c1STang Haojin    MAX       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max     , SelImm.X    , xWen = T, canRobCompress = T),
29389cc69c1STang Haojin    MAXU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu    , SelImm.X    , xWen = T, canRobCompress = T),
294768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
295768f5f91SYangyu Chen    MINU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu    , SelImm.X    , xWen = T, canRobCompress = T),
296ee8ff153Szfw
29789cc69c1STang Haojin    SEXT_B    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb   , SelImm.X    , xWen = T, canRobCompress = T),
29889cc69c1STang Haojin    SEXT_H    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth   , SelImm.X    , xWen = T, canRobCompress = T),
299768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
300768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
301ee8ff153Szfw
302768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
303768f5f91SYangyu Chen    ROLW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw    , SelImm.X    , xWen = T, canRobCompress = T),
30489cc69c1STang Haojin    ROR       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.X    , xWen = T, canRobCompress = T),
30589cc69c1STang Haojin    RORI      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.IMM_I, xWen = T, canRobCompress = T),
306768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
307768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
308ee8ff153Szfw
309768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
310768f5f91SYangyu Chen
311768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
312768f5f91SYangyu Chen
313768f5f91SYangyu Chen    // Zbc
314768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
315768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
316768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
317768f5f91SYangyu Chen
318768f5f91SYangyu Chen    // Zbs
319768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
320768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
321768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
322768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
323768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
324768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
325768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
326768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
327768f5f91SYangyu Chen
328768f5f91SYangyu Chen    // Zbkb
329768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
330768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
331768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
332768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
333768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
334768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
335768f5f91SYangyu Chen
336768f5f91SYangyu Chen    // Zbkc
337768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
338768f5f91SYangyu Chen
339768f5f91SYangyu Chen    // Zbkx
340768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
341768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
342768f5f91SYangyu Chen  )
343768f5f91SYangyu Chen}
344768f5f91SYangyu Chen
345768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
346768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
347768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
348768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
349768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
350768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
351768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
352768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
353768f5f91SYangyu Chen
354768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
355768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
356768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
357768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
358768f5f91SYangyu Chen
359768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
360768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
361768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
362768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
363768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
364768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
365768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
366768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
367768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
368768f5f91SYangyu Chen
369768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
370768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
371768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
372768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
373768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
374768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
375768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
376768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
377768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
378768f5f91SYangyu Chen
379768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
380768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
381768f5f91SYangyu Chen    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1     , SelImm.X    , xWen = T, canRobCompress = T),
3824d24c305SYikeZhou  )
383be25371aSYikeZhou}
384be25371aSYikeZhou
385be25371aSYikeZhou/**
386be25371aSYikeZhou * FP Decode constants
387be25371aSYikeZhou */
38857a10886SXuan Huobject FpDecode extends DecodeConstants{
38957a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
39057a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
39157a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
39257a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
39357a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3944d24c305SYikeZhou
395964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
396964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
397c2a8ae00SYikeZhou
3984d24c305SYikeZhou    // Int to FP
39989cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40089cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40189cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40289cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4034d24c305SYikeZhou
40489cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40589cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40689cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40789cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4084d24c305SYikeZhou
4094d24c305SYikeZhou  )
410be25371aSYikeZhou}
411be25371aSYikeZhou
412be25371aSYikeZhou/**
413be25371aSYikeZhou * FP Divide SquareRoot Constants
414be25371aSYikeZhou */
415be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
41657a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
41789cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41889cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41989cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
42089cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4214d24c305SYikeZhou  )
422be25371aSYikeZhou}
423be25371aSYikeZhou
4244d24c305SYikeZhou/**
425af2f7849Shappy-lx * Svinval extension Constants
426af2f7849Shappy-lx */
427af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
42857a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
429af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
430af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
431af2f7849Shappy-lx     */
43257a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
433af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
434af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
435af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
436af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
437af2f7849Shappy-lx     */
43857a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
439af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
440af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
441af2f7849Shappy-lx     * then dispatch and issue this instrucion
442af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
443af2f7849Shappy-lx     */
44457a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
445af2f7849Shappy-lx    /* what is Svinval extension ?
446af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
447af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
448af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
449af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
450af2f7849Shappy-lx     *
451af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
452af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
453af2f7849Shappy-lx     */
454af2f7849Shappy-lx  )
455af2f7849Shappy-lx}
45657a10886SXuan Hu
457af2f7849Shappy-lx/*
458ca18a0b4SWilliam Wang * CBO decode
459ca18a0b4SWilliam Wang */
460ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
46157a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
46257a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
46357a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
46457a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
46557a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
466ca18a0b4SWilliam Wang  )
467ca18a0b4SWilliam Wang}
468ca18a0b4SWilliam Wang
469d0de7e4aSpeixiaokun/*
470d0de7e4aSpeixiaokun * Hypervisor decode
471d0de7e4aSpeixiaokun */
472d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
473e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
474e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
475e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
476e25e4d90SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X),
477e25e4d90SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X),
478e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
479e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
480e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
481e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
482e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
483e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
484e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
485e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
486e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
487e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
488e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
489e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
490e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
491d0de7e4aSpeixiaokun  )
492d0de7e4aSpeixiaokun}
493d0de7e4aSpeixiaokun
494545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
495545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
496545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
497545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
498545d7be0SYangyu Chen  )
499545d7be0SYangyu Chen}
500545d7be0SYangyu Chen
501ca18a0b4SWilliam Wang/**
5024d24c305SYikeZhou * XiangShan Trap Decode constants
5034d24c305SYikeZhou */
5044d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
505361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
50657a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
50757a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
5084d24c305SYikeZhou  )
5094d24c305SYikeZhou}
510be25371aSYikeZhou
51149f433deSXuan Huabstract class Imm(val len: Int) {
512b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
513b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
514b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
515b0ae3ac4SLinJiawei}
516b0ae3ac4SLinJiawei
517b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
518fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
519b0ae3ac4SLinJiawei
520b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
521b0ae3ac4SLinJiawei    Cat(instr(31, 20))
522b0ae3ac4SLinJiawei}
523b0ae3ac4SLinJiawei
524b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
525b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
526b0ae3ac4SLinJiawei
527b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
528b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
529b0ae3ac4SLinJiawei}
530b0ae3ac4SLinJiawei
531b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
532b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
533b0ae3ac4SLinJiawei
534b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
535b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
536b0ae3ac4SLinJiawei}
537b0ae3ac4SLinJiawei
538b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
539fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
540b0ae3ac4SLinJiawei
541b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
542b0ae3ac4SLinJiawei    instr(31, 12)
543c2a8ae00SYikeZhou  }
544c2a8ae00SYikeZhou}
545c2a8ae00SYikeZhou
546b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
547b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
548b0ae3ac4SLinJiawei
549b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
550b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
551b0ae3ac4SLinJiawei  }
552b0ae3ac4SLinJiawei}
553b0ae3ac4SLinJiawei
554b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){
555b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
556b0ae3ac4SLinJiawei
557b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
558b0ae3ac4SLinJiawei    Cat(instr(19, 15), instr(31, 20))
559b0ae3ac4SLinJiawei  }
560b0ae3ac4SLinJiawei}
561b0ae3ac4SLinJiawei
562ee8ff153Szfwcase class Imm_B6() extends Imm(6){
563ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
564ee8ff153Szfw
565ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
566ee8ff153Szfw    instr(25, 20)
567ee8ff153Szfw  }
568ee8ff153Szfw}
569ee8ff153Szfw
57058c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
57158c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
57258c35d23Shuxuan0307
57358c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
57458c35d23Shuxuan0307    instr(19, 15)
57558c35d23Shuxuan0307  }
57658c35d23Shuxuan0307}
577b52d4755SXuan Hu
57858c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
57958c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
58058c35d23Shuxuan0307
58158c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
58258c35d23Shuxuan0307    instr(19, 15)
58358c35d23Shuxuan0307  }
58458c35d23Shuxuan0307}
585b52d4755SXuan Hu
5864aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
5874aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
5884aa9ed34Sfdy
5894aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
5904aa9ed34Sfdy    instr(30, 20)
5914aa9ed34Sfdy  }
592e6ac7fe1SZiyue Zhang  /**
593e6ac7fe1SZiyue Zhang    * get VType from extended imm
594e6ac7fe1SZiyue Zhang    * @param extedImm
595e6ac7fe1SZiyue Zhang    * @return VType
596e6ac7fe1SZiyue Zhang    */
597e6ac7fe1SZiyue Zhang  def getVType(extedImm: UInt): InstVType = {
598e6ac7fe1SZiyue Zhang    val vtype = Wire(new InstVType)
599e6ac7fe1SZiyue Zhang    vtype := extedImm(10, 0).asTypeOf(new InstVType)
600e6ac7fe1SZiyue Zhang    vtype
601e6ac7fe1SZiyue Zhang  }
6024aa9ed34Sfdy}
603b52d4755SXuan Hu
604e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){
6054aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6064aa9ed34Sfdy
6074aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6085c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
609b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
610e6ac7fe1SZiyue Zhang    val vtype8 = rvInst.ZIMM_VSETIVLI
611b52d4755SXuan Hu    Cat(uimm5, vtype8)
612b52d4755SXuan Hu  }
613b52d4755SXuan Hu  /**
614b52d4755SXuan Hu    * get VType from extended imm
615b52d4755SXuan Hu    * @param extedImm
616b52d4755SXuan Hu    * @return VType
617b52d4755SXuan Hu    */
618b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
619b52d4755SXuan Hu    val vtype = Wire(new InstVType)
620e6ac7fe1SZiyue Zhang    vtype := extedImm(9, 0).asTypeOf(new InstVType)
621b52d4755SXuan Hu    vtype
622b52d4755SXuan Hu  }
623b52d4755SXuan Hu
624b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
625e6ac7fe1SZiyue Zhang    extedImm(14, 10)
6264aa9ed34Sfdy  }
6274aa9ed34Sfdy}
628fe528fd6Ssinsanction
629fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
630fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
631fe528fd6Ssinsanction
632fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
633fe528fd6Ssinsanction    instr(31, 0)
634fe528fd6Ssinsanction  }
635fe528fd6Ssinsanction}
636fe528fd6Ssinsanction
6377e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
6387e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
6397e30d16cSZhaoyang You
6407e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
6417e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
6427e30d16cSZhaoyang You  }
6437e30d16cSZhaoyang You}
6447e30d16cSZhaoyang You
645b0ae3ac4SLinJiaweiobject ImmUnion {
646b0ae3ac4SLinJiawei  val I = Imm_I()
647b0ae3ac4SLinJiawei  val S = Imm_S()
648b0ae3ac4SLinJiawei  val B = Imm_B()
649b0ae3ac4SLinJiawei  val U = Imm_U()
650b0ae3ac4SLinJiawei  val J = Imm_J()
651b0ae3ac4SLinJiawei  val Z = Imm_Z()
652ee8ff153Szfw  val B6 = Imm_B6()
65358c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
65458c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
6554aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
6564aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
657fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
6587e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
6594aa9ed34Sfdy
660520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
6617e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
662b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
663b0ae3ac4SLinJiawei  val immSelMap = Seq(
664b0ae3ac4SLinJiawei    SelImm.IMM_I,
665b0ae3ac4SLinJiawei    SelImm.IMM_S,
666b0ae3ac4SLinJiawei    SelImm.IMM_SB,
667b0ae3ac4SLinJiawei    SelImm.IMM_U,
668b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
669ee8ff153Szfw    SelImm.IMM_Z,
67058c35d23Shuxuan0307    SelImm.IMM_B6,
67158c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
6724aa9ed34Sfdy    SelImm.IMM_OPIVIU,
6734aa9ed34Sfdy    SelImm.IMM_VSETVLI,
674fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
6757e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
676b0ae3ac4SLinJiawei  ).zip(imms)
677b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
678b0ae3ac4SLinJiawei}
679b0ae3ac4SLinJiawei
680fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
681fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
682fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
683765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
684fd7603d9SYinan Xu  }
6853b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
686fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
6873b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
688f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
689fd7603d9SYinan Xu  }
690fd7603d9SYinan Xu}
691b0ae3ac4SLinJiawei
692be25371aSYikeZhou/**
693be25371aSYikeZhou * IO bundle for the Decode unit
694be25371aSYikeZhou */
695aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
696aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
697aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
698aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
699aaa08c5aSxiaofeibao-xjtu}
7002225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
7013b739f49SXuan Hu  val enq = new Bundle {
7023b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
703d91483a6Sfdy    val vtype = Input(new VType)
7045110577fSZiyue Zhang    val vstart = Input(Vl())
7054aa9ed34Sfdy  }
7063b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
707aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
708af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
70915ed99a7SXuan Hu  val fromCSR = Input(new CSRToDecode)
710be25371aSYikeZhou}
711be25371aSYikeZhou
712be25371aSYikeZhou/**
713be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
714be25371aSYikeZhou */
7152225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
716be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
717be25371aSYikeZhou
7183b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
719be25371aSYikeZhou
72075e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
72175e2c883SXuan Hu
72257a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
72357a10886SXuan Hu    FpDecode.table ++
724bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
725768f5f91SYangyu Chen    BitmanipDecode.table ++
726768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
727a19215ddSYinan Xu    XSTrapDecode.table ++
728a19215ddSYinan Xu    CBODecode.table ++
729b65b9ebaSXuan Hu    SvinvalDecode.table ++
730e25e4d90SXuan Hu    HypervisorDecode.table ++
731545d7be0SYangyu Chen    VecDecoder.table ++
732545d7be0SYangyu Chen    ZicondDecode.table
733b65b9ebaSXuan Hu
73489cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
735a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
736239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
737a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
738a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
739be25371aSYikeZhou
7404d24c305SYikeZhou  // output
7413b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
742be25371aSYikeZhou
7432ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
7447ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
7453b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
7461a1319cbSLinJiawei
7473b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
7483b739f49SXuan Hu
749a8db15d8Sfdy  decodedInst.uopIdx := 0.U
750d91483a6Sfdy  decodedInst.firstUop := true.B
751d91483a6Sfdy  decodedInst.lastUop := true.B
752f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
7533235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
754deb6421eSHaojin Tang
75573c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
756f7af4c74Schengguanghui  decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
75773c4359eSYikeZhou
75849a2cda2SXuan Hu  // fmadd - b1000011
75949a2cda2SXuan Hu  // fmsub - b1000111
76049a2cda2SXuan Hu  // fnmsub- b1001011
76149a2cda2SXuan Hu  // fnmadd- b1001111
76249a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
763e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
764e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
76549a2cda2SXuan Hu
766178dd38cSYikeZhou  // read src1~3 location
76798cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
76898cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
76949a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
77049a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
7719c5a1080Sxiaofeibao  decodedInst.lsrc(3) := V0_IDX.U
7729c5a1080Sxiaofeibao  decodedInst.lsrc(4) := Vl_IDX.U
773b6b11f60SXuan Hu
774178dd38cSYikeZhou  // read dest location
77598cfe81bSxgkiri  decodedInst.ldest := inst.RD
7764d24c305SYikeZhou
777e4e68f86Sxiaofeibao  // init v0Wen vlWen
778e4e68f86Sxiaofeibao  decodedInst.v0Wen := false.B
779e4e68f86Sxiaofeibao  decodedInst.vlWen := false.B
780e4e68f86Sxiaofeibao
781c2a8ae00SYikeZhou  // fill in exception vector
782567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
783567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
784567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
785bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
7865110577fSZiyue Zhang  vecException.io.vstart := decodedInst.vpu.vstart
7874d24c305SYikeZhou
78815ed99a7SXuan Hu  private val exceptionII =
78915ed99a7SXuan Hu    decodedInst.selImm === SelImm.INVALID_INSTR ||
79015ed99a7SXuan Hu    vecException.io.illegalInst ||
79115ed99a7SXuan Hu    io.fromCSR.illegalInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence  ||
79215ed99a7SXuan Hu    io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
79315ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g ||
79415ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v ||
79515ed99a7SXuan Hu    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
7968b7dc6f5SsinceforYy    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
7978b7dc6f5SsinceforYy    io.fromCSR.illegalInst.fsIsOff    && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) ||
7988b7dc6f5SsinceforYy                                          (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) ||
799d60bfe5aSsinceforYy                                           FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) ||
800d60bfe5aSsinceforYy                                           isVecOPF) ||
801b50a88ecSXuan Hu    io.fromCSR.illegalInst.vsIsOff    && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) ||
802b50a88ecSXuan Hu    io.fromCSR.illegalInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType)
80315ed99a7SXuan Hu
80415ed99a7SXuan Hu  private val exceptionVI =
80515ed99a7SXuan Hu    io.fromCSR.virtualInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence ||
80615ed99a7SXuan Hu    io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
80715ed99a7SXuan Hu    io.fromCSR.virtualInst.hfence     && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) ||
80815ed99a7SXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
809b50a88ecSXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
810b50a88ecSXuan Hu    io.fromCSR.virtualInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType)
81115ed99a7SXuan Hu
81215ed99a7SXuan Hu  decodedInst.exceptionVec(illegalInstr) := exceptionII
81315ed99a7SXuan Hu  decodedInst.exceptionVec(virtualInstr) := exceptionVI
814d0de7e4aSpeixiaokun
8153b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
816b0ae3ac4SLinJiawei    x => {
8177ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
818b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
819b0ae3ac4SLinJiawei      x._1 -> minBits
820b0ae3ac4SLinJiawei    }
821b0ae3ac4SLinJiawei  ))
822aac4464eSYinan Xu
8237531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
8247531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
8257531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
8267531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
8277531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
8287531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
8297531c765SXuan Hu
8307531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
83175e2c883SXuan Hu
83275e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
833be25371aSYikeZhou
8340bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
83539c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
83639c388b5SXuan Hu  private val narrowInsts = Seq(
83739c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
83839c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
83939c388b5SXuan Hu  )
84039c388b5SXuan Hu  private val maskDstInsts = Seq(
84139c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
84239c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
84339c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
8449eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
8459eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
8469eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
8479eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
848f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
84939c388b5SXuan Hu  )
85030fcc710SZiyue Zhang  private val maskOpInsts = Seq(
85130fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
85230fcc710SZiyue Zhang  )
85394e6af68SZiyue-Zhang  private val vmaInsts = Seq(
85494e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
85594e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
85694e6af68SZiyue-Zhang  )
857bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
858bdda74fdSxiaofeibao-xjtu    // opfff
859bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
860bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
861bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
862bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
863bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
864bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
865bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
866bdda74fdSxiaofeibao-xjtu    // opfvv
867bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
868bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
869bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
870bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
871bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
872bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
873bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
874bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
875bdda74fdSxiaofeibao-xjtu    // opfvf
876bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
877bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
878bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
879bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
880bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
881bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
882bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
883aab8ef9cSxiaofeibao-xjtu    // vfred
884aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
885bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
886bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
887bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
888bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
889bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
890ba899681Schengguanghui    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,
891ba899681Schengguanghui    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,
892ba899681Schengguanghui    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,
893ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
894bdda74fdSxiaofeibao-xjtu  )
895bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
896bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
897bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
898bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
8993b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
900bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
901bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
902bdda74fdSxiaofeibao-xjtu  }.otherwise{
90375e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
90475e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
90575e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
90675e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
90775e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
90875e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
90975e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
910d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
91194e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
91239c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
913b6279fc6SZiyue Zhang    val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
914b6279fc6SZiyue Zhang    val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
915b6279fc6SZiyue Zhang    val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
916b6279fc6SZiyue Zhang    val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe
917dab1ad8cSsinsanction    val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse
918dab1ad8cSsinsanction    val isVlm = decodedInst.fuOpType === VlduType.vlm
919d8ceb649SZiyue Zhang    val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV
92094e6af68SZiyue-Zhang    val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
921dab1ad8cSsinsanction    val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew
922b6279fc6SZiyue Zhang    decodedInst.vpu.isNarrow := isNarrow
923b6279fc6SZiyue Zhang    decodedInst.vpu.isDstMask := isDstMask
924b6279fc6SZiyue Zhang    decodedInst.vpu.isOpMask := isOpMask
92594e6af68SZiyue-Zhang    decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma
926dab1ad8cSsinsanction    decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac
9275110577fSZiyue Zhang    decodedInst.vpu.vstart := io.enq.vstart
928bdda74fdSxiaofeibao-xjtu  }
92975e2c883SXuan Hu
93031c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
93131c51290Szhanglinjuan
9326d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
9336d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
9346d56ac16Ssinsanction
9357f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
93687dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
93787dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
93806cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
93987dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
9400a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
941c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
94206cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
943c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
9447f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
9457f9f0a79SzhanglyGit  io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop
9463235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
9477f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
9487f9f0a79SzhanglyGit
949*cc1eb70dSXuan Hu  val isCSR = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U
950*cc1eb70dSXuan Hu  val isCSRR = isCSR && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U
951*cc1eb70dSXuan Hu  val isCSRW = isCSR && inst.FUNCT3 === BitPat("b?10") && inst.RD  === 0.U
952*cc1eb70dSXuan Hu  dontTouch(isCSRR)
953*cc1eb70dSXuan Hu  dontTouch(isCSRW)
954*cc1eb70dSXuan Hu
95587c5d21dSZiyue Zhang  // for csrr vl instruction, convert to vsetvl
956*cc1eb70dSXuan Hu  val isCsrrVlenb = isCSRR && inst.CSRIDX === CSRs.vlenb.U
957*cc1eb70dSXuan Hu  val isCsrrVl    = isCSRR && inst.CSRIDX === CSRs.vl.U
958*cc1eb70dSXuan Hu
95987c5d21dSZiyue Zhang  when (isCsrrVl) {
96063cb3754SZiyue Zhang    // convert to vsetvl instruction
96187c5d21dSZiyue Zhang    decodedInst.srcType(0) := SrcType.no
96287c5d21dSZiyue Zhang    decodedInst.srcType(1) := SrcType.no
96387c5d21dSZiyue Zhang    decodedInst.srcType(2) := SrcType.no
96487c5d21dSZiyue Zhang    decodedInst.srcType(3) := SrcType.no
96587c5d21dSZiyue Zhang    decodedInst.srcType(4) := SrcType.vp
96687c5d21dSZiyue Zhang    decodedInst.lsrc(4)    := Vl_IDX.U
96763cb3754SZiyue Zhang    decodedInst.waitForward   := false.B
96887c5d21dSZiyue Zhang    decodedInst.blockBackward := false.B
96963cb3754SZiyue Zhang  }.elsewhen(isCsrrVlenb){
97063cb3754SZiyue Zhang    // convert to addi instruction
971828a8a48SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
972828a8a48SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
97363cb3754SZiyue Zhang    decodedInst.srcType(2) := SrcType.no
97463cb3754SZiyue Zhang    decodedInst.srcType(3) := SrcType.no
97563cb3754SZiyue Zhang    decodedInst.srcType(4) := SrcType.no
97663cb3754SZiyue Zhang    decodedInst.selImm := SelImm.IMM_I
97763cb3754SZiyue Zhang    decodedInst.waitForward := false.B
97863cb3754SZiyue Zhang    decodedInst.blockBackward := false.B
97963cb3754SZiyue Zhang    decodedInst.canRobCompress := true.B
98087c5d21dSZiyue Zhang  }
98187c5d21dSZiyue Zhang
98275e2c883SXuan Hu  io.deq.decodedInst := decodedInst
9839faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
984985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
985*cc1eb70dSXuan Hu    // keep condition
986*cc1eb70dSXuan Hu    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType,
98787c5d21dSZiyue Zhang    (isCsrrVl) -> FuType.vsetfwf.U,
98863cb3754SZiyue Zhang    (isCsrrVlenb) -> FuType.alu.U,
989*cc1eb70dSXuan Hu
990*cc1eb70dSXuan Hu    // change vlsu to vseglsu when NF =/= 0.U
991f94f6503SXuan 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,
992f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
993f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
994f94f6503SXuan 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,
995f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
996f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
997f94f6503SXuan 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,
998985804e6SXuan Hu  ))
99963cb3754SZiyue Zhang  io.deq.decodedInst.imm := Mux(isCsrrVlenb, (VLEN / 8).U, decodedInst.imm)
1000*cc1eb70dSXuan Hu
1001*cc1eb70dSXuan Hu  io.deq.decodedInst.fuOpType := Mux1H(Seq(
1002*cc1eb70dSXuan Hu    // keep condition
1003*cc1eb70dSXuan Hu    !isCsrrVl && !isCsrrVlenb -> decodedInst.fuOpType,
1004*cc1eb70dSXuan Hu    isCsrrVl    -> VSETOpType.csrrvl,
1005*cc1eb70dSXuan Hu    isCsrrVlenb -> ALUOpType.add,
1006*cc1eb70dSXuan Hu  ))
1007be25371aSYikeZhou  //-------------------------------------------------------------
1008be25371aSYikeZhou  // Debug Info
10093b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
10103b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
10113b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
10123b739f49SXuan 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",
10133b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
10143b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
10153b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
10163b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
10173b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
10183b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
10193b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
10203b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
1021be25371aSYikeZhou}
1022