xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision 768f5f9108a2fd8e654265dd187354206479e644)
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(
131*768f5f91SYangyu 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
158*768f5f91SYangyu Chen    // RV64I (extend from RV32I)
159*768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
160*768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
161*768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
162*768f5f91SYangyu Chen
163*768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
164*768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
165*768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
166*768f5f91SYangyu Chen
167*768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
168*768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
169*768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
170*768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
171*768f5f91SYangyu Chen
172*768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
173*768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
174*768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
175*768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
176*768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
177*768f5f91SYangyu Chen
178*768f5f91SYangyu 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
204*768f5f91SYangyu 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
224*768f5f91SYangyu 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),
249*768f5f91SYangyu Chen  )
250*768f5f91SYangyu Chen}
251ee8ff153Szfw
252*768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
253*768f5f91SYangyu Chen  /*
254*768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
255*768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
256*768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
257*768f5f91SYangyu Chen   */
258*768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
259*768f5f91SYangyu Chen    // Zba
260*768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
261*768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
262*768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
263*768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
264*768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
265*768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
266*768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
267*768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
268*768f5f91SYangyu Chen
269*768f5f91SYangyu 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
274*768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
275*768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
276*768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
277*768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
278*768f5f91SYangyu Chen
279*768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
280*768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
281*768f5f91SYangyu 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),
284*768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
285*768f5f91SYangyu 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),
289*768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
290*768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
291ee8ff153Szfw
292*768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
293*768f5f91SYangyu 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),
296*768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
297*768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
298ee8ff153Szfw
299*768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
300*768f5f91SYangyu Chen
301*768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
302*768f5f91SYangyu Chen
303*768f5f91SYangyu Chen    // Zbc
304*768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
305*768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
306*768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
307*768f5f91SYangyu Chen
308*768f5f91SYangyu Chen    // Zbs
309*768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
310*768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
311*768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
312*768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
313*768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
314*768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
315*768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
316*768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
317*768f5f91SYangyu Chen
318*768f5f91SYangyu Chen    // Zbkb
319*768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
320*768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
321*768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
322*768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
323*768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
324*768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
325*768f5f91SYangyu Chen
326*768f5f91SYangyu Chen    // Zbkc
327*768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
328*768f5f91SYangyu Chen
329*768f5f91SYangyu Chen    // Zbkx
330*768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
331*768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
332*768f5f91SYangyu Chen  )
333*768f5f91SYangyu Chen}
334*768f5f91SYangyu Chen
335*768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
336*768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
337*768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
338*768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
339*768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
340*768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
341*768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
342*768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
343*768f5f91SYangyu Chen
344*768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
345*768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
346*768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
347*768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
348*768f5f91SYangyu Chen
349*768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
350*768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
351*768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
352*768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
353*768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
354*768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
355*768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
356*768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
357*768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
358*768f5f91SYangyu Chen
359*768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
360*768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
361*768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
362*768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
363*768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
364*768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
365*768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
366*768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
367*768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
368*768f5f91SYangyu Chen
369*768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
370*768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
371*768f5f91SYangyu 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
38523ea5b5eSZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
38623ea5b5eSZiyue 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
484ca18a0b4SWilliam Wang/**
4854d24c305SYikeZhou * XiangShan Trap Decode constants
4864d24c305SYikeZhou */
4874d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
488361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
48957a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
49057a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
4914d24c305SYikeZhou  )
4924d24c305SYikeZhou}
493be25371aSYikeZhou
49449f433deSXuan Huabstract class Imm(val len: Int) {
495b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
496b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
497b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
498b0ae3ac4SLinJiawei}
499b0ae3ac4SLinJiawei
500b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
501fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
502b0ae3ac4SLinJiawei
503b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
504b0ae3ac4SLinJiawei    Cat(instr(31, 20))
505b0ae3ac4SLinJiawei}
506b0ae3ac4SLinJiawei
507b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
508b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
509b0ae3ac4SLinJiawei
510b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
511b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
512b0ae3ac4SLinJiawei}
513b0ae3ac4SLinJiawei
514b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
515b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
516b0ae3ac4SLinJiawei
517b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
518b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
519b0ae3ac4SLinJiawei}
520b0ae3ac4SLinJiawei
521b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
522fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
523b0ae3ac4SLinJiawei
524b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
525b0ae3ac4SLinJiawei    instr(31, 12)
526c2a8ae00SYikeZhou  }
527c2a8ae00SYikeZhou}
528c2a8ae00SYikeZhou
529b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
530b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
531b0ae3ac4SLinJiawei
532b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
533b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
534b0ae3ac4SLinJiawei  }
535b0ae3ac4SLinJiawei}
536b0ae3ac4SLinJiawei
537b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){
538b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
539b0ae3ac4SLinJiawei
540b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
541b0ae3ac4SLinJiawei    Cat(instr(19, 15), instr(31, 20))
542b0ae3ac4SLinJiawei  }
543b0ae3ac4SLinJiawei}
544b0ae3ac4SLinJiawei
545ee8ff153Szfwcase class Imm_B6() extends Imm(6){
546ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
547ee8ff153Szfw
548ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
549ee8ff153Szfw    instr(25, 20)
550ee8ff153Szfw  }
551ee8ff153Szfw}
552ee8ff153Szfw
55358c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
55458c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
55558c35d23Shuxuan0307
55658c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
55758c35d23Shuxuan0307    instr(19, 15)
55858c35d23Shuxuan0307  }
55958c35d23Shuxuan0307}
560b52d4755SXuan Hu
56158c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
56258c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
56358c35d23Shuxuan0307
56458c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
56558c35d23Shuxuan0307    instr(19, 15)
56658c35d23Shuxuan0307  }
56758c35d23Shuxuan0307}
568b52d4755SXuan Hu
5694aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
5704aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
5714aa9ed34Sfdy
5724aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
5734aa9ed34Sfdy    instr(30, 20)
5744aa9ed34Sfdy  }
5754aa9ed34Sfdy}
576b52d4755SXuan Hu
577b52d4755SXuan Hucase class Imm_VSETIVLI() extends Imm(13){
5784aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
5794aa9ed34Sfdy
5804aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
5815c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
582b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
583b52d4755SXuan Hu    val vtype8 = rvInst.ZIMM_VTYPE
584b52d4755SXuan Hu    Cat(uimm5, vtype8)
585b52d4755SXuan Hu  }
586b52d4755SXuan Hu  /**
587b52d4755SXuan Hu    * get VType from extended imm
588b52d4755SXuan Hu    * @param extedImm
589b52d4755SXuan Hu    * @return VType
590b52d4755SXuan Hu    */
591b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
592b52d4755SXuan Hu    val vtype = Wire(new InstVType)
593b52d4755SXuan Hu    vtype := extedImm(7, 0).asTypeOf(new InstVType)
594b52d4755SXuan Hu    vtype
595b52d4755SXuan Hu  }
596b52d4755SXuan Hu
597b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
598b52d4755SXuan Hu    extedImm(12, 8)
5994aa9ed34Sfdy  }
6004aa9ed34Sfdy}
601fe528fd6Ssinsanction
602fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
603fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
604fe528fd6Ssinsanction
605fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
606fe528fd6Ssinsanction    instr(31, 0)
607fe528fd6Ssinsanction  }
608fe528fd6Ssinsanction}
609fe528fd6Ssinsanction
6107e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
6117e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
6127e30d16cSZhaoyang You
6137e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
6147e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
6157e30d16cSZhaoyang You  }
6167e30d16cSZhaoyang You}
6177e30d16cSZhaoyang You
618b0ae3ac4SLinJiaweiobject ImmUnion {
619b0ae3ac4SLinJiawei  val I = Imm_I()
620b0ae3ac4SLinJiawei  val S = Imm_S()
621b0ae3ac4SLinJiawei  val B = Imm_B()
622b0ae3ac4SLinJiawei  val U = Imm_U()
623b0ae3ac4SLinJiawei  val J = Imm_J()
624b0ae3ac4SLinJiawei  val Z = Imm_Z()
625ee8ff153Szfw  val B6 = Imm_B6()
62658c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
62758c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
6284aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
6294aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
630fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
6317e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
6324aa9ed34Sfdy
633520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
6347e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
635b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
636b0ae3ac4SLinJiawei  val immSelMap = Seq(
637b0ae3ac4SLinJiawei    SelImm.IMM_I,
638b0ae3ac4SLinJiawei    SelImm.IMM_S,
639b0ae3ac4SLinJiawei    SelImm.IMM_SB,
640b0ae3ac4SLinJiawei    SelImm.IMM_U,
641b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
642ee8ff153Szfw    SelImm.IMM_Z,
64358c35d23Shuxuan0307    SelImm.IMM_B6,
64458c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
6454aa9ed34Sfdy    SelImm.IMM_OPIVIU,
6464aa9ed34Sfdy    SelImm.IMM_VSETVLI,
647fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
6487e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
649b0ae3ac4SLinJiawei  ).zip(imms)
650b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
651b0ae3ac4SLinJiawei}
652b0ae3ac4SLinJiawei
653fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
654fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
655fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
656765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
657fd7603d9SYinan Xu  }
6583b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
659fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
6603b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
661f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
662fd7603d9SYinan Xu  }
663fd7603d9SYinan Xu}
664b0ae3ac4SLinJiawei
665be25371aSYikeZhou/**
666be25371aSYikeZhou * IO bundle for the Decode unit
667be25371aSYikeZhou */
668aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
669aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
670aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
671aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
672aaa08c5aSxiaofeibao-xjtu}
6732225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
6743b739f49SXuan Hu  val enq = new Bundle {
6753b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
676d91483a6Sfdy    val vtype = Input(new VType)
6774aa9ed34Sfdy  }
6783b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
679aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
680af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
681be25371aSYikeZhou}
682be25371aSYikeZhou
683be25371aSYikeZhou/**
684be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
685be25371aSYikeZhou */
6862225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
687be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
688be25371aSYikeZhou
6893b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
690be25371aSYikeZhou
69175e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
69275e2c883SXuan Hu
69357a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
69457a10886SXuan Hu    FpDecode.table ++
695bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
696*768f5f91SYangyu Chen    BitmanipDecode.table ++
697*768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
698a19215ddSYinan Xu    XSTrapDecode.table ++
699a19215ddSYinan Xu    CBODecode.table ++
700b65b9ebaSXuan Hu    SvinvalDecode.table ++
701e25e4d90SXuan Hu    HypervisorDecode.table ++
702b65b9ebaSXuan Hu    VecDecoder.table
703b65b9ebaSXuan Hu
70489cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
705a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
706239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
707a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
708a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
709be25371aSYikeZhou
7104d24c305SYikeZhou  // output
7113b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
712be25371aSYikeZhou
7132ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
7147ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
7153b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
7161a1319cbSLinJiawei
7173b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
7183b739f49SXuan Hu
719a8db15d8Sfdy  decodedInst.uopIdx := 0.U
720d91483a6Sfdy  decodedInst.firstUop := true.B
721d91483a6Sfdy  decodedInst.lastUop := true.B
722f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
7233235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
724deb6421eSHaojin Tang
72573c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
726f7af4c74Schengguanghui  decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
72773c4359eSYikeZhou
72849a2cda2SXuan Hu  // fmadd - b1000011
72949a2cda2SXuan Hu  // fmsub - b1000111
73049a2cda2SXuan Hu  // fnmsub- b1001011
73149a2cda2SXuan Hu  // fnmadd- b1001111
73249a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
73349a2cda2SXuan Hu
734996aacc9SXuan Hu  private val v0Idx = 0
735996aacc9SXuan Hu  private val vconfigIdx = VCONFIG_IDX
736996aacc9SXuan Hu
737178dd38cSYikeZhou  // read src1~3 location
73898cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
73998cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
74049a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
74149a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
742996aacc9SXuan Hu  decodedInst.lsrc(3) := v0Idx.U
743996aacc9SXuan Hu  decodedInst.lsrc(4) := vconfigIdx.U
744b6b11f60SXuan Hu
745178dd38cSYikeZhou  // read dest location
74698cfe81bSxgkiri  decodedInst.ldest := inst.RD
7474d24c305SYikeZhou
748c2a8ae00SYikeZhou  // fill in exception vector
749567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
750567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
751567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
752bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
753567f0269Ssinsanction  decodedInst.exceptionVec(illegalInstr) := decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst
7544d24c305SYikeZhou
755af2f7849Shappy-lx  when (!io.csrCtrl.svinval_enable) {
756567f0269Ssinsanction    val base_ii = decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst
757af2f7849Shappy-lx    val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr
758af2f7849Shappy-lx    val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr
759af2f7849Shappy-lx    val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr
760d0de7e4aSpeixiaokun    val hinval_gvma = HINVAL_GVMA === ctrl_flow.instr
761d0de7e4aSpeixiaokun    val hinval_vvma = HINVAL_VVMA === ctrl_flow.instr
762d0de7e4aSpeixiaokun    val svinval_ii = sinval || w_inval || inval_ir || hinval_gvma || hinval_vvma
7633b739f49SXuan Hu    decodedInst.exceptionVec(illegalInstr) := base_ii || svinval_ii
7643b739f49SXuan Hu    decodedInst.flushPipe := false.B
765af2f7849Shappy-lx  }
766af2f7849Shappy-lx
767d0de7e4aSpeixiaokun  when(io.csrCtrl.virtMode){
768e25e4d90SXuan Hu    // Todo: optimize EX_VI decode
769d0de7e4aSpeixiaokun    // vs/vu attempting to exec hyperinst will raise virtual instruction
770e25e4d90SXuan Hu    decodedInst.exceptionVec(virtualInstr) := ctrl_flow.instr === HLV_B || ctrl_flow.instr === HLV_BU ||
771d0de7e4aSpeixiaokun      ctrl_flow.instr === HLV_H   || ctrl_flow.instr === HLV_HU ||
772d0de7e4aSpeixiaokun      ctrl_flow.instr === HLVX_HU || ctrl_flow.instr === HLV_W  ||
773d0de7e4aSpeixiaokun      ctrl_flow.instr === HLVX_WU || ctrl_flow.instr === HLV_WU ||
774d0de7e4aSpeixiaokun      ctrl_flow.instr === HLV_D   || ctrl_flow.instr === HSV_B  ||
775d0de7e4aSpeixiaokun      ctrl_flow.instr === HSV_H   || ctrl_flow.instr === HSV_W  ||
776d0de7e4aSpeixiaokun      ctrl_flow.instr === HSV_D   || ctrl_flow.instr === HFENCE_VVMA ||
777d0de7e4aSpeixiaokun      ctrl_flow.instr === HFENCE_GVMA || ctrl_flow.instr === HINVAL_GVMA ||
778d0de7e4aSpeixiaokun      ctrl_flow.instr === HINVAL_VVMA
779d0de7e4aSpeixiaokun  }
780d0de7e4aSpeixiaokun
781c2a8ae00SYikeZhou  // fix frflags
782c2a8ae00SYikeZhou  //                           fflags    zero csrrs rd    csr
783c2a8ae00SYikeZhou  val isFrflags = BitPat("b000000000001_00000_010_?????_1110011") === ctrl_flow.instr
7843b739f49SXuan Hu  when (decodedInst.fuType === FuType.csr.U && isFrflags) {
7853b739f49SXuan Hu    decodedInst.blockBackward := false.B
786c2a8ae00SYikeZhou  }
787c2a8ae00SYikeZhou
7883b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
789b0ae3ac4SLinJiawei    x => {
7907ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
791b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
792b0ae3ac4SLinJiawei      x._1 -> minBits
793b0ae3ac4SLinJiawei    }
794b0ae3ac4SLinJiawei  ))
795aac4464eSYinan Xu
7967531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
7977531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
7987531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
7997531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
8007531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
8017531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
8027531c765SXuan Hu
8037531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
80475e2c883SXuan Hu
80575e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
806be25371aSYikeZhou
8070bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
80839c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
80939c388b5SXuan Hu  private val narrowInsts = Seq(
81039c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
81139c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
81239c388b5SXuan Hu  )
81339c388b5SXuan Hu  private val maskDstInsts = Seq(
81439c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
81539c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
81639c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
8179eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
8189eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
8199eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
8209eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
821f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
82239c388b5SXuan Hu  )
82330fcc710SZiyue Zhang  private val maskOpInsts = Seq(
82430fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
82530fcc710SZiyue Zhang  )
826bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
827bdda74fdSxiaofeibao-xjtu    // opfff
828bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
829bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
830bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
831bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
832bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
833bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
834bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
835bdda74fdSxiaofeibao-xjtu    // opfvv
836bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
837bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
838bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
839bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
840bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
841bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
842bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
843bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
844bdda74fdSxiaofeibao-xjtu    // opfvf
845bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
846bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
847bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
848bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
849bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
850bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
851bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
852bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
853bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
854bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
855bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
856bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
857ba899681Schengguanghui    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,
858ba899681Schengguanghui    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,
859ba899681Schengguanghui    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,
860ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
861bdda74fdSxiaofeibao-xjtu  )
862bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
863bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
864bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
865bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
8663b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
867bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
868bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
869bdda74fdSxiaofeibao-xjtu  }.otherwise{
87075e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
87175e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
87275e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
87375e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
87475e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
87575e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
87675e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
877d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
87894e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
87939c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
88039c388b5SXuan Hu    decodedInst.vpu.isNarrow := narrowInsts.map(_ === inst.ALL).reduce(_ || _)
88139c388b5SXuan Hu    decodedInst.vpu.isDstMask := maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
88230fcc710SZiyue Zhang    decodedInst.vpu.isOpMask := maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
883bdda74fdSxiaofeibao-xjtu  }
88475e2c883SXuan Hu
88531c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
88631c51290Szhanglinjuan
8876d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
8886d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
8896d56ac16Ssinsanction
8907f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
89187dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
89287dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
89306cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
89487dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
8950a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
896c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
89706cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
898c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
8997f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
9007f9f0a79SzhanglyGit  io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop
9013235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
9027f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
9037f9f0a79SzhanglyGit
90475e2c883SXuan Hu  io.deq.decodedInst := decodedInst
9059faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
906be25371aSYikeZhou  //-------------------------------------------------------------
907be25371aSYikeZhou  // Debug Info
9083b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
9093b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
9103b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
9113b739f49SXuan 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",
9123b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
9133b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
9143b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
9153b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
9163b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
9173b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
9183b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
9193b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
920be25371aSYikeZhou}
921