xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 94e6af6800aeeba038c60ecb8fbfd749e9bca734)
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}
305c1681d0SXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, XSInstBitFields}
31395c8649SZiyue-Zhangimport xiangshan.backend.fu.vector.Bundles.VType
32be25371aSYikeZhou
33be25371aSYikeZhou/**
34be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
35be25371aSYikeZhou */
36be25371aSYikeZhouabstract trait DecodeConstants {
37361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
3857a10886SXuan Hu  def X = BitPat("b0")
394d24c305SYikeZhou  def N = BitPat("b0")
404d24c305SYikeZhou  def Y = BitPat("b1")
4157a10886SXuan Hu  def T = true
4257a10886SXuan Hu  def F = false
434d24c305SYikeZhou
44c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
4520e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
464d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
4757a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
4857a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
4957a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5057a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5157a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
5289cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  canRobCompress
5389cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  uopSplitType
5489cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  |             selImm
5589cc69c1STang 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
564d24c305SYikeZhou
5757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
5857a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
59be25371aSYikeZhou}
60be25371aSYikeZhou
61c2a8ae00SYikeZhoutrait DecodeUnitConstants
624d24c305SYikeZhou{
634d24c305SYikeZhou  // abstract out instruction decode magic numbers
644d24c305SYikeZhou  val RD_MSB  = 11
654d24c305SYikeZhou  val RD_LSB  = 7
664d24c305SYikeZhou  val RS1_MSB = 19
674d24c305SYikeZhou  val RS1_LSB = 15
684d24c305SYikeZhou  val RS2_MSB = 24
694d24c305SYikeZhou  val RS2_LSB = 20
704d24c305SYikeZhou  val RS3_MSB = 31
714d24c305SYikeZhou  val RS3_LSB = 27
724d24c305SYikeZhou}
734d24c305SYikeZhou
74be25371aSYikeZhou/**
75be25371aSYikeZhou * Decoded control signals
764d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
77be25371aSYikeZhou */
78c2a8ae00SYikeZhou
7957a10886SXuan Huabstract class XSDecodeBase {
8057a10886SXuan Hu  def X = BitPat("b?")
8157a10886SXuan Hu  def N = BitPat("b0")
8257a10886SXuan Hu  def Y = BitPat("b1")
8357a10886SXuan Hu  def T = true
8457a10886SXuan Hu  def F = false
8557a10886SXuan Hu  def generate() : List[BitPat]
8657a10886SXuan Hu}
8757a10886SXuan Hu
8857a10886SXuan Hucase class XSDecode(
8957a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
90239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat,
91e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9257a10886SXuan Hu  xWen: Boolean = false,
9357a10886SXuan Hu  fWen: Boolean = false,
9457a10886SXuan Hu  vWen: Boolean = false,
9557a10886SXuan Hu  mWen: Boolean = false,
9657a10886SXuan Hu  xsTrap: Boolean = false,
9757a10886SXuan Hu  noSpec: Boolean = false,
9857a10886SXuan Hu  blockBack: Boolean = false,
9957a10886SXuan Hu  flushPipe: Boolean = false,
10089cc69c1STang Haojin  canRobCompress: Boolean = false,
10157a10886SXuan Hu) extends XSDecodeBase {
10257a10886SXuan Hu  def generate() : List[BitPat] = {
10389cc69c1STang 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)
10457a10886SXuan Hu  }
10557a10886SXuan Hu}
10657a10886SXuan Hu
10757a10886SXuan Hucase class FDecode(
10857a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
109239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X,
11017ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
11157a10886SXuan Hu  xWen: Boolean = false,
11257a10886SXuan Hu  fWen: Boolean = false,
11357a10886SXuan Hu  vWen: Boolean = false,
11457a10886SXuan Hu  mWen: Boolean = false,
11557a10886SXuan Hu  xsTrap: Boolean = false,
11657a10886SXuan Hu  noSpec: Boolean = false,
11757a10886SXuan Hu  blockBack: Boolean = false,
11857a10886SXuan Hu  flushPipe: Boolean = false,
11989cc69c1STang Haojin  canRobCompress: Boolean = false,
12057a10886SXuan Hu) extends XSDecodeBase {
12157a10886SXuan Hu  def generate() : List[BitPat] = {
12289cc69c1STang Haojin    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate()
12357a10886SXuan Hu  }
12457a10886SXuan Hu}
12557a10886SXuan Hu
126be25371aSYikeZhou/**
127be25371aSYikeZhou * Overall Decode constants
128be25371aSYikeZhou */
129be25371aSYikeZhouobject XDecode extends DecodeConstants {
13057a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
131768f5f91SYangyu Chen    // RV32I
13257a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
13357a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
13457a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
13557a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
13657a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
13757a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
13857a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
13957a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
14089cc69c1STang Haojin    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T),
14189cc69c1STang Haojin    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T),
14289cc69c1STang Haojin    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T),
14389cc69c1STang Haojin    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T, canRobCompress = T),
14489cc69c1STang Haojin    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T),
14589cc69c1STang Haojin    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T),
14689cc69c1STang Haojin    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T),
14789cc69c1STang Haojin    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T, canRobCompress = T),
14889cc69c1STang Haojin    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T, canRobCompress = T),
14989cc69c1STang Haojin    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T, canRobCompress = T),
15089cc69c1STang Haojin    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T, canRobCompress = T),
15189cc69c1STang Haojin    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T, canRobCompress = T),
15289cc69c1STang Haojin    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T, canRobCompress = T),
15389cc69c1STang Haojin    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T, canRobCompress = T),
15489cc69c1STang Haojin    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T, canRobCompress = T),
15589cc69c1STang Haojin    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T, canRobCompress = T),
15689cc69c1STang Haojin    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T, canRobCompress = T),
1574d24c305SYikeZhou
158768f5f91SYangyu Chen    // RV64I (extend from RV32I)
159768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
160768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
161768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
162768f5f91SYangyu Chen
163768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
164768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
165768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
166768f5f91SYangyu Chen
167768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
168768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
169768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
170768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
171768f5f91SYangyu Chen
172768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
173768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
174768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
175768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
176768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
177768f5f91SYangyu Chen
178768f5f91SYangyu Chen    // RV64M
17989cc69c1STang Haojin    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T, canRobCompress = T),
18089cc69c1STang Haojin    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T, canRobCompress = T),
18189cc69c1STang Haojin    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T),
18289cc69c1STang Haojin    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T),
18389cc69c1STang Haojin    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T, canRobCompress = T),
1844d24c305SYikeZhou
18589cc69c1STang Haojin    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T, canRobCompress = T),
18689cc69c1STang Haojin    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T, canRobCompress = T),
18789cc69c1STang Haojin    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T, canRobCompress = T),
18889cc69c1STang Haojin    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T, canRobCompress = T),
18989cc69c1STang Haojin    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T, canRobCompress = T),
19089cc69c1STang Haojin    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T),
19189cc69c1STang Haojin    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T, canRobCompress = T),
19289cc69c1STang Haojin    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T),
1934d24c305SYikeZhou
194f7af4c74Schengguanghui    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
19557a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
196e2695e90SzhanglyGit    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , uopSplitType = UopSplitType.SCA_SIM, xWen = T),
1973b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
1983b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
1993b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2003b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2013b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2023b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2034d24c305SYikeZhou
204768f5f91SYangyu Chen    // System, the immediate12 holds the CSR register.
20557a10886SXuan Hu    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
20657a10886SXuan Hu    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
20757a10886SXuan Hu    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2084d24c305SYikeZhou
20957a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21057a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21157a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2124d24c305SYikeZhou
21357a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21457a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21557a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21657a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21757a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21857a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2194d24c305SYikeZhou
22057a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22157a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
22257a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2234d24c305SYikeZhou
224768f5f91SYangyu Chen    // RV64A
22557a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
22657a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
22757a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
22857a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
22957a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23057a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23157a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23257a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23357a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2344d24c305SYikeZhou
23557a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23657a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23757a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23857a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23957a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24057a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24157a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24257a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24357a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2444d24c305SYikeZhou
24557a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24757a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24857a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
249768f5f91SYangyu Chen  )
250768f5f91SYangyu Chen}
251ee8ff153Szfw
252768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
253768f5f91SYangyu Chen  /*
254768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
255768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
256768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
257768f5f91SYangyu Chen   */
258768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
259768f5f91SYangyu Chen    // Zba
260768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
261768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
262768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
263768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
264768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
265768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
266768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
267768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
268768f5f91SYangyu Chen
269768f5f91SYangyu Chen    // Zbb
27089cc69c1STang Haojin    ANDN      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn    , SelImm.X    , xWen = T, canRobCompress = T),
27189cc69c1STang Haojin    ORN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn     , SelImm.X    , xWen = T, canRobCompress = T),
27289cc69c1STang Haojin    XNOR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor    , SelImm.X    , xWen = T, canRobCompress = T),
273ee8ff153Szfw
274768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
275768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
276768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
277768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
278768f5f91SYangyu Chen
279768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
280768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
281768f5f91SYangyu Chen
28289cc69c1STang Haojin    MAX       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max     , SelImm.X    , xWen = T, canRobCompress = T),
28389cc69c1STang Haojin    MAXU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu    , SelImm.X    , xWen = T, canRobCompress = T),
284768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
285768f5f91SYangyu Chen    MINU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu    , SelImm.X    , xWen = T, canRobCompress = T),
286ee8ff153Szfw
28789cc69c1STang Haojin    SEXT_B    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb   , SelImm.X    , xWen = T, canRobCompress = T),
28889cc69c1STang Haojin    SEXT_H    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth   , SelImm.X    , xWen = T, canRobCompress = T),
289768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
290768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
291ee8ff153Szfw
292768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
293768f5f91SYangyu Chen    ROLW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw    , SelImm.X    , xWen = T, canRobCompress = T),
29489cc69c1STang Haojin    ROR       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.X    , xWen = T, canRobCompress = T),
29589cc69c1STang Haojin    RORI      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.IMM_I, xWen = T, canRobCompress = T),
296768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
297768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
298ee8ff153Szfw
299768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
300768f5f91SYangyu Chen
301768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
302768f5f91SYangyu Chen
303768f5f91SYangyu Chen    // Zbc
304768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
305768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
306768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
307768f5f91SYangyu Chen
308768f5f91SYangyu Chen    // Zbs
309768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
310768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
311768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
312768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
313768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
314768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
315768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
316768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
317768f5f91SYangyu Chen
318768f5f91SYangyu Chen    // Zbkb
319768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
320768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
321768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
322768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
323768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
324768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
325768f5f91SYangyu Chen
326768f5f91SYangyu Chen    // Zbkc
327768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
328768f5f91SYangyu Chen
329768f5f91SYangyu Chen    // Zbkx
330768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
331768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
332768f5f91SYangyu Chen  )
333768f5f91SYangyu Chen}
334768f5f91SYangyu Chen
335768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
336768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
337768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
338768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
339768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
340768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
341768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
342768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
343768f5f91SYangyu Chen
344768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
345768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
346768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
347768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
348768f5f91SYangyu Chen
349768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
350768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
351768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
352768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
353768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
354768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
355768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
356768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
357768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
358768f5f91SYangyu Chen
359768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
360768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
361768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
362768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
363768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
364768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
365768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
366768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
367768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
368768f5f91SYangyu Chen
369768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
370768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
371768f5f91SYangyu Chen    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1     , SelImm.X    , xWen = T, canRobCompress = T),
3724d24c305SYikeZhou  )
373be25371aSYikeZhou}
374be25371aSYikeZhou
375be25371aSYikeZhou/**
376be25371aSYikeZhou * FP Decode constants
377be25371aSYikeZhou */
37857a10886SXuan Huobject FpDecode extends DecodeConstants{
37957a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
38057a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
38157a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
38257a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
38357a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3844d24c305SYikeZhou
385964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
386964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
387c2a8ae00SYikeZhou
3884d24c305SYikeZhou    // Int to FP
38989cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39089cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39189cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39289cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
3934d24c305SYikeZhou
39489cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39589cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39689cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39789cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
3984d24c305SYikeZhou
3994d24c305SYikeZhou  )
400be25371aSYikeZhou}
401be25371aSYikeZhou
402be25371aSYikeZhou/**
403be25371aSYikeZhou * FP Divide SquareRoot Constants
404be25371aSYikeZhou */
405be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
40657a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
40789cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
40889cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
40989cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41089cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4114d24c305SYikeZhou  )
412be25371aSYikeZhou}
413be25371aSYikeZhou
4144d24c305SYikeZhou/**
415af2f7849Shappy-lx * Svinval extension Constants
416af2f7849Shappy-lx */
417af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
41857a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
419af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
420af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
421af2f7849Shappy-lx     */
42257a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
423af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
424af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
425af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
426af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
427af2f7849Shappy-lx     */
42857a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
429af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
430af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
431af2f7849Shappy-lx     * then dispatch and issue this instrucion
432af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
433af2f7849Shappy-lx     */
43457a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
435af2f7849Shappy-lx    /* what is Svinval extension ?
436af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
437af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
438af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
439af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
440af2f7849Shappy-lx     *
441af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
442af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
443af2f7849Shappy-lx     */
444af2f7849Shappy-lx  )
445af2f7849Shappy-lx}
44657a10886SXuan Hu
447af2f7849Shappy-lx/*
448ca18a0b4SWilliam Wang * CBO decode
449ca18a0b4SWilliam Wang */
450ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
45157a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
45257a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
45357a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
45457a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
45557a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
456ca18a0b4SWilliam Wang  )
457ca18a0b4SWilliam Wang}
458ca18a0b4SWilliam Wang
459d0de7e4aSpeixiaokun/*
460d0de7e4aSpeixiaokun * Hypervisor decode
461d0de7e4aSpeixiaokun */
462d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
463e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
464e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
465e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
466e25e4d90SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X),
467e25e4d90SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X),
468e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
469e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
470e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
471e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
472e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
473e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
474e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
475e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
476e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
477e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
478e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
479e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
480e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
481d0de7e4aSpeixiaokun  )
482d0de7e4aSpeixiaokun}
483d0de7e4aSpeixiaokun
484545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
485545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
486545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
487545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
488545d7be0SYangyu Chen  )
489545d7be0SYangyu Chen}
490545d7be0SYangyu Chen
491ca18a0b4SWilliam Wang/**
4924d24c305SYikeZhou * XiangShan Trap Decode constants
4934d24c305SYikeZhou */
4944d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
495361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
49657a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
49757a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
4984d24c305SYikeZhou  )
4994d24c305SYikeZhou}
500be25371aSYikeZhou
50149f433deSXuan Huabstract class Imm(val len: Int) {
502b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
503b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
504b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
505b0ae3ac4SLinJiawei}
506b0ae3ac4SLinJiawei
507b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
508fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
509b0ae3ac4SLinJiawei
510b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
511b0ae3ac4SLinJiawei    Cat(instr(31, 20))
512b0ae3ac4SLinJiawei}
513b0ae3ac4SLinJiawei
514b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
515b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
516b0ae3ac4SLinJiawei
517b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
518b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
519b0ae3ac4SLinJiawei}
520b0ae3ac4SLinJiawei
521b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
522b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
523b0ae3ac4SLinJiawei
524b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
525b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
526b0ae3ac4SLinJiawei}
527b0ae3ac4SLinJiawei
528b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
529fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
530b0ae3ac4SLinJiawei
531b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
532b0ae3ac4SLinJiawei    instr(31, 12)
533c2a8ae00SYikeZhou  }
534c2a8ae00SYikeZhou}
535c2a8ae00SYikeZhou
536b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
537b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
538b0ae3ac4SLinJiawei
539b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
540b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
541b0ae3ac4SLinJiawei  }
542b0ae3ac4SLinJiawei}
543b0ae3ac4SLinJiawei
544b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){
545b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
546b0ae3ac4SLinJiawei
547b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
548b0ae3ac4SLinJiawei    Cat(instr(19, 15), instr(31, 20))
549b0ae3ac4SLinJiawei  }
550b0ae3ac4SLinJiawei}
551b0ae3ac4SLinJiawei
552ee8ff153Szfwcase class Imm_B6() extends Imm(6){
553ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
554ee8ff153Szfw
555ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
556ee8ff153Szfw    instr(25, 20)
557ee8ff153Szfw  }
558ee8ff153Szfw}
559ee8ff153Szfw
56058c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
56158c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
56258c35d23Shuxuan0307
56358c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
56458c35d23Shuxuan0307    instr(19, 15)
56558c35d23Shuxuan0307  }
56658c35d23Shuxuan0307}
567b52d4755SXuan Hu
56858c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
56958c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
57058c35d23Shuxuan0307
57158c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
57258c35d23Shuxuan0307    instr(19, 15)
57358c35d23Shuxuan0307  }
57458c35d23Shuxuan0307}
575b52d4755SXuan Hu
5764aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
5774aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
5784aa9ed34Sfdy
5794aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
5804aa9ed34Sfdy    instr(30, 20)
5814aa9ed34Sfdy  }
5824aa9ed34Sfdy}
583b52d4755SXuan Hu
584b52d4755SXuan Hucase class Imm_VSETIVLI() extends Imm(13){
5854aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
5864aa9ed34Sfdy
5874aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
5885c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
589b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
590b52d4755SXuan Hu    val vtype8 = rvInst.ZIMM_VTYPE
591b52d4755SXuan Hu    Cat(uimm5, vtype8)
592b52d4755SXuan Hu  }
593b52d4755SXuan Hu  /**
594b52d4755SXuan Hu    * get VType from extended imm
595b52d4755SXuan Hu    * @param extedImm
596b52d4755SXuan Hu    * @return VType
597b52d4755SXuan Hu    */
598b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
599b52d4755SXuan Hu    val vtype = Wire(new InstVType)
600b52d4755SXuan Hu    vtype := extedImm(7, 0).asTypeOf(new InstVType)
601b52d4755SXuan Hu    vtype
602b52d4755SXuan Hu  }
603b52d4755SXuan Hu
604b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
605b52d4755SXuan Hu    extedImm(12, 8)
6064aa9ed34Sfdy  }
6074aa9ed34Sfdy}
608fe528fd6Ssinsanction
609fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
610fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
611fe528fd6Ssinsanction
612fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
613fe528fd6Ssinsanction    instr(31, 0)
614fe528fd6Ssinsanction  }
615fe528fd6Ssinsanction}
616fe528fd6Ssinsanction
6177e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
6187e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
6197e30d16cSZhaoyang You
6207e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
6217e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
6227e30d16cSZhaoyang You  }
6237e30d16cSZhaoyang You}
6247e30d16cSZhaoyang You
625b0ae3ac4SLinJiaweiobject ImmUnion {
626b0ae3ac4SLinJiawei  val I = Imm_I()
627b0ae3ac4SLinJiawei  val S = Imm_S()
628b0ae3ac4SLinJiawei  val B = Imm_B()
629b0ae3ac4SLinJiawei  val U = Imm_U()
630b0ae3ac4SLinJiawei  val J = Imm_J()
631b0ae3ac4SLinJiawei  val Z = Imm_Z()
632ee8ff153Szfw  val B6 = Imm_B6()
63358c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
63458c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
6354aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
6364aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
637fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
6387e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
6394aa9ed34Sfdy
640520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
6417e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
642b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
643b0ae3ac4SLinJiawei  val immSelMap = Seq(
644b0ae3ac4SLinJiawei    SelImm.IMM_I,
645b0ae3ac4SLinJiawei    SelImm.IMM_S,
646b0ae3ac4SLinJiawei    SelImm.IMM_SB,
647b0ae3ac4SLinJiawei    SelImm.IMM_U,
648b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
649ee8ff153Szfw    SelImm.IMM_Z,
65058c35d23Shuxuan0307    SelImm.IMM_B6,
65158c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
6524aa9ed34Sfdy    SelImm.IMM_OPIVIU,
6534aa9ed34Sfdy    SelImm.IMM_VSETVLI,
654fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
6557e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
656b0ae3ac4SLinJiawei  ).zip(imms)
657b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
658b0ae3ac4SLinJiawei}
659b0ae3ac4SLinJiawei
660fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
661fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
662fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
663765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
664fd7603d9SYinan Xu  }
6653b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
666fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
6673b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
668f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
669fd7603d9SYinan Xu  }
670fd7603d9SYinan Xu}
671b0ae3ac4SLinJiawei
672be25371aSYikeZhou/**
673be25371aSYikeZhou * IO bundle for the Decode unit
674be25371aSYikeZhou */
675aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
676aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
677aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
678aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
679aaa08c5aSxiaofeibao-xjtu}
6802225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
6813b739f49SXuan Hu  val enq = new Bundle {
6823b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
683d91483a6Sfdy    val vtype = Input(new VType)
6844aa9ed34Sfdy  }
6853b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
686aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
687af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
688be25371aSYikeZhou}
689be25371aSYikeZhou
690be25371aSYikeZhou/**
691be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
692be25371aSYikeZhou */
6932225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
694be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
695be25371aSYikeZhou
6963b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
697be25371aSYikeZhou
69875e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
69975e2c883SXuan Hu
70057a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
70157a10886SXuan Hu    FpDecode.table ++
702bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
703768f5f91SYangyu Chen    BitmanipDecode.table ++
704768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
705a19215ddSYinan Xu    XSTrapDecode.table ++
706a19215ddSYinan Xu    CBODecode.table ++
707b65b9ebaSXuan Hu    SvinvalDecode.table ++
708e25e4d90SXuan Hu    HypervisorDecode.table ++
709545d7be0SYangyu Chen    VecDecoder.table ++
710545d7be0SYangyu Chen    ZicondDecode.table
711b65b9ebaSXuan Hu
71289cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
713a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
714239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
715a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
716a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
717be25371aSYikeZhou
7184d24c305SYikeZhou  // output
7193b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
720be25371aSYikeZhou
7212ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
7227ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
7233b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
7241a1319cbSLinJiawei
7253b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
7263b739f49SXuan Hu
727a8db15d8Sfdy  decodedInst.uopIdx := 0.U
728d91483a6Sfdy  decodedInst.firstUop := true.B
729d91483a6Sfdy  decodedInst.lastUop := true.B
730f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
7313235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
732deb6421eSHaojin Tang
73373c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
734f7af4c74Schengguanghui  decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
73573c4359eSYikeZhou
73649a2cda2SXuan Hu  // fmadd - b1000011
73749a2cda2SXuan Hu  // fmsub - b1000111
73849a2cda2SXuan Hu  // fnmsub- b1001011
73949a2cda2SXuan Hu  // fnmadd- b1001111
74049a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
741e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
742e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
74349a2cda2SXuan Hu
744996aacc9SXuan Hu  private val v0Idx = 0
745996aacc9SXuan Hu  private val vconfigIdx = VCONFIG_IDX
746996aacc9SXuan Hu
747178dd38cSYikeZhou  // read src1~3 location
74898cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
74998cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
75049a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
75149a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
752996aacc9SXuan Hu  decodedInst.lsrc(3) := v0Idx.U
753996aacc9SXuan Hu  decodedInst.lsrc(4) := vconfigIdx.U
754b6b11f60SXuan Hu
755178dd38cSYikeZhou  // read dest location
75698cfe81bSxgkiri  decodedInst.ldest := inst.RD
7574d24c305SYikeZhou
758c2a8ae00SYikeZhou  // fill in exception vector
759567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
760567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
761567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
762bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
763567f0269Ssinsanction  decodedInst.exceptionVec(illegalInstr) := decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst
7644d24c305SYikeZhou
765af2f7849Shappy-lx  when (!io.csrCtrl.svinval_enable) {
766567f0269Ssinsanction    val base_ii = decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst
767af2f7849Shappy-lx    val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr
768af2f7849Shappy-lx    val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr
769af2f7849Shappy-lx    val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr
770d0de7e4aSpeixiaokun    val hinval_gvma = HINVAL_GVMA === ctrl_flow.instr
771d0de7e4aSpeixiaokun    val hinval_vvma = HINVAL_VVMA === ctrl_flow.instr
772d0de7e4aSpeixiaokun    val svinval_ii = sinval || w_inval || inval_ir || hinval_gvma || hinval_vvma
7733b739f49SXuan Hu    decodedInst.exceptionVec(illegalInstr) := base_ii || svinval_ii
7743b739f49SXuan Hu    decodedInst.flushPipe := false.B
775af2f7849Shappy-lx  }
776af2f7849Shappy-lx
777d0de7e4aSpeixiaokun  when(io.csrCtrl.virtMode){
778e25e4d90SXuan Hu    // Todo: optimize EX_VI decode
779d0de7e4aSpeixiaokun    // vs/vu attempting to exec hyperinst will raise virtual instruction
780e25e4d90SXuan Hu    decodedInst.exceptionVec(virtualInstr) := ctrl_flow.instr === HLV_B || ctrl_flow.instr === HLV_BU ||
781d0de7e4aSpeixiaokun      ctrl_flow.instr === HLV_H   || ctrl_flow.instr === HLV_HU ||
782d0de7e4aSpeixiaokun      ctrl_flow.instr === HLVX_HU || ctrl_flow.instr === HLV_W  ||
783d0de7e4aSpeixiaokun      ctrl_flow.instr === HLVX_WU || ctrl_flow.instr === HLV_WU ||
784d0de7e4aSpeixiaokun      ctrl_flow.instr === HLV_D   || ctrl_flow.instr === HSV_B  ||
785d0de7e4aSpeixiaokun      ctrl_flow.instr === HSV_H   || ctrl_flow.instr === HSV_W  ||
786d0de7e4aSpeixiaokun      ctrl_flow.instr === HSV_D   || ctrl_flow.instr === HFENCE_VVMA ||
787d0de7e4aSpeixiaokun      ctrl_flow.instr === HFENCE_GVMA || ctrl_flow.instr === HINVAL_GVMA ||
788d0de7e4aSpeixiaokun      ctrl_flow.instr === HINVAL_VVMA
789d0de7e4aSpeixiaokun  }
790d0de7e4aSpeixiaokun
7913b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
792b0ae3ac4SLinJiawei    x => {
7937ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
794b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
795b0ae3ac4SLinJiawei      x._1 -> minBits
796b0ae3ac4SLinJiawei    }
797b0ae3ac4SLinJiawei  ))
798aac4464eSYinan Xu
7997531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
8007531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
8017531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
8027531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
8037531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
8047531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
8057531c765SXuan Hu
8067531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
80775e2c883SXuan Hu
80875e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
809be25371aSYikeZhou
8100bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
81139c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
81239c388b5SXuan Hu  private val narrowInsts = Seq(
81339c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
81439c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
81539c388b5SXuan Hu  )
81639c388b5SXuan Hu  private val maskDstInsts = Seq(
81739c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
81839c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
81939c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
8209eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
8219eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
8229eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
8239eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
824f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
82539c388b5SXuan Hu  )
82630fcc710SZiyue Zhang  private val maskOpInsts = Seq(
82730fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
82830fcc710SZiyue Zhang  )
829*94e6af68SZiyue-Zhang  private val vmaInsts = Seq(
830*94e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
831*94e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
832*94e6af68SZiyue-Zhang  )
833bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
834bdda74fdSxiaofeibao-xjtu    // opfff
835bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
836bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
837bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
838bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
839bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
840bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
841bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
842bdda74fdSxiaofeibao-xjtu    // opfvv
843bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
844bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
845bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
846bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
847bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
848bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
849bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
850bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
851bdda74fdSxiaofeibao-xjtu    // opfvf
852bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
853bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
854bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
855bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
856bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
857bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
858bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
859aab8ef9cSxiaofeibao-xjtu    // vfred
860aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
861bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
862bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
863bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
864bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
865bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
866ba899681Schengguanghui    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,
867ba899681Schengguanghui    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,
868ba899681Schengguanghui    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,
869ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
870bdda74fdSxiaofeibao-xjtu  )
871bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
872bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
873bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
874bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
8753b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
876bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
877bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
878bdda74fdSxiaofeibao-xjtu  }.otherwise{
87975e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
88075e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
88175e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
88275e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
88375e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
88475e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
88575e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
886d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
88794e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
88839c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
889b6279fc6SZiyue Zhang    val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
890b6279fc6SZiyue Zhang    val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
891b6279fc6SZiyue Zhang    val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
892b6279fc6SZiyue Zhang    val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe
893d8ceb649SZiyue Zhang    val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV
894*94e6af68SZiyue-Zhang    val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
895b6279fc6SZiyue Zhang    decodedInst.vpu.isNarrow := isNarrow
896b6279fc6SZiyue Zhang    decodedInst.vpu.isDstMask := isDstMask
897b6279fc6SZiyue Zhang    decodedInst.vpu.isOpMask := isOpMask
898*94e6af68SZiyue-Zhang    decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma
899d8ceb649SZiyue Zhang    decodedInst.vpu.isWritePartVd := isWritePartVd
900bdda74fdSxiaofeibao-xjtu  }
90175e2c883SXuan Hu
90231c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
90331c51290Szhanglinjuan
9046d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
9056d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
9066d56ac16Ssinsanction
9077f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
90887dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
90987dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
91006cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
91187dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
9120a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
913c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
91406cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
915c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
9167f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
9177f9f0a79SzhanglyGit  io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop
9183235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
9197f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
9207f9f0a79SzhanglyGit
92175e2c883SXuan Hu  io.deq.decodedInst := decodedInst
9229faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
923985804e6SXuan Hu  // change vlsu to vseglsu when NF =/= 0.U
924985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
925985804e6SXuan Hu    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu)                   ) -> decodedInst.fuType,
926f94f6503SXuan 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,
927f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
928f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
929f94f6503SXuan 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,
930f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
931f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
932f94f6503SXuan 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,
933985804e6SXuan Hu  ))
934be25371aSYikeZhou  //-------------------------------------------------------------
935be25371aSYikeZhou  // Debug Info
9363b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
9373b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
9383b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
9393b739f49SXuan 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",
9403b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
9413b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
9423b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
9433b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
9443b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
9453b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
9463b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
9473b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
948be25371aSYikeZhou}
949