xref: /XiangShan/src/main/scala/xiangshan/backend/decode/DecodeUnit.scala (revision b50a88ec4b3215ee22819c5f5cb3ba82f401d37f)
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}
301be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions
315c1681d0SXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, XSInstBitFields}
325110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl}
3315ed99a7SXuan Huimport xiangshan.backend.fu.wrapper.CSRToDecode
34be25371aSYikeZhou
35be25371aSYikeZhou/**
36be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/
37be25371aSYikeZhou */
38be25371aSYikeZhouabstract trait DecodeConstants {
39361e6d51SJiuyang Liu  // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt.
4057a10886SXuan Hu  def X = BitPat("b0")
414d24c305SYikeZhou  def N = BitPat("b0")
424d24c305SYikeZhou  def Y = BitPat("b1")
4357a10886SXuan Hu  def T = true
4457a10886SXuan Hu  def F = false
454d24c305SYikeZhou
46c2a8ae00SYikeZhou  def decodeDefault: List[BitPat] = // illegal instruction
4720e31bd1SYinan Xu    //   srcType(0) srcType(1) srcType(2) fuType    fuOpType    rfWen
484d24c305SYikeZhou    //   |          |          |          |         |           |  fpWen
4957a10886SXuan Hu    //   |          |          |          |         |           |  |  vecWen
5057a10886SXuan Hu    //   |          |          |          |         |           |  |  |  isXSTrap
5157a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  noSpecExec
5257a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  blockBackward
5357a10886SXuan Hu    //   |          |          |          |         |           |  |  |  |  |  |  flushPipe
5489cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  canRobCompress
5589cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  uopSplitType
5689cc69c1STang Haojin    //   |          |          |          |         |           |  |  |  |  |  |  |  |  |             selImm
5789cc69c1STang 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
584d24c305SYikeZhou
5957a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)]
6057a10886SXuan Hu  final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate()))
61be25371aSYikeZhou}
62be25371aSYikeZhou
63c2a8ae00SYikeZhoutrait DecodeUnitConstants
644d24c305SYikeZhou{
654d24c305SYikeZhou  // abstract out instruction decode magic numbers
664d24c305SYikeZhou  val RD_MSB  = 11
674d24c305SYikeZhou  val RD_LSB  = 7
684d24c305SYikeZhou  val RS1_MSB = 19
694d24c305SYikeZhou  val RS1_LSB = 15
704d24c305SYikeZhou  val RS2_MSB = 24
714d24c305SYikeZhou  val RS2_LSB = 20
724d24c305SYikeZhou  val RS3_MSB = 31
734d24c305SYikeZhou  val RS3_LSB = 27
744d24c305SYikeZhou}
754d24c305SYikeZhou
76be25371aSYikeZhou/**
77be25371aSYikeZhou * Decoded control signals
784d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala
79be25371aSYikeZhou */
80c2a8ae00SYikeZhou
8157a10886SXuan Huabstract class XSDecodeBase {
8257a10886SXuan Hu  def X = BitPat("b?")
8357a10886SXuan Hu  def N = BitPat("b0")
8457a10886SXuan Hu  def Y = BitPat("b1")
8557a10886SXuan Hu  def T = true
8657a10886SXuan Hu  def F = false
8757a10886SXuan Hu  def generate() : List[BitPat]
8857a10886SXuan Hu}
8957a10886SXuan Hu
9057a10886SXuan Hucase class XSDecode(
9157a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
92239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat,
93e2695e90SzhanglyGit  uopSplitType: BitPat = UopSplitType.X,
9457a10886SXuan Hu  xWen: Boolean = false,
9557a10886SXuan Hu  fWen: Boolean = false,
9657a10886SXuan Hu  vWen: Boolean = false,
9757a10886SXuan Hu  mWen: Boolean = false,
9857a10886SXuan Hu  xsTrap: Boolean = false,
9957a10886SXuan Hu  noSpec: Boolean = false,
10057a10886SXuan Hu  blockBack: Boolean = false,
10157a10886SXuan Hu  flushPipe: Boolean = false,
10289cc69c1STang Haojin  canRobCompress: Boolean = false,
10357a10886SXuan Hu) extends XSDecodeBase {
10457a10886SXuan Hu  def generate() : List[BitPat] = {
10589cc69c1STang 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)
10657a10886SXuan Hu  }
10757a10886SXuan Hu}
10857a10886SXuan Hu
10957a10886SXuan Hucase class FDecode(
11057a10886SXuan Hu  src1: BitPat, src2: BitPat, src3: BitPat,
111239413e5SXuan Hu  fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X,
11217ec87f2SXuan Hu  uopSplitType: BitPat = UopSplitType.X,
11357a10886SXuan Hu  xWen: Boolean = false,
11457a10886SXuan Hu  fWen: Boolean = false,
11557a10886SXuan Hu  vWen: Boolean = false,
11657a10886SXuan Hu  mWen: Boolean = false,
11757a10886SXuan Hu  xsTrap: Boolean = false,
11857a10886SXuan Hu  noSpec: Boolean = false,
11957a10886SXuan Hu  blockBack: Boolean = false,
12057a10886SXuan Hu  flushPipe: Boolean = false,
12189cc69c1STang Haojin  canRobCompress: Boolean = false,
12257a10886SXuan Hu) extends XSDecodeBase {
12357a10886SXuan Hu  def generate() : List[BitPat] = {
12489cc69c1STang Haojin    XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate()
12557a10886SXuan Hu  }
12657a10886SXuan Hu}
12757a10886SXuan Hu
128be25371aSYikeZhou/**
129be25371aSYikeZhou * Overall Decode constants
130be25371aSYikeZhou */
131be25371aSYikeZhouobject XDecode extends DecodeConstants {
1321be7b39aSXuan Hu  import PseudoInstructions.{CSRRC_RO, CSRRS_RO}
1331be7b39aSXuan Hu
13457a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
135768f5f91SYangyu Chen    // RV32I
13657a10886SXuan Hu    LW      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw  , SelImm.IMM_I, xWen = T),
13757a10886SXuan Hu    LH      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh  , SelImm.IMM_I, xWen = T),
13857a10886SXuan Hu    LHU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T),
13957a10886SXuan Hu    LB      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb  , SelImm.IMM_I, xWen = T),
14057a10886SXuan Hu    LBU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T),
14157a10886SXuan Hu    SW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw  , SelImm.IMM_S          ),
14257a10886SXuan Hu    SH      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh  , SelImm.IMM_S          ),
14357a10886SXuan Hu    SB      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb  , SelImm.IMM_S          ),
14489cc69c1STang Haojin    LUI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T),
14589cc69c1STang Haojin    ADDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T),
14689cc69c1STang Haojin    ANDI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T),
14789cc69c1STang Haojin    ORI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.IMM_I, xWen = T, canRobCompress = T),
14889cc69c1STang Haojin    XORI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T),
14989cc69c1STang Haojin    SLTI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T),
15089cc69c1STang Haojin    SLTIU   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T),
15189cc69c1STang Haojin    SLL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X    , xWen = T, canRobCompress = T),
15289cc69c1STang Haojin    ADD     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X    , xWen = T, canRobCompress = T),
15389cc69c1STang Haojin    SUB     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X    , xWen = T, canRobCompress = T),
15489cc69c1STang Haojin    SLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X    , xWen = T, canRobCompress = T),
15589cc69c1STang Haojin    SLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X    , xWen = T, canRobCompress = T),
15689cc69c1STang Haojin    AND     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X    , xWen = T, canRobCompress = T),
15789cc69c1STang Haojin    OR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or  , SelImm.X    , xWen = T, canRobCompress = T),
15889cc69c1STang Haojin    XOR     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X    , xWen = T, canRobCompress = T),
15989cc69c1STang Haojin    SRA     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X    , xWen = T, canRobCompress = T),
16089cc69c1STang Haojin    SRL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X    , xWen = T, canRobCompress = T),
1614d24c305SYikeZhou
162768f5f91SYangyu Chen    // RV64I (extend from RV32I)
163768f5f91SYangyu Chen    LD      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld  , SelImm.IMM_I, xWen = T),
164768f5f91SYangyu Chen    LWU     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T),
165768f5f91SYangyu Chen    SD      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd  , SelImm.IMM_S          ),
166768f5f91SYangyu Chen
167768f5f91SYangyu Chen    SLLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T),
168768f5f91SYangyu Chen    SRLI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T),
169768f5f91SYangyu Chen    SRAI    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T),
170768f5f91SYangyu Chen
171768f5f91SYangyu Chen    ADDIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T),
172768f5f91SYangyu Chen    SLLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T),
173768f5f91SYangyu Chen    SRAIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T),
174768f5f91SYangyu Chen    SRLIW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T),
175768f5f91SYangyu Chen
176768f5f91SYangyu Chen    ADDW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X    , xWen = T, canRobCompress = T),
177768f5f91SYangyu Chen    SUBW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X    , xWen = T, canRobCompress = T),
178768f5f91SYangyu Chen    SLLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X    , xWen = T, canRobCompress = T),
179768f5f91SYangyu Chen    SRAW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X    , xWen = T, canRobCompress = T),
180768f5f91SYangyu Chen    SRLW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X    , xWen = T, canRobCompress = T),
181768f5f91SYangyu Chen
182768f5f91SYangyu Chen    // RV64M
18389cc69c1STang Haojin    MUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul   , SelImm.X, xWen = T, canRobCompress = T),
18489cc69c1STang Haojin    MULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh  , SelImm.X, xWen = T, canRobCompress = T),
18589cc69c1STang Haojin    MULHU   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T),
18689cc69c1STang Haojin    MULHSU  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T),
18789cc69c1STang Haojin    MULW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw  , SelImm.X, xWen = T, canRobCompress = T),
1884d24c305SYikeZhou
18989cc69c1STang Haojin    DIV     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div   , SelImm.X, xWen = T, canRobCompress = T),
19089cc69c1STang Haojin    DIVU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu  , SelImm.X, xWen = T, canRobCompress = T),
19189cc69c1STang Haojin    REM     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem   , SelImm.X, xWen = T, canRobCompress = T),
19289cc69c1STang Haojin    REMU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu  , SelImm.X, xWen = T, canRobCompress = T),
19389cc69c1STang Haojin    DIVW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw  , SelImm.X, xWen = T, canRobCompress = T),
19489cc69c1STang Haojin    DIVUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T),
19589cc69c1STang Haojin    REMW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw  , SelImm.X, xWen = T, canRobCompress = T),
19689cc69c1STang Haojin    REMUW   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T),
1974d24c305SYikeZhou
198f7af4c74Schengguanghui    AUIPC   -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T),
19957a10886SXuan Hu    JAL     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal  , SelImm.IMM_UJ, xWen = T),
2005110577fSZiyue Zhang    JALR    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T),
2013b739f49SXuan Hu    BEQ     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq   , SelImm.IMM_SB          ),
2023b739f49SXuan Hu    BNE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne   , SelImm.IMM_SB          ),
2033b739f49SXuan Hu    BGE     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge   , SelImm.IMM_SB          ),
2043b739f49SXuan Hu    BGEU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu  , SelImm.IMM_SB          ),
2053b739f49SXuan Hu    BLT     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt   , SelImm.IMM_SB          ),
2063b739f49SXuan Hu    BLTU    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu  , SelImm.IMM_SB          ),
2074d24c305SYikeZhou
208768f5f91SYangyu Chen    // System, the immediate12 holds the CSR register.
20940ac5bb1SXuan Hu
21040ac5bb1SXuan Hu    // CSR RO should be ahead of CSRRS and CSRRC, since decoder don't handle the inclusive relation-ship among the patterns.
2115fa145b9SXuan Hu    CSRRS_RO -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2125fa145b9SXuan Hu    CSRRC_RO -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2135fa145b9SXuan Hu
21457a10886SXuan Hu    CSRRW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21557a10886SXuan Hu    CSRRS   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
21657a10886SXuan Hu    CSRRC   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
2174d24c305SYikeZhou
21857a10886SXuan Hu    CSRRWI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
21957a10886SXuan Hu    CSRRSI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
22057a10886SXuan Hu    CSRRCI  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T),
2214d24c305SYikeZhou
22257a10886SXuan Hu    EBREAK  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22357a10886SXuan Hu    ECALL   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22457a10886SXuan Hu    SRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22557a10886SXuan Hu    MRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22657a10886SXuan Hu    DRET    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T),
22757a10886SXuan Hu    WFI     -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X    , xWen = T, noSpec = T, blockBack = T),
2284d24c305SYikeZhou
22957a10886SXuan Hu    SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
23057a10886SXuan Hu    FENCE_I    -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
23157a10886SXuan Hu    FENCE      -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
2324d24c305SYikeZhou
233768f5f91SYangyu Chen    // RV64A
23457a10886SXuan Hu    AMOADD_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23557a10886SXuan Hu    AMOXOR_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23657a10886SXuan Hu    AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
23757a10886SXuan Hu    AMOAND_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23857a10886SXuan Hu    AMOOR_W   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
23957a10886SXuan Hu    AMOMIN_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24057a10886SXuan Hu    AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24157a10886SXuan Hu    AMOMAX_W  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24257a10886SXuan Hu    AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2434d24c305SYikeZhou
24457a10886SXuan Hu    AMOADD_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24557a10886SXuan Hu    AMOXOR_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24657a10886SXuan Hu    AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
24757a10886SXuan Hu    AMOAND_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24857a10886SXuan Hu    AMOOR_D   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d  , SelImm.X, xWen = T, noSpec = T, blockBack = T),
24957a10886SXuan Hu    AMOMIN_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25057a10886SXuan Hu    AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25157a10886SXuan Hu    AMOMAX_D  -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T),
25257a10886SXuan Hu    AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
2534d24c305SYikeZhou
25457a10886SXuan Hu    LR_W    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25557a10886SXuan Hu    LR_D    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25657a10886SXuan Hu    SC_W    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T),
25757a10886SXuan Hu    SC_D    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T),
258768f5f91SYangyu Chen  )
259768f5f91SYangyu Chen}
260ee8ff153Szfw
261768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{
262768f5f91SYangyu Chen  /*
263768f5f91SYangyu Chen    Note: Some Bitmanip instruction may have different OP code between rv32 and rv64.
264768f5f91SYangyu Chen    Including pseudo instruction like zext.h, and different funct12 like rev8.
265768f5f91SYangyu Chen    If some day we need to support change XLEN via CSR, we should care about this.
266768f5f91SYangyu Chen   */
267768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
268768f5f91SYangyu Chen    // Zba
269768f5f91SYangyu Chen    ADD_UW    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw   , SelImm.X    , xWen = T, canRobCompress = T),
270768f5f91SYangyu Chen    SH1ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add  , SelImm.X    , xWen = T, canRobCompress = T),
271768f5f91SYangyu Chen    SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X    , xWen = T, canRobCompress = T),
272768f5f91SYangyu Chen    SH2ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add  , SelImm.X    , xWen = T, canRobCompress = T),
273768f5f91SYangyu Chen    SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X    , xWen = T, canRobCompress = T),
274768f5f91SYangyu Chen    SH3ADD    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add  , SelImm.X    , xWen = T, canRobCompress = T),
275768f5f91SYangyu Chen    SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X    , xWen = T, canRobCompress = T),
276768f5f91SYangyu Chen    SLLI_UW   -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw  , SelImm.IMM_I, xWen = T, canRobCompress = T),
277768f5f91SYangyu Chen
278768f5f91SYangyu Chen    // Zbb
27989cc69c1STang Haojin    ANDN      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn    , SelImm.X    , xWen = T, canRobCompress = T),
28089cc69c1STang Haojin    ORN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn     , SelImm.X    , xWen = T, canRobCompress = T),
28189cc69c1STang Haojin    XNOR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor    , SelImm.X    , xWen = T, canRobCompress = T),
282ee8ff153Szfw
283768f5f91SYangyu Chen    CLZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz     , SelImm.X    , xWen = T, canRobCompress = T),
284768f5f91SYangyu Chen    CLZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw    , SelImm.X    , xWen = T, canRobCompress = T),
285768f5f91SYangyu Chen    CTZ       -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz     , SelImm.X    , xWen = T, canRobCompress = T),
286768f5f91SYangyu Chen    CTZW      -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw    , SelImm.X    , xWen = T, canRobCompress = T),
287768f5f91SYangyu Chen
288768f5f91SYangyu Chen    CPOP      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpop    , SelImm.X    , xWen = T, canRobCompress = T),
289768f5f91SYangyu Chen    CPOPW     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.cpopw   , SelImm.X    , xWen = T, canRobCompress = T),
290768f5f91SYangyu Chen
29189cc69c1STang Haojin    MAX       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max     , SelImm.X    , xWen = T, canRobCompress = T),
29289cc69c1STang Haojin    MAXU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu    , SelImm.X    , xWen = T, canRobCompress = T),
293768f5f91SYangyu Chen    MIN       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min     , SelImm.X    , xWen = T, canRobCompress = T),
294768f5f91SYangyu Chen    MINU      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu    , SelImm.X    , xWen = T, canRobCompress = T),
295ee8ff153Szfw
29689cc69c1STang Haojin    SEXT_B    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sextb   , SelImm.X    , xWen = T, canRobCompress = T),
29789cc69c1STang Haojin    SEXT_H    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.sexth   , SelImm.X    , xWen = T, canRobCompress = T),
298768f5f91SYangyu Chen    // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0.
299768f5f91SYangyu Chen    // If we configured to have no Zbkb, we should add zext.h here.
300ee8ff153Szfw
301768f5f91SYangyu Chen    ROL       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol     , SelImm.X    , xWen = T, canRobCompress = T),
302768f5f91SYangyu Chen    ROLW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw    , SelImm.X    , xWen = T, canRobCompress = T),
30389cc69c1STang Haojin    ROR       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.X    , xWen = T, canRobCompress = T),
30489cc69c1STang Haojin    RORI      -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror     , SelImm.IMM_I, xWen = T, canRobCompress = T),
305768f5f91SYangyu Chen    RORIW     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.IMM_I, xWen = T, canRobCompress = T),
306768f5f91SYangyu Chen    RORW      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw    , SelImm.X    , xWen = T, canRobCompress = T),
307ee8ff153Szfw
308768f5f91SYangyu Chen    ORC_B     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.orcb    , SelImm.X    , xWen = T, canRobCompress = T),
309768f5f91SYangyu Chen
310768f5f91SYangyu Chen    REV8      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.rev8    , SelImm.X    , xWen = T, canRobCompress = T),
311768f5f91SYangyu Chen
312768f5f91SYangyu Chen    // Zbc
313768f5f91SYangyu Chen    CLMUL     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul   , SelImm.X    , xWen = T, canRobCompress = T),
314768f5f91SYangyu Chen    CLMULH    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh  , SelImm.X    , xWen = T, canRobCompress = T),
315768f5f91SYangyu Chen    CLMULR    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr  , SelImm.X    , xWen = T, canRobCompress = T),
316768f5f91SYangyu Chen
317768f5f91SYangyu Chen    // Zbs
318768f5f91SYangyu Chen    BCLR      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.X    , xWen = T, canRobCompress = T),
319768f5f91SYangyu Chen    BCLRI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr    , SelImm.IMM_I, xWen = T, canRobCompress = T),
320768f5f91SYangyu Chen    BEXT      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.X    , xWen = T, canRobCompress = T),
321768f5f91SYangyu Chen    BEXTI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext    , SelImm.IMM_I, xWen = T, canRobCompress = T),
322768f5f91SYangyu Chen    BINV      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.X    , xWen = T, canRobCompress = T),
323768f5f91SYangyu Chen    BINVI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv    , SelImm.IMM_I, xWen = T, canRobCompress = T),
324768f5f91SYangyu Chen    BSET      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.X    , xWen = T, canRobCompress = T),
325768f5f91SYangyu Chen    BSETI     -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset    , SelImm.IMM_I, xWen = T, canRobCompress = T),
326768f5f91SYangyu Chen
327768f5f91SYangyu Chen    // Zbkb
328768f5f91SYangyu Chen    // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb
329768f5f91SYangyu Chen    PACK      -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack    , SelImm.X    , xWen = T, canRobCompress = T),
330768f5f91SYangyu Chen    PACKH     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh   , SelImm.X    , xWen = T, canRobCompress = T),
331768f5f91SYangyu Chen    PACKW     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw   , SelImm.X    , xWen = T, canRobCompress = T),
332768f5f91SYangyu Chen    BREV8     -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.alu, ALUOpType.revb    , SelImm.X    , xWen = T, canRobCompress = T),
333768f5f91SYangyu Chen    // If configured to RV32, we should add zip and unzip.
334768f5f91SYangyu Chen
335768f5f91SYangyu Chen    // Zbkc
336768f5f91SYangyu Chen    // clmul, clmulh is in Zbc
337768f5f91SYangyu Chen
338768f5f91SYangyu Chen    // Zbkx
339768f5f91SYangyu Chen    XPERM4    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn  , SelImm.X    , xWen = T, canRobCompress = T),
340768f5f91SYangyu Chen    XPERM8    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb  , SelImm.X    , xWen = T, canRobCompress = T),
341768f5f91SYangyu Chen  )
342768f5f91SYangyu Chen}
343768f5f91SYangyu Chen
344768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants {
345768f5f91SYangyu Chen  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
346768f5f91SYangyu Chen    // Zknd: NIST Suite: AES Decryption
347768f5f91SYangyu Chen    AES64DS    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds   , SelImm.X    , xWen = T, canRobCompress = T),
348768f5f91SYangyu Chen    AES64DSM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm  , SelImm.X    , xWen = T, canRobCompress = T),
349768f5f91SYangyu Chen    AES64IM    -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.aes64im   , SelImm.X    , xWen = T, canRobCompress = T),
350768f5f91SYangyu Chen    AES64KS1I  -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T),
351768f5f91SYangyu Chen    AES64KS2   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2  , SelImm.X    , xWen = T, canRobCompress = T),
352768f5f91SYangyu Chen
353768f5f91SYangyu Chen    // Zkne: NIST Suite: AES Encryption
354768f5f91SYangyu Chen    // aes64ks1i, aes64ks2 is in Zknd
355768f5f91SYangyu Chen    AES64ES    -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es   , SelImm.X    , xWen = T, canRobCompress = T),
356768f5f91SYangyu Chen    AES64ESM   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm  , SelImm.X    , xWen = T, canRobCompress = T),
357768f5f91SYangyu Chen
358768f5f91SYangyu Chen    // Zknh: NIST Suite: Hash Function Instructions
359768f5f91SYangyu Chen    SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X    , xWen = T, canRobCompress = T),
360768f5f91SYangyu Chen    SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X    , xWen = T, canRobCompress = T),
361768f5f91SYangyu Chen    SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X    , xWen = T, canRobCompress = T),
362768f5f91SYangyu Chen    SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X    , xWen = T, canRobCompress = T),
363768f5f91SYangyu Chen    SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X    , xWen = T, canRobCompress = T),
364768f5f91SYangyu Chen    SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X    , xWen = T, canRobCompress = T),
365768f5f91SYangyu Chen    SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X    , xWen = T, canRobCompress = T),
366768f5f91SYangyu Chen    SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X    , xWen = T, canRobCompress = T),
367768f5f91SYangyu Chen
368768f5f91SYangyu Chen    // Zksed: ShangMi Suite: SM4 Block Cipher Instructions
369768f5f91SYangyu Chen    SM4ED0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0    , SelImm.X    , xWen = T, canRobCompress = T),
370768f5f91SYangyu Chen    SM4ED1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1    , SelImm.X    , xWen = T, canRobCompress = T),
371768f5f91SYangyu Chen    SM4ED2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2    , SelImm.X    , xWen = T, canRobCompress = T),
372768f5f91SYangyu Chen    SM4ED3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3    , SelImm.X    , xWen = T, canRobCompress = T),
373768f5f91SYangyu Chen    SM4KS0     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0    , SelImm.X    , xWen = T, canRobCompress = T),
374768f5f91SYangyu Chen    SM4KS1     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1    , SelImm.X    , xWen = T, canRobCompress = T),
375768f5f91SYangyu Chen    SM4KS2     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2    , SelImm.X    , xWen = T, canRobCompress = T),
376768f5f91SYangyu Chen    SM4KS3     -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3    , SelImm.X    , xWen = T, canRobCompress = T),
377768f5f91SYangyu Chen
378768f5f91SYangyu Chen    // Zksh: ShangMi Suite: SM3 Hash Function Instructions
379768f5f91SYangyu Chen    SM3P0      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p0     , SelImm.X    , xWen = T, canRobCompress = T),
380768f5f91SYangyu Chen    SM3P1      -> XSDecode(SrcType.reg, SrcType.DC,  SrcType.X, FuType.bku, BKUOpType.sm3p1     , SelImm.X    , xWen = T, canRobCompress = T),
3814d24c305SYikeZhou  )
382be25371aSYikeZhou}
383be25371aSYikeZhou
384be25371aSYikeZhou/**
385be25371aSYikeZhou * FP Decode constants
386be25371aSYikeZhou */
38757a10886SXuan Huobject FpDecode extends DecodeConstants{
38857a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
38957a10886SXuan Hu    FLW     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T),
39057a10886SXuan Hu    FLD     -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T),
39157a10886SXuan Hu    FSW     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S          ),
39257a10886SXuan Hu    FSD     -> FDecode(SrcType.reg, SrcType.fp,  SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S          ),
3934d24c305SYikeZhou
394964d9a87SZiyue Zhang    FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T),
395964d9a87SZiyue Zhang    FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T),
396c2a8ae00SYikeZhou
3974d24c305SYikeZhou    // Int to FP
39889cc69c1STang Haojin    FCVT_S_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
39989cc69c1STang Haojin    FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40089cc69c1STang Haojin    FCVT_S_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40189cc69c1STang Haojin    FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4024d24c305SYikeZhou
40389cc69c1STang Haojin    FCVT_D_W  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40489cc69c1STang Haojin    FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40589cc69c1STang Haojin    FCVT_D_L  -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
40689cc69c1STang Haojin    FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T),
4074d24c305SYikeZhou
4084d24c305SYikeZhou  )
409be25371aSYikeZhou}
410be25371aSYikeZhou
411be25371aSYikeZhou/**
412be25371aSYikeZhou * FP Divide SquareRoot Constants
413be25371aSYikeZhou */
414be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants {
41557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
41689cc69c1STang Haojin    FDIV_S  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41789cc69c1STang Haojin    FDIV_D  -> FDecode(SrcType.fp,  SrcType.fp,  SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41889cc69c1STang Haojin    FSQRT_S -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
41989cc69c1STang Haojin    FSQRT_D -> FDecode(SrcType.fp,  SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T),
4204d24c305SYikeZhou  )
421be25371aSYikeZhou}
422be25371aSYikeZhou
4234d24c305SYikeZhou/**
424af2f7849Shappy-lx * Svinval extension Constants
425af2f7849Shappy-lx */
426af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants {
42757a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
428af2f7849Shappy-lx    /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma
429af2f7849Shappy-lx     * must assure it is the ONLY instrucion executing in backend.
430af2f7849Shappy-lx     */
43157a10886SXuan Hu    SINVAL_VMA        -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X),
432af2f7849Shappy-lx    /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals
433af2f7849Shappy-lx     * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit
434af2f7849Shappy-lx     * then dispatch and issue this instrucion to flush sbuffer to dcache
435af2f7849Shappy-lx     * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB
436af2f7849Shappy-lx     */
43757a10886SXuan Hu    SFENCE_W_INVAL    -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T),
438af2f7849Shappy-lx    /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals
439af2f7849Shappy-lx     * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit
440af2f7849Shappy-lx     * then dispatch and issue this instrucion
441af2f7849Shappy-lx     * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map
442af2f7849Shappy-lx     */
44357a10886SXuan Hu    SFENCE_INVAL_IR   -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T)
444af2f7849Shappy-lx    /* what is Svinval extension ?
445af2f7849Shappy-lx     *                       ----->             sfecne.w.inval
446af2f7849Shappy-lx     * sfence.vma   vpn1     ----->             sinval_vma   vpn1
447af2f7849Shappy-lx     * sfence.vma   vpn2     ----->             sinval_vma   vpn2
448af2f7849Shappy-lx     *                       ----->             sfecne.inval.ir
449af2f7849Shappy-lx     *
450af2f7849Shappy-lx     * sfence.vma should be executed in-order and it flushes the pipeline after committing
451af2f7849Shappy-lx     * we can parallel sfence instrucions with this extension
452af2f7849Shappy-lx     */
453af2f7849Shappy-lx  )
454af2f7849Shappy-lx}
45557a10886SXuan Hu
456af2f7849Shappy-lx/*
457ca18a0b4SWilliam Wang * CBO decode
458ca18a0b4SWilliam Wang */
459ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants {
46057a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
46157a10886SXuan Hu    CBO_ZERO  -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S),
46257a10886SXuan Hu    CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S),
46357a10886SXuan Hu    CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S),
46457a10886SXuan Hu    CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S)
465ca18a0b4SWilliam Wang  )
466ca18a0b4SWilliam Wang}
467ca18a0b4SWilliam Wang
468d0de7e4aSpeixiaokun/*
469d0de7e4aSpeixiaokun * Hypervisor decode
470d0de7e4aSpeixiaokun */
471d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants {
472e25e4d90SXuan Hu  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
473e25e4d90SXuan Hu    HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
474e25e4d90SXuan Hu    HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T),
475e25e4d90SXuan Hu    HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X),
476e25e4d90SXuan Hu    HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X),
477e25e4d90SXuan Hu    HLV_B       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvb,       SelImm.X, xWen = T),
478e25e4d90SXuan Hu    HLV_BU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvbu,      SelImm.X, xWen = T),
479e25e4d90SXuan Hu    HLV_D       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvd,       SelImm.X, xWen = T),
480e25e4d90SXuan Hu    HLV_H       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvh,       SelImm.X, xWen = T),
481e25e4d90SXuan Hu    HLV_HU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvhu,      SelImm.X, xWen = T),
482e25e4d90SXuan Hu    HLV_W       -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvw,       SelImm.X, xWen = T),
483e25e4d90SXuan Hu    HLV_WU      -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvwu,      SelImm.X, xWen = T),
484e25e4d90SXuan Hu    HLVX_HU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxhu,     SelImm.X, xWen = T),
485e25e4d90SXuan Hu    HLVX_WU     -> XSDecode(SrcType.reg, SrcType.X,   SrcType.X, FuType.ldu,   LSUOpType.hlvxwu,     SelImm.X, xWen = T),
486e25e4d90SXuan Hu    HSV_B       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvb,       SelImm.X),
487e25e4d90SXuan Hu    HSV_D       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvd,       SelImm.X),
488e25e4d90SXuan Hu    HSV_H       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvh,       SelImm.X),
489e25e4d90SXuan Hu    HSV_W       -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu,   LSUOpType.hsvw,       SelImm.X),
490d0de7e4aSpeixiaokun  )
491d0de7e4aSpeixiaokun}
492d0de7e4aSpeixiaokun
493545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants {
494545d7be0SYangyu Chen  override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
495545d7be0SYangyu Chen    CZERO_EQZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T),
496545d7be0SYangyu Chen    CZERO_NEZ   -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T),
497545d7be0SYangyu Chen  )
498545d7be0SYangyu Chen}
499545d7be0SYangyu Chen
500ca18a0b4SWilliam Wang/**
5014d24c305SYikeZhou * XiangShan Trap Decode constants
5024d24c305SYikeZhou */
5034d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants {
504361e6d51SJiuyang Liu  def TRAP = BitPat("b000000000000?????000000001101011")
50557a10886SXuan Hu  val decodeArray: Array[(BitPat, XSDecodeBase)] = Array(
50657a10886SXuan Hu    TRAP    -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T)
5074d24c305SYikeZhou  )
5084d24c305SYikeZhou}
509be25371aSYikeZhou
51049f433deSXuan Huabstract class Imm(val len: Int) {
511b0ae3ac4SLinJiawei  def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0))
512b0ae3ac4SLinJiawei  def do_toImm32(minBits: UInt): UInt
513b0ae3ac4SLinJiawei  def minBitsFromInstr(instr: UInt): UInt
514b0ae3ac4SLinJiawei}
515b0ae3ac4SLinJiawei
516b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) {
517fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32)
518b0ae3ac4SLinJiawei
519b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
520b0ae3ac4SLinJiawei    Cat(instr(31, 20))
521b0ae3ac4SLinJiawei}
522b0ae3ac4SLinJiawei
523b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) {
524b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
525b0ae3ac4SLinJiawei
526b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
527b0ae3ac4SLinJiawei    Cat(instr(31, 25), instr(11, 7))
528b0ae3ac4SLinJiawei}
529b0ae3ac4SLinJiawei
530b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) {
531b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
532b0ae3ac4SLinJiawei
533b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt =
534b0ae3ac4SLinJiawei    Cat(instr(31), instr(7), instr(30, 25), instr(11, 8))
535b0ae3ac4SLinJiawei}
536b0ae3ac4SLinJiawei
537b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){
538fd7603d9SYinan Xu  override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W))
539b0ae3ac4SLinJiawei
540b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
541b0ae3ac4SLinJiawei    instr(31, 12)
542c2a8ae00SYikeZhou  }
543c2a8ae00SYikeZhou}
544c2a8ae00SYikeZhou
545b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){
546b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32)
547b0ae3ac4SLinJiawei
548b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
549b0ae3ac4SLinJiawei    Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21))
550b0ae3ac4SLinJiawei  }
551b0ae3ac4SLinJiawei}
552b0ae3ac4SLinJiawei
553b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){
554b0ae3ac4SLinJiawei  override def do_toImm32(minBits: UInt): UInt = minBits
555b0ae3ac4SLinJiawei
556b0ae3ac4SLinJiawei  override def minBitsFromInstr(instr: UInt): UInt = {
557b0ae3ac4SLinJiawei    Cat(instr(19, 15), instr(31, 20))
558b0ae3ac4SLinJiawei  }
559b0ae3ac4SLinJiawei}
560b0ae3ac4SLinJiawei
561ee8ff153Szfwcase class Imm_B6() extends Imm(6){
562ee8ff153Szfw  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
563ee8ff153Szfw
564ee8ff153Szfw  override def minBitsFromInstr(instr: UInt): UInt = {
565ee8ff153Szfw    instr(25, 20)
566ee8ff153Szfw  }
567ee8ff153Szfw}
568ee8ff153Szfw
56958c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){
57058c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
57158c35d23Shuxuan0307
57258c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
57358c35d23Shuxuan0307    instr(19, 15)
57458c35d23Shuxuan0307  }
57558c35d23Shuxuan0307}
576b52d4755SXuan Hu
57758c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){
57858c35d23Shuxuan0307  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
57958c35d23Shuxuan0307
58058c35d23Shuxuan0307  override def minBitsFromInstr(instr: UInt): UInt = {
58158c35d23Shuxuan0307    instr(19, 15)
58258c35d23Shuxuan0307  }
58358c35d23Shuxuan0307}
584b52d4755SXuan Hu
5854aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){
5864aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
5874aa9ed34Sfdy
5884aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
5894aa9ed34Sfdy    instr(30, 20)
5904aa9ed34Sfdy  }
591e6ac7fe1SZiyue Zhang  /**
592e6ac7fe1SZiyue Zhang    * get VType from extended imm
593e6ac7fe1SZiyue Zhang    * @param extedImm
594e6ac7fe1SZiyue Zhang    * @return VType
595e6ac7fe1SZiyue Zhang    */
596e6ac7fe1SZiyue Zhang  def getVType(extedImm: UInt): InstVType = {
597e6ac7fe1SZiyue Zhang    val vtype = Wire(new InstVType)
598e6ac7fe1SZiyue Zhang    vtype := extedImm(10, 0).asTypeOf(new InstVType)
599e6ac7fe1SZiyue Zhang    vtype
600e6ac7fe1SZiyue Zhang  }
6014aa9ed34Sfdy}
602b52d4755SXuan Hu
603e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){
6044aa9ed34Sfdy  override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32)
6054aa9ed34Sfdy
6064aa9ed34Sfdy  override def minBitsFromInstr(instr: UInt): UInt = {
6075c1681d0SXuan Hu    val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields)
608b52d4755SXuan Hu    val uimm5 = rvInst.UIMM_VSETIVLI
609e6ac7fe1SZiyue Zhang    val vtype8 = rvInst.ZIMM_VSETIVLI
610b52d4755SXuan Hu    Cat(uimm5, vtype8)
611b52d4755SXuan Hu  }
612b52d4755SXuan Hu  /**
613b52d4755SXuan Hu    * get VType from extended imm
614b52d4755SXuan Hu    * @param extedImm
615b52d4755SXuan Hu    * @return VType
616b52d4755SXuan Hu    */
617b52d4755SXuan Hu  def getVType(extedImm: UInt): InstVType = {
618b52d4755SXuan Hu    val vtype = Wire(new InstVType)
619e6ac7fe1SZiyue Zhang    vtype := extedImm(9, 0).asTypeOf(new InstVType)
620b52d4755SXuan Hu    vtype
621b52d4755SXuan Hu  }
622b52d4755SXuan Hu
623b52d4755SXuan Hu  def getAvl(extedImm: UInt): UInt = {
624e6ac7fe1SZiyue Zhang    extedImm(14, 10)
6254aa9ed34Sfdy  }
6264aa9ed34Sfdy}
627fe528fd6Ssinsanction
628fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){
629fe528fd6Ssinsanction  override def do_toImm32(minBits: UInt): UInt = minBits(31, 0)
630fe528fd6Ssinsanction
631fe528fd6Ssinsanction  override def minBitsFromInstr(instr: UInt): UInt = {
632fe528fd6Ssinsanction    instr(31, 0)
633fe528fd6Ssinsanction  }
634fe528fd6Ssinsanction}
635fe528fd6Ssinsanction
6367e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){
6377e30d16cSZhaoyang You  override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32)
6387e30d16cSZhaoyang You
6397e30d16cSZhaoyang You  override def minBitsFromInstr(instr: UInt): UInt = {
6407e30d16cSZhaoyang You    Cat(instr(26), instr(19, 15))
6417e30d16cSZhaoyang You  }
6427e30d16cSZhaoyang You}
6437e30d16cSZhaoyang You
644b0ae3ac4SLinJiaweiobject ImmUnion {
645b0ae3ac4SLinJiawei  val I = Imm_I()
646b0ae3ac4SLinJiawei  val S = Imm_S()
647b0ae3ac4SLinJiawei  val B = Imm_B()
648b0ae3ac4SLinJiawei  val U = Imm_U()
649b0ae3ac4SLinJiawei  val J = Imm_J()
650b0ae3ac4SLinJiawei  val Z = Imm_Z()
651ee8ff153Szfw  val B6 = Imm_B6()
65258c35d23Shuxuan0307  val OPIVIS = Imm_OPIVIS()
65358c35d23Shuxuan0307  val OPIVIU = Imm_OPIVIU()
6544aa9ed34Sfdy  val VSETVLI = Imm_VSETVLI()
6554aa9ed34Sfdy  val VSETIVLI = Imm_VSETIVLI()
656fe528fd6Ssinsanction  val LUI32 = Imm_LUI32()
6577e30d16cSZhaoyang You  val VRORVI = Imm_VRORVI()
6584aa9ed34Sfdy
659520f7dacSsinsanction  // do not add special type lui32 to this, keep ImmUnion max len being 20.
6607e30d16cSZhaoyang You  val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI)
661b0ae3ac4SLinJiawei  val maxLen = imms.maxBy(_.len).len
662b0ae3ac4SLinJiawei  val immSelMap = Seq(
663b0ae3ac4SLinJiawei    SelImm.IMM_I,
664b0ae3ac4SLinJiawei    SelImm.IMM_S,
665b0ae3ac4SLinJiawei    SelImm.IMM_SB,
666b0ae3ac4SLinJiawei    SelImm.IMM_U,
667b0ae3ac4SLinJiawei    SelImm.IMM_UJ,
668ee8ff153Szfw    SelImm.IMM_Z,
66958c35d23Shuxuan0307    SelImm.IMM_B6,
67058c35d23Shuxuan0307    SelImm.IMM_OPIVIS,
6714aa9ed34Sfdy    SelImm.IMM_OPIVIU,
6724aa9ed34Sfdy    SelImm.IMM_VSETVLI,
673fe528fd6Ssinsanction    SelImm.IMM_VSETIVLI,
6747e30d16cSZhaoyang You    SelImm.IMM_VRORVI,
675b0ae3ac4SLinJiawei  ).zip(imms)
676b0ae3ac4SLinJiawei  println(s"ImmUnion max len: $maxLen")
677b0ae3ac4SLinJiawei}
678b0ae3ac4SLinJiawei
679fd7603d9SYinan Xucase class Imm_LUI_LOAD() {
680fd7603d9SYinan Xu  def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = {
681fd7603d9SYinan Xu    val loadImm = load_imm(Imm_I().len - 1, 0)
682765e58c6Ssinsanction    Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm)
683fd7603d9SYinan Xu  }
6843b739f49SXuan Hu  def getLuiImm(uop: DynInst): UInt = {
685fd7603d9SYinan Xu    val loadImmLen = Imm_I().len
6863b739f49SXuan Hu    val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen))
687f4dcd9fcSsinsanction    Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0))
688fd7603d9SYinan Xu  }
689fd7603d9SYinan Xu}
690b0ae3ac4SLinJiawei
691be25371aSYikeZhou/**
692be25371aSYikeZhou * IO bundle for the Decode unit
693be25371aSYikeZhou */
694aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle {
695aaa08c5aSxiaofeibao-xjtu  val decodedInst = Output(new DecodedInst)
696aaa08c5aSxiaofeibao-xjtu  val isComplex = Output(Bool())
697aaa08c5aSxiaofeibao-xjtu  val uopInfo = Output(new UopInfo)
698aaa08c5aSxiaofeibao-xjtu}
6992225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle {
7003b739f49SXuan Hu  val enq = new Bundle {
7013b739f49SXuan Hu    val ctrlFlow = Input(new StaticInst)
702d91483a6Sfdy    val vtype = Input(new VType)
7035110577fSZiyue Zhang    val vstart = Input(Vl())
7044aa9ed34Sfdy  }
7053b739f49SXuan Hu//  val vconfig = Input(UInt(XLEN.W))
706aaa08c5aSxiaofeibao-xjtu  val deq = new DecodeUnitDeqIO
707af2f7849Shappy-lx  val csrCtrl = Input(new CustomCSRCtrlIO)
70815ed99a7SXuan Hu  val fromCSR = Input(new CSRToDecode)
709be25371aSYikeZhou}
710be25371aSYikeZhou
711be25371aSYikeZhou/**
712be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl.
713be25371aSYikeZhou */
7142225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants {
715be25371aSYikeZhou  val io = IO(new DecodeUnitIO)
716be25371aSYikeZhou
7173b739f49SXuan Hu  val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded
718be25371aSYikeZhou
71975e2c883SXuan Hu  private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields)
72075e2c883SXuan Hu
72157a10886SXuan Hu  val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++
72257a10886SXuan Hu    FpDecode.table ++
723bdda74fdSxiaofeibao-xjtu//    FDivSqrtDecode.table ++
724768f5f91SYangyu Chen    BitmanipDecode.table ++
725768f5f91SYangyu Chen    ScalarCryptoDecode.table ++
726a19215ddSYinan Xu    XSTrapDecode.table ++
727a19215ddSYinan Xu    CBODecode.table ++
728b65b9ebaSXuan Hu    SvinvalDecode.table ++
729e25e4d90SXuan Hu    HypervisorDecode.table ++
730545d7be0SYangyu Chen    VecDecoder.table ++
731545d7be0SYangyu Chen    ZicondDecode.table
732b65b9ebaSXuan Hu
73389cc69c1STang Haojin  require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size")
734a19215ddSYinan Xu  // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu`
735239413e5SXuan Hu  val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue
736a19215ddSYinan Xu  val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct
737a19215ddSYinan Xu  assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch")
738be25371aSYikeZhou
7394d24c305SYikeZhou  // output
7403b739f49SXuan Hu  val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table)
741be25371aSYikeZhou
7422ce29ed6SLinJiawei  val fpDecoder = Module(new FPDecoder)
7437ceedf30SLinJiawei  fpDecoder.io.instr := ctrl_flow.instr
7443b739f49SXuan Hu  decodedInst.fpu := fpDecoder.io.fpCtrl
7451a1319cbSLinJiawei
7463b739f49SXuan Hu  decodedInst.connectStaticInst(io.enq.ctrlFlow)
7473b739f49SXuan Hu
748a8db15d8Sfdy  decodedInst.uopIdx := 0.U
749d91483a6Sfdy  decodedInst.firstUop := true.B
750d91483a6Sfdy  decodedInst.lastUop := true.B
751f1e8fcb2SXuan Hu  decodedInst.numUops := 1.U
7523235a9d8SZiyue-Zhang  decodedInst.numWB   := 1.U
753deb6421eSHaojin Tang
75473c4359eSYikeZhou  val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr
755f7af4c74Schengguanghui  decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep
75673c4359eSYikeZhou
75749a2cda2SXuan Hu  // fmadd - b1000011
75849a2cda2SXuan Hu  // fmsub - b1000111
75949a2cda2SXuan Hu  // fnmsub- b1001011
76049a2cda2SXuan Hu  // fnmadd- b1001111
76149a2cda2SXuan Hu  private val isFMA = inst.OPCODE === BitPat("b100??11")
762e8b68a8eSgood-circle  private val isVppu = FuType.isVppu(decodedInst.fuType)
763e8b68a8eSgood-circle  private val isVecOPF = FuType.isVecOPF(decodedInst.fuType)
76449a2cda2SXuan Hu
765178dd38cSYikeZhou  // read src1~3 location
76698cfe81bSxgkiri  decodedInst.lsrc(0) := inst.RS1
76798cfe81bSxgkiri  decodedInst.lsrc(1) := inst.RS2
76849a2cda2SXuan Hu  // src(2) of fma is fs3, src(2) of vector inst is old vd
76949a2cda2SXuan Hu  decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD)
7709c5a1080Sxiaofeibao  decodedInst.lsrc(3) := V0_IDX.U
7719c5a1080Sxiaofeibao  decodedInst.lsrc(4) := Vl_IDX.U
772b6b11f60SXuan Hu
773178dd38cSYikeZhou  // read dest location
77498cfe81bSxgkiri  decodedInst.ldest := inst.RD
7754d24c305SYikeZhou
776e4e68f86Sxiaofeibao  // init v0Wen vlWen
777e4e68f86Sxiaofeibao  decodedInst.v0Wen := false.B
778e4e68f86Sxiaofeibao  decodedInst.vlWen := false.B
779e4e68f86Sxiaofeibao
780c2a8ae00SYikeZhou  // fill in exception vector
781567f0269Ssinsanction  val vecException = Module(new VecExceptionGen)
782567f0269Ssinsanction  vecException.io.inst := io.enq.ctrlFlow.instr
783567f0269Ssinsanction  vecException.io.decodedInst := decodedInst
784bdda74fdSxiaofeibao-xjtu  vecException.io.vtype := decodedInst.vpu.vtype
7855110577fSZiyue Zhang  vecException.io.vstart := decodedInst.vpu.vstart
7864d24c305SYikeZhou
78715ed99a7SXuan Hu  private val exceptionII =
78815ed99a7SXuan Hu    decodedInst.selImm === SelImm.INVALID_INSTR ||
78915ed99a7SXuan Hu    vecException.io.illegalInst ||
79015ed99a7SXuan Hu    io.fromCSR.illegalInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence  ||
79115ed99a7SXuan Hu    io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
79215ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g ||
79315ed99a7SXuan Hu    io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v ||
79415ed99a7SXuan Hu    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
7958b7dc6f5SsinceforYy    io.fromCSR.illegalInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
7968b7dc6f5SsinceforYy    io.fromCSR.illegalInst.fsIsOff    && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) ||
7978b7dc6f5SsinceforYy                                          (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) ||
7988b7dc6f5SsinceforYy                                           FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2)) ||
799*b50a88ecSXuan Hu    io.fromCSR.illegalInst.vsIsOff    && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) ||
800*b50a88ecSXuan Hu    io.fromCSR.illegalInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType)
80115ed99a7SXuan Hu
80215ed99a7SXuan Hu  private val exceptionVI =
80315ed99a7SXuan Hu    io.fromCSR.virtualInst.sfenceVMA  && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence ||
80415ed99a7SXuan Hu    io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence ||
80515ed99a7SXuan Hu    io.fromCSR.virtualInst.hfence     && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) ||
80615ed99a7SXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu)   && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) ||
807*b50a88ecSXuan Hu    io.fromCSR.virtualInst.hlsv       && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu)   && LSUOpType.isHsv(decodedInst.fuOpType) ||
808*b50a88ecSXuan Hu    io.fromCSR.virtualInst.wfi        && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)   && CSROpType.isWfi(decodedInst.fuOpType)
80915ed99a7SXuan Hu
81015ed99a7SXuan Hu  decodedInst.exceptionVec(illegalInstr) := exceptionII
81115ed99a7SXuan Hu  decodedInst.exceptionVec(virtualInstr) := exceptionVI
812d0de7e4aSpeixiaokun
8133b739f49SXuan Hu  decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map(
814b0ae3ac4SLinJiawei    x => {
8157ceedf30SLinJiawei      val minBits = x._2.minBitsFromInstr(ctrl_flow.instr)
816b0ae3ac4SLinJiawei      require(minBits.getWidth == x._2.len)
817b0ae3ac4SLinJiawei      x._1 -> minBits
818b0ae3ac4SLinJiawei    }
819b0ae3ac4SLinJiawei  ))
820aac4464eSYinan Xu
8217531c765SXuan Hu  private val isLs = FuType.isLoadStore(decodedInst.fuType)
8227531c765SXuan Hu  private val isVls = FuType.isVls(decodedInst.fuType)
8237531c765SXuan Hu  private val isStore = FuType.isStore(decodedInst.fuType)
8247531c765SXuan Hu  private val isAMO = FuType.isAMO(decodedInst.fuType)
8257531c765SXuan Hu  private val isVStore = FuType.isVStore(decodedInst.fuType)
8267531c765SXuan Hu  private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType)
8277531c765SXuan Hu
8287531c765SXuan Hu  decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch)
82975e2c883SXuan Hu
83075e2c883SXuan Hu  decodedInst.isVset := FuType.isVset(decodedInst.fuType)
831be25371aSYikeZhou
8320bca6cb3SZiyue Zhang  private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S)
83339c388b5SXuan Hu  private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8)
83439c388b5SXuan Hu  private val narrowInsts = Seq(
83539c388b5SXuan Hu    VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI,
83639c388b5SXuan Hu    VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI,
83739c388b5SXuan Hu  )
83839c388b5SXuan Hu  private val maskDstInsts = Seq(
83939c388b5SXuan Hu    VMADC_VV, VMADC_VX,  VMADC_VI,  VMADC_VVM, VMADC_VXM, VMADC_VIM,
84039c388b5SXuan Hu    VMSBC_VV, VMSBC_VX,  VMSBC_VVM, VMSBC_VXM,
84139c388b5SXuan Hu    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
8429eaaa75dSXuan Hu    VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI,
8439eaaa75dSXuan Hu    VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI,
8449eaaa75dSXuan Hu    VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX,
8459eaaa75dSXuan Hu    VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI,
846f06d6d60Sxiaofeibao-xjtu    VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF,
84739c388b5SXuan Hu  )
84830fcc710SZiyue Zhang  private val maskOpInsts = Seq(
84930fcc710SZiyue Zhang    VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM,
85030fcc710SZiyue Zhang  )
85194e6af68SZiyue-Zhang  private val vmaInsts = Seq(
85294e6af68SZiyue-Zhang    VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX,
85394e6af68SZiyue-Zhang    VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX,
85494e6af68SZiyue-Zhang  )
855bdda74fdSxiaofeibao-xjtu  private val wfflagsInsts = Seq(
856bdda74fdSxiaofeibao-xjtu    // opfff
857bdda74fdSxiaofeibao-xjtu    FADD_S, FSUB_S, FADD_D, FSUB_D,
858bdda74fdSxiaofeibao-xjtu    FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D,
859bdda74fdSxiaofeibao-xjtu    FMIN_S, FMAX_S, FMIN_D, FMAX_D,
860bdda74fdSxiaofeibao-xjtu    FMUL_S, FMUL_D,
861bdda74fdSxiaofeibao-xjtu    FDIV_S, FDIV_D, FSQRT_S, FSQRT_D,
862bdda74fdSxiaofeibao-xjtu    FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D,
863bdda74fdSxiaofeibao-xjtu    FSGNJ_S, FSGNJN_S, FSGNJX_S,
864bdda74fdSxiaofeibao-xjtu    // opfvv
865bdda74fdSxiaofeibao-xjtu    VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV,
866bdda74fdSxiaofeibao-xjtu    VFMUL_VV, VFDIV_VV, VFWMUL_VV,
867bdda74fdSxiaofeibao-xjtu    VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV,
868bdda74fdSxiaofeibao-xjtu    VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV,
869bdda74fdSxiaofeibao-xjtu    VFSQRT_V,
870bdda74fdSxiaofeibao-xjtu    VFMIN_VV, VFMAX_VV,
871bdda74fdSxiaofeibao-xjtu    VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV,
872bdda74fdSxiaofeibao-xjtu    VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV,
873bdda74fdSxiaofeibao-xjtu    // opfvf
874bdda74fdSxiaofeibao-xjtu    VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF,
875bdda74fdSxiaofeibao-xjtu    VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF,
876bdda74fdSxiaofeibao-xjtu    VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF,
877bdda74fdSxiaofeibao-xjtu    VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF,
878bdda74fdSxiaofeibao-xjtu    VFMIN_VF, VFMAX_VF,
879bdda74fdSxiaofeibao-xjtu    VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF,
880bdda74fdSxiaofeibao-xjtu    VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF,
881aab8ef9cSxiaofeibao-xjtu    // vfred
882aab8ef9cSxiaofeibao-xjtu    VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS,
883bdda74fdSxiaofeibao-xjtu    // fcvt & vfcvt
884bdda74fdSxiaofeibao-xjtu    FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU,
885bdda74fdSxiaofeibao-xjtu    FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S,
886bdda74fdSxiaofeibao-xjtu    FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU,
887bdda74fdSxiaofeibao-xjtu    FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S,
888ba899681Schengguanghui    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,
889ba899681Schengguanghui    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,
890ba899681Schengguanghui    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,
891ba899681Schengguanghui    VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V,
892bdda74fdSxiaofeibao-xjtu  )
893bdda74fdSxiaofeibao-xjtu  decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _)
894bdda74fdSxiaofeibao-xjtu  val fpToVecDecoder = Module(new FPToVecDecoder())
895bdda74fdSxiaofeibao-xjtu  fpToVecDecoder.io.instr := inst.asUInt
896bdda74fdSxiaofeibao-xjtu  val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst
8973b739f49SXuan Hu  decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder
898bdda74fdSxiaofeibao-xjtu  when(isFpToVecInst){
899bdda74fdSxiaofeibao-xjtu    decodedInst.vpu := fpToVecDecoder.io.vpuCtrl
900bdda74fdSxiaofeibao-xjtu  }.otherwise{
90175e2c883SXuan Hu    decodedInst.vpu.vill := io.enq.vtype.illegal
90275e2c883SXuan Hu    decodedInst.vpu.vma := io.enq.vtype.vma
90375e2c883SXuan Hu    decodedInst.vpu.vta := io.enq.vtype.vta
90475e2c883SXuan Hu    decodedInst.vpu.vsew := io.enq.vtype.vsew
90575e2c883SXuan Hu    decodedInst.vpu.vlmul := io.enq.vtype.vlmul
90675e2c883SXuan Hu    decodedInst.vpu.vm := inst.VM
90775e2c883SXuan Hu    decodedInst.vpu.nf := inst.NF
908d9355d3aSZiyue-Zhang    decodedInst.vpu.veew := inst.WIDTH
90994e7468cSXuan Hu    decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _)
91039c388b5SXuan Hu    decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _)
911b6279fc6SZiyue Zhang    val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _)
912b6279fc6SZiyue Zhang    val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _)
913b6279fc6SZiyue Zhang    val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _)
914b6279fc6SZiyue Zhang    val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe
915dab1ad8cSsinsanction    val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse
916dab1ad8cSsinsanction    val isVlm = decodedInst.fuOpType === VlduType.vlm
917d8ceb649SZiyue Zhang    val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV
91894e6af68SZiyue-Zhang    val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _)
919dab1ad8cSsinsanction    val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew
920b6279fc6SZiyue Zhang    decodedInst.vpu.isNarrow := isNarrow
921b6279fc6SZiyue Zhang    decodedInst.vpu.isDstMask := isDstMask
922b6279fc6SZiyue Zhang    decodedInst.vpu.isOpMask := isOpMask
92394e6af68SZiyue-Zhang    decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma
924dab1ad8cSsinsanction    decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac
9255110577fSZiyue Zhang    decodedInst.vpu.vstart := io.enq.vstart
926bdda74fdSxiaofeibao-xjtu  }
92775e2c883SXuan Hu
92831c51290Szhanglinjuan  decodedInst.vlsInstr := isVls
92931c51290Szhanglinjuan
9306d56ac16Ssinsanction  decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src
9316d56ac16Ssinsanction  decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig
9326d56ac16Ssinsanction
9337f9f0a79SzhanglyGit  val uopInfoGen = Module(new UopInfoGen)
93487dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType
93587dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew
93606cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul
93787dd4e0dSzhanglyGit  uopInfoGen.io.in.preInfo.vwidth := inst.RM
9380a34fc22SZiyue Zhang  uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0)
939c4501a6fSZiyue-Zhang  uopInfoGen.io.in.preInfo.nf := inst.NF
94006cb2bc1Sweidingliu  uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr
941c90e3eacSZiyue Zhang  uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm
9427f9f0a79SzhanglyGit  io.deq.isComplex := uopInfoGen.io.out.isComplex
9437f9f0a79SzhanglyGit  io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop
9443235a9d8SZiyue-Zhang  io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB
9457f9f0a79SzhanglyGit  io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul
9467f9f0a79SzhanglyGit
94787c5d21dSZiyue Zhang  // for csrr vl instruction, convert to vsetvl
94887c5d21dSZiyue Zhang  val Vl = 0xC20.U
94963cb3754SZiyue Zhang  val Vlenb = 0xC22.U
95063cb3754SZiyue Zhang  val isCsrInst = FuType.FuTypeOrR(decodedInst.fuType, FuType.csr)
95163cb3754SZiyue Zhang  //  rs1 is x0 or uimm == 0
95263cb3754SZiyue Zhang  val isCsrRead = (decodedInst.fuOpType === CSROpType.set || decodedInst.fuOpType === CSROpType.clr) && inst.RS1 === 0.U
95363cb3754SZiyue Zhang  val isCsrrVl = isCsrInst && isCsrRead && inst.CSRIDX === Vl
95463cb3754SZiyue Zhang  val isCsrrVlenb = isCsrInst && isCsrRead && inst.CSRIDX === Vlenb
95587c5d21dSZiyue Zhang  when (isCsrrVl) {
95663cb3754SZiyue Zhang    // convert to vsetvl instruction
95787c5d21dSZiyue Zhang    decodedInst.srcType(0) := SrcType.no
95887c5d21dSZiyue Zhang    decodedInst.srcType(1) := SrcType.no
95987c5d21dSZiyue Zhang    decodedInst.srcType(2) := SrcType.no
96087c5d21dSZiyue Zhang    decodedInst.srcType(3) := SrcType.no
96187c5d21dSZiyue Zhang    decodedInst.srcType(4) := SrcType.vp
96287c5d21dSZiyue Zhang    decodedInst.lsrc(4) := Vl_IDX.U
96363cb3754SZiyue Zhang    decodedInst.waitForward := false.B
96487c5d21dSZiyue Zhang    decodedInst.blockBackward := false.B
96563cb3754SZiyue Zhang  }.elsewhen(isCsrrVlenb){
96663cb3754SZiyue Zhang    // convert to addi instruction
967828a8a48SZiyue Zhang    decodedInst.srcType(0) := SrcType.reg
968828a8a48SZiyue Zhang    decodedInst.srcType(1) := SrcType.imm
96963cb3754SZiyue Zhang    decodedInst.srcType(2) := SrcType.no
97063cb3754SZiyue Zhang    decodedInst.srcType(3) := SrcType.no
97163cb3754SZiyue Zhang    decodedInst.srcType(4) := SrcType.no
97263cb3754SZiyue Zhang    decodedInst.selImm := SelImm.IMM_I
97363cb3754SZiyue Zhang    decodedInst.waitForward := false.B
97463cb3754SZiyue Zhang    decodedInst.blockBackward := false.B
97563cb3754SZiyue Zhang    decodedInst.canRobCompress := true.B
97687c5d21dSZiyue Zhang  }
97787c5d21dSZiyue Zhang
97875e2c883SXuan Hu  io.deq.decodedInst := decodedInst
9799faa51afSxiaofeibao-xjtu  io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen
980985804e6SXuan Hu  // change vlsu to vseglsu when NF =/= 0.U
981985804e6SXuan Hu  io.deq.decodedInst.fuType := Mux1H(Seq(
98287c5d21dSZiyue Zhang    ( isCsrrVl) -> FuType.vsetfwf.U,
98363cb3754SZiyue Zhang    ( isCsrrVlenb) -> FuType.alu.U,
98463cb3754SZiyue Zhang    (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType,
985f94f6503SXuan 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,
986f94f6503SXuan Hu    // MOP === b00 && SUMOP === b01000: unit-stride whole register store
987f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed store
988f94f6503SXuan 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,
989f94f6503SXuan Hu    // MOP === b00 && LUMOP === b01000: unit-stride whole register load
990f94f6503SXuan Hu    // MOP =/= b00                    : strided and indexed load
991f94f6503SXuan 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,
992985804e6SXuan Hu  ))
99363cb3754SZiyue Zhang  io.deq.decodedInst.fuOpType := Mux(isCsrrVlenb, ALUOpType.add, decodedInst.fuOpType)
99463cb3754SZiyue Zhang  io.deq.decodedInst.imm := Mux(isCsrrVlenb, (VLEN / 8).U, decodedInst.imm)
995be25371aSYikeZhou  //-------------------------------------------------------------
996be25371aSYikeZhou  // Debug Info
9973b739f49SXuan Hu//  XSDebug("in:  instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n",
9983b739f49SXuan Hu//    io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt,
9993b739f49SXuan Hu//    io.enq.ctrl_flow.crossPageIPFFix)
10003b739f49SXuan 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",
10013b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2),
10023b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2),
10033b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType)
10043b739f49SXuan Hu//  XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n",
10053b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap,
10063b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe,
10073b739f49SXuan Hu//    io.deq.cf_ctrl.ctrl.imm)
10083b739f49SXuan Hu//  XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt)
1009be25371aSYikeZhou}
1010