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._ 22cc1eb70dSXuan Huimport freechips.rocketchip.rocket.CSRs 233b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._ 246ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat 253c02ee8fSwakafaimport utility._ 263b739f49SXuan Huimport utils._ 275a9dd560SXuan Huimport xiangshan.ExceptionNO.{EX_II, breakPoint, illegalInstr, virtualInstr} 286ab6918fSYinan Xuimport xiangshan._ 29730cfbc0SXuan Huimport xiangshan.backend.fu.FuType 30730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst} 311be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions 32cc1eb70dSXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, OPCODE5Bit, XSInstBitFields} 335110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl} 3415ed99a7SXuan Huimport xiangshan.backend.fu.wrapper.CSRToDecode 35*499d2763SZiyue Zhangimport xiangshan.backend.decode.Zimop._ 36be25371aSYikeZhou 37be25371aSYikeZhou/** 38be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/ 39be25371aSYikeZhou */ 40be25371aSYikeZhouabstract trait DecodeConstants { 41361e6d51SJiuyang Liu // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt. 4257a10886SXuan Hu def X = BitPat("b0") 434d24c305SYikeZhou def N = BitPat("b0") 444d24c305SYikeZhou def Y = BitPat("b1") 4557a10886SXuan Hu def T = true 4657a10886SXuan Hu def F = false 474d24c305SYikeZhou 48c2a8ae00SYikeZhou def decodeDefault: List[BitPat] = // illegal instruction 4920e31bd1SYinan Xu // srcType(0) srcType(1) srcType(2) fuType fuOpType rfWen 504d24c305SYikeZhou // | | | | | | fpWen 5157a10886SXuan Hu // | | | | | | | vecWen 5257a10886SXuan Hu // | | | | | | | | isXSTrap 5357a10886SXuan Hu // | | | | | | | | | noSpecExec 5457a10886SXuan Hu // | | | | | | | | | | blockBackward 5557a10886SXuan Hu // | | | | | | | | | | | flushPipe 5689cc69c1STang Haojin // | | | | | | | | | | | | canRobCompress 5789cc69c1STang Haojin // | | | | | | | | | | | | | uopSplitType 5889cc69c1STang Haojin // | | | | | | | | | | | | | | selImm 5989cc69c1STang 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 604d24c305SYikeZhou 6157a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] 6257a10886SXuan Hu final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate())) 63be25371aSYikeZhou} 64be25371aSYikeZhou 65c2a8ae00SYikeZhoutrait DecodeUnitConstants 664d24c305SYikeZhou{ 674d24c305SYikeZhou // abstract out instruction decode magic numbers 684d24c305SYikeZhou val RD_MSB = 11 694d24c305SYikeZhou val RD_LSB = 7 704d24c305SYikeZhou val RS1_MSB = 19 714d24c305SYikeZhou val RS1_LSB = 15 724d24c305SYikeZhou val RS2_MSB = 24 734d24c305SYikeZhou val RS2_LSB = 20 744d24c305SYikeZhou val RS3_MSB = 31 754d24c305SYikeZhou val RS3_LSB = 27 764d24c305SYikeZhou} 774d24c305SYikeZhou 78be25371aSYikeZhou/** 79be25371aSYikeZhou * Decoded control signals 804d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala 81be25371aSYikeZhou */ 82c2a8ae00SYikeZhou 8357a10886SXuan Huabstract class XSDecodeBase { 8457a10886SXuan Hu def X = BitPat("b?") 8557a10886SXuan Hu def N = BitPat("b0") 8657a10886SXuan Hu def Y = BitPat("b1") 8757a10886SXuan Hu def T = true 8857a10886SXuan Hu def F = false 8957a10886SXuan Hu def generate() : List[BitPat] 9057a10886SXuan Hu} 9157a10886SXuan Hu 9257a10886SXuan Hucase class XSDecode( 9357a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 94239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat, 95e2695e90SzhanglyGit uopSplitType: BitPat = UopSplitType.X, 9657a10886SXuan Hu xWen: Boolean = false, 9757a10886SXuan Hu fWen: Boolean = false, 9857a10886SXuan Hu vWen: Boolean = false, 9957a10886SXuan Hu mWen: Boolean = false, 10057a10886SXuan Hu xsTrap: Boolean = false, 10157a10886SXuan Hu noSpec: Boolean = false, 10257a10886SXuan Hu blockBack: Boolean = false, 10357a10886SXuan Hu flushPipe: Boolean = false, 10489cc69c1STang Haojin canRobCompress: Boolean = false, 10557a10886SXuan Hu) extends XSDecodeBase { 10657a10886SXuan Hu def generate() : List[BitPat] = { 10789cc69c1STang 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) 10857a10886SXuan Hu } 10957a10886SXuan Hu} 11057a10886SXuan Hu 11157a10886SXuan Hucase class FDecode( 11257a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 113239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X, 11417ec87f2SXuan Hu uopSplitType: BitPat = UopSplitType.X, 11557a10886SXuan Hu xWen: Boolean = false, 11657a10886SXuan Hu fWen: Boolean = false, 11757a10886SXuan Hu vWen: Boolean = false, 11857a10886SXuan Hu mWen: Boolean = false, 11957a10886SXuan Hu xsTrap: Boolean = false, 12057a10886SXuan Hu noSpec: Boolean = false, 12157a10886SXuan Hu blockBack: Boolean = false, 12257a10886SXuan Hu flushPipe: Boolean = false, 12389cc69c1STang Haojin canRobCompress: Boolean = false, 12457a10886SXuan Hu) extends XSDecodeBase { 12557a10886SXuan Hu def generate() : List[BitPat] = { 12689cc69c1STang Haojin XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate() 12757a10886SXuan Hu } 12857a10886SXuan Hu} 12957a10886SXuan Hu 130be25371aSYikeZhou/** 131be25371aSYikeZhou * Overall Decode constants 132be25371aSYikeZhou */ 133be25371aSYikeZhouobject XDecode extends DecodeConstants { 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 210fa16cf81Slewislzh CSRRW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 211fa16cf81Slewislzh CSRRS -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 212fa16cf81Slewislzh CSRRC -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2134d24c305SYikeZhou 21457a10886SXuan Hu CSRRWI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21557a10886SXuan Hu CSRRSI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21657a10886SXuan Hu CSRRCI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2174d24c305SYikeZhou 21857a10886SXuan Hu EBREAK -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21957a10886SXuan Hu ECALL -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22057a10886SXuan Hu SRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22157a10886SXuan Hu MRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22257a10886SXuan Hu DRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22357a10886SXuan Hu WFI -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X , xWen = T, noSpec = T, blockBack = T), 2244d24c305SYikeZhou 22557a10886SXuan Hu SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22657a10886SXuan Hu FENCE_I -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22757a10886SXuan Hu FENCE -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 2284d24c305SYikeZhou 229768f5f91SYangyu Chen // RV64A 23057a10886SXuan Hu AMOADD_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23157a10886SXuan Hu AMOXOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23257a10886SXuan Hu AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23357a10886SXuan Hu AMOAND_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23457a10886SXuan Hu AMOOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23557a10886SXuan Hu AMOMIN_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23657a10886SXuan Hu AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23757a10886SXuan Hu AMOMAX_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23857a10886SXuan Hu AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2394d24c305SYikeZhou 24057a10886SXuan Hu AMOADD_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24157a10886SXuan Hu AMOXOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24257a10886SXuan Hu AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24357a10886SXuan Hu AMOAND_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24457a10886SXuan Hu AMOOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24557a10886SXuan Hu AMOMIN_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24657a10886SXuan Hu AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24757a10886SXuan Hu AMOMAX_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24857a10886SXuan Hu AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2494d24c305SYikeZhou 25057a10886SXuan Hu LR_W -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25157a10886SXuan Hu LR_D -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25257a10886SXuan Hu SC_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25357a10886SXuan Hu SC_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 254768f5f91SYangyu Chen ) 255768f5f91SYangyu Chen} 256ee8ff153Szfw 257768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{ 258768f5f91SYangyu Chen /* 259768f5f91SYangyu Chen Note: Some Bitmanip instruction may have different OP code between rv32 and rv64. 260768f5f91SYangyu Chen Including pseudo instruction like zext.h, and different funct12 like rev8. 261768f5f91SYangyu Chen If some day we need to support change XLEN via CSR, we should care about this. 262768f5f91SYangyu Chen */ 263768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 264768f5f91SYangyu Chen // Zba 265768f5f91SYangyu Chen ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T, canRobCompress = T), 266768f5f91SYangyu Chen SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T, canRobCompress = T), 267768f5f91SYangyu Chen SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T, canRobCompress = T), 268768f5f91SYangyu Chen SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T, canRobCompress = T), 269768f5f91SYangyu Chen SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T, canRobCompress = T), 270768f5f91SYangyu Chen SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T, canRobCompress = T), 271768f5f91SYangyu Chen SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T, canRobCompress = T), 272768f5f91SYangyu Chen SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T, canRobCompress = T), 273768f5f91SYangyu Chen 274768f5f91SYangyu Chen // Zbb 27589cc69c1STang Haojin ANDN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn , SelImm.X , xWen = T, canRobCompress = T), 27689cc69c1STang Haojin ORN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X , xWen = T, canRobCompress = T), 27789cc69c1STang Haojin XNOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor , SelImm.X , xWen = T, canRobCompress = T), 278ee8ff153Szfw 279768f5f91SYangyu Chen CLZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz , SelImm.X , xWen = T, canRobCompress = T), 280768f5f91SYangyu Chen CLZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw , SelImm.X , xWen = T, canRobCompress = T), 281768f5f91SYangyu Chen CTZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz , SelImm.X , xWen = T, canRobCompress = T), 282768f5f91SYangyu Chen CTZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw , SelImm.X , xWen = T, canRobCompress = T), 283768f5f91SYangyu Chen 284768f5f91SYangyu Chen CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop , SelImm.X , xWen = T, canRobCompress = T), 285768f5f91SYangyu Chen CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw , SelImm.X , xWen = T, canRobCompress = T), 286768f5f91SYangyu Chen 28789cc69c1STang Haojin MAX -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X , xWen = T, canRobCompress = T), 28889cc69c1STang Haojin MAXU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu , SelImm.X , xWen = T, canRobCompress = T), 289768f5f91SYangyu Chen MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X , xWen = T, canRobCompress = T), 290768f5f91SYangyu Chen MINU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu , SelImm.X , xWen = T, canRobCompress = T), 291ee8ff153Szfw 29289cc69c1STang Haojin SEXT_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sextb , SelImm.X , xWen = T, canRobCompress = T), 29389cc69c1STang Haojin SEXT_H -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sexth , SelImm.X , xWen = T, canRobCompress = T), 294768f5f91SYangyu Chen // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0. 295768f5f91SYangyu Chen // If we configured to have no Zbkb, we should add zext.h here. 296ee8ff153Szfw 297768f5f91SYangyu Chen ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol , SelImm.X , xWen = T, canRobCompress = T), 298768f5f91SYangyu Chen ROLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw , SelImm.X , xWen = T, canRobCompress = T), 29989cc69c1STang Haojin ROR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.X , xWen = T, canRobCompress = T), 30089cc69c1STang Haojin RORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.IMM_I, xWen = T, canRobCompress = T), 301768f5f91SYangyu Chen RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.IMM_I, xWen = T, canRobCompress = T), 302768f5f91SYangyu Chen RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.X , xWen = T, canRobCompress = T), 303ee8ff153Szfw 304768f5f91SYangyu Chen ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb , SelImm.X , xWen = T, canRobCompress = T), 305768f5f91SYangyu Chen 306768f5f91SYangyu Chen REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X , xWen = T, canRobCompress = T), 307768f5f91SYangyu Chen 308768f5f91SYangyu Chen // Zbc 309768f5f91SYangyu Chen CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul , SelImm.X , xWen = T, canRobCompress = T), 310768f5f91SYangyu Chen CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh , SelImm.X , xWen = T, canRobCompress = T), 311768f5f91SYangyu Chen CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr , SelImm.X , xWen = T, canRobCompress = T), 312768f5f91SYangyu Chen 313768f5f91SYangyu Chen // Zbs 314768f5f91SYangyu Chen BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.X , xWen = T, canRobCompress = T), 315768f5f91SYangyu Chen BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.IMM_I, xWen = T, canRobCompress = T), 316768f5f91SYangyu Chen BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.X , xWen = T, canRobCompress = T), 317768f5f91SYangyu Chen BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.IMM_I, xWen = T, canRobCompress = T), 318768f5f91SYangyu Chen BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.X , xWen = T, canRobCompress = T), 319768f5f91SYangyu Chen BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.IMM_I, xWen = T, canRobCompress = T), 320768f5f91SYangyu Chen BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.X , xWen = T, canRobCompress = T), 321768f5f91SYangyu Chen BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.IMM_I, xWen = T, canRobCompress = T), 322768f5f91SYangyu Chen 323768f5f91SYangyu Chen // Zbkb 324768f5f91SYangyu Chen // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb 325768f5f91SYangyu Chen PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X , xWen = T, canRobCompress = T), 326768f5f91SYangyu Chen PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh , SelImm.X , xWen = T, canRobCompress = T), 327768f5f91SYangyu Chen PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw , SelImm.X , xWen = T, canRobCompress = T), 328768f5f91SYangyu Chen BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X , xWen = T, canRobCompress = T), 329768f5f91SYangyu Chen // If configured to RV32, we should add zip and unzip. 330768f5f91SYangyu Chen 331768f5f91SYangyu Chen // Zbkc 332768f5f91SYangyu Chen // clmul, clmulh is in Zbc 333768f5f91SYangyu Chen 334768f5f91SYangyu Chen // Zbkx 335768f5f91SYangyu Chen XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn , SelImm.X , xWen = T, canRobCompress = T), 336768f5f91SYangyu Chen XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb , SelImm.X , xWen = T, canRobCompress = T), 337768f5f91SYangyu Chen ) 338768f5f91SYangyu Chen} 339768f5f91SYangyu Chen 340768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants { 341768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 342768f5f91SYangyu Chen // Zknd: NIST Suite: AES Decryption 343768f5f91SYangyu Chen AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds , SelImm.X , xWen = T, canRobCompress = T), 344768f5f91SYangyu Chen AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm , SelImm.X , xWen = T, canRobCompress = T), 345768f5f91SYangyu Chen AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im , SelImm.X , xWen = T, canRobCompress = T), 346768f5f91SYangyu Chen AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T), 347768f5f91SYangyu Chen AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2 , SelImm.X , xWen = T, canRobCompress = T), 348768f5f91SYangyu Chen 349768f5f91SYangyu Chen // Zkne: NIST Suite: AES Encryption 350768f5f91SYangyu Chen // aes64ks1i, aes64ks2 is in Zknd 351768f5f91SYangyu Chen AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es , SelImm.X , xWen = T, canRobCompress = T), 352768f5f91SYangyu Chen AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm , SelImm.X , xWen = T, canRobCompress = T), 353768f5f91SYangyu Chen 354768f5f91SYangyu Chen // Zknh: NIST Suite: Hash Function Instructions 355768f5f91SYangyu Chen SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T, canRobCompress = T), 356768f5f91SYangyu Chen SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T, canRobCompress = T), 357768f5f91SYangyu Chen SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T, canRobCompress = T), 358768f5f91SYangyu Chen SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T, canRobCompress = T), 359768f5f91SYangyu Chen SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T, canRobCompress = T), 360768f5f91SYangyu Chen SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T, canRobCompress = T), 361768f5f91SYangyu Chen SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T, canRobCompress = T), 362768f5f91SYangyu Chen SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T, canRobCompress = T), 363768f5f91SYangyu Chen 364768f5f91SYangyu Chen // Zksed: ShangMi Suite: SM4 Block Cipher Instructions 365768f5f91SYangyu Chen SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0 , SelImm.X , xWen = T, canRobCompress = T), 366768f5f91SYangyu Chen SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1 , SelImm.X , xWen = T, canRobCompress = T), 367768f5f91SYangyu Chen SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2 , SelImm.X , xWen = T, canRobCompress = T), 368768f5f91SYangyu Chen SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3 , SelImm.X , xWen = T, canRobCompress = T), 369768f5f91SYangyu Chen SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0 , SelImm.X , xWen = T, canRobCompress = T), 370768f5f91SYangyu Chen SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1 , SelImm.X , xWen = T, canRobCompress = T), 371768f5f91SYangyu Chen SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2 , SelImm.X , xWen = T, canRobCompress = T), 372768f5f91SYangyu Chen SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3 , SelImm.X , xWen = T, canRobCompress = T), 373768f5f91SYangyu Chen 374768f5f91SYangyu Chen // Zksh: ShangMi Suite: SM3 Hash Function Instructions 375768f5f91SYangyu Chen SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0 , SelImm.X , xWen = T, canRobCompress = T), 376768f5f91SYangyu Chen SM3P1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p1 , SelImm.X , xWen = T, canRobCompress = T), 3774d24c305SYikeZhou ) 378be25371aSYikeZhou} 379be25371aSYikeZhou 380be25371aSYikeZhou/** 381be25371aSYikeZhou * FP Decode constants 382be25371aSYikeZhou */ 38357a10886SXuan Huobject FpDecode extends DecodeConstants{ 38457a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 385b189aafaSzmx FLH -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T), 38657a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 38757a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 388b189aafaSzmx FSH -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S ), 38957a10886SXuan Hu FSW -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S ), 39057a10886SXuan Hu FSD -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S ), 3914d24c305SYikeZhou 392964d9a87SZiyue Zhang FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T), 393964d9a87SZiyue Zhang FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T), 394b189aafaSzmx FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T), 395c2a8ae00SYikeZhou 3964d24c305SYikeZhou // Int to FP 39789cc69c1STang Haojin FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39889cc69c1STang Haojin FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39989cc69c1STang Haojin FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40089cc69c1STang Haojin FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4014d24c305SYikeZhou 40289cc69c1STang Haojin FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40389cc69c1STang Haojin FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40489cc69c1STang Haojin FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40589cc69c1STang Haojin FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4064d24c305SYikeZhou 4074d24c305SYikeZhou ) 408be25371aSYikeZhou} 409be25371aSYikeZhou 410be25371aSYikeZhou/** 411be25371aSYikeZhou * FP Divide SquareRoot Constants 412be25371aSYikeZhou */ 413be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 41457a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 41589cc69c1STang Haojin FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41689cc69c1STang Haojin FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41789cc69c1STang Haojin FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41889cc69c1STang Haojin FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 4194d24c305SYikeZhou ) 420be25371aSYikeZhou} 421be25371aSYikeZhou 4224d24c305SYikeZhou/** 423af2f7849Shappy-lx * Svinval extension Constants 424af2f7849Shappy-lx */ 425af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 42657a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 427af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 428af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 429af2f7849Shappy-lx */ 43057a10886SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X), 431af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 432af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 433af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 434af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 435af2f7849Shappy-lx */ 43657a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 437af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 438af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 439af2f7849Shappy-lx * then dispatch and issue this instrucion 440af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 441af2f7849Shappy-lx */ 44257a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 443af2f7849Shappy-lx /* what is Svinval extension ? 444af2f7849Shappy-lx * -----> sfecne.w.inval 445af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 446af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 447af2f7849Shappy-lx * -----> sfecne.inval.ir 448af2f7849Shappy-lx * 449af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 450af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 451af2f7849Shappy-lx */ 452af2f7849Shappy-lx ) 453af2f7849Shappy-lx} 45457a10886SXuan Hu 455af2f7849Shappy-lx/* 456ca18a0b4SWilliam Wang * CBO decode 457ca18a0b4SWilliam Wang */ 458ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 45957a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 46057a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 46157a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 46257a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 46357a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 464ca18a0b4SWilliam Wang ) 465ca18a0b4SWilliam Wang} 466ca18a0b4SWilliam Wang 467d0de7e4aSpeixiaokun/* 468d0de7e4aSpeixiaokun * Hypervisor decode 469d0de7e4aSpeixiaokun */ 470d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants { 471e25e4d90SXuan Hu override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 472e25e4d90SXuan Hu HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 473e25e4d90SXuan Hu HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 474e25e4d90SXuan Hu HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X), 475e25e4d90SXuan Hu HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X), 476e25e4d90SXuan Hu HLV_B -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvb, SelImm.X, xWen = T), 477e25e4d90SXuan Hu HLV_BU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvbu, SelImm.X, xWen = T), 478e25e4d90SXuan Hu HLV_D -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvd, SelImm.X, xWen = T), 479e25e4d90SXuan Hu HLV_H -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvh, SelImm.X, xWen = T), 480e25e4d90SXuan Hu HLV_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvhu, SelImm.X, xWen = T), 481e25e4d90SXuan Hu HLV_W -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvw, SelImm.X, xWen = T), 482e25e4d90SXuan Hu HLV_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvwu, SelImm.X, xWen = T), 483e25e4d90SXuan Hu HLVX_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxhu, SelImm.X, xWen = T), 484e25e4d90SXuan Hu HLVX_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxwu, SelImm.X, xWen = T), 485e25e4d90SXuan Hu HSV_B -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvb, SelImm.X), 486e25e4d90SXuan Hu HSV_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvd, SelImm.X), 487e25e4d90SXuan Hu HSV_H -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvh, SelImm.X), 488e25e4d90SXuan Hu HSV_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvw, SelImm.X), 489d0de7e4aSpeixiaokun ) 490d0de7e4aSpeixiaokun} 491d0de7e4aSpeixiaokun 492545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants { 493545d7be0SYangyu Chen override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 494545d7be0SYangyu Chen CZERO_EQZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T), 495545d7be0SYangyu Chen CZERO_NEZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T), 496545d7be0SYangyu Chen ) 497545d7be0SYangyu Chen} 498545d7be0SYangyu Chen 499ca18a0b4SWilliam Wang/** 500*499d2763SZiyue Zhang * "Zimop" Extension for May-Be-Operations 501*499d2763SZiyue Zhang */ 502*499d2763SZiyue Zhangobject ZimopDecode extends DecodeConstants { 503*499d2763SZiyue Zhang override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 504*499d2763SZiyue Zhang // temp use addi to decode MOP_R and MOP_RR 505*499d2763SZiyue Zhang MOP_R -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T), 506*499d2763SZiyue Zhang MOP_RR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T), 507*499d2763SZiyue Zhang ) 508*499d2763SZiyue Zhang} 509*499d2763SZiyue Zhang 510*499d2763SZiyue Zhang/** 5114d24c305SYikeZhou * XiangShan Trap Decode constants 5124d24c305SYikeZhou */ 5134d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 514361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 51557a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 51657a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 5174d24c305SYikeZhou ) 5184d24c305SYikeZhou} 519be25371aSYikeZhou 52049f433deSXuan Huabstract class Imm(val len: Int) { 521b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 522b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 523b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 524b0ae3ac4SLinJiawei} 525b0ae3ac4SLinJiawei 526b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 527fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 528b0ae3ac4SLinJiawei 529b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 530b0ae3ac4SLinJiawei Cat(instr(31, 20)) 531b0ae3ac4SLinJiawei} 532b0ae3ac4SLinJiawei 533b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 534b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 535b0ae3ac4SLinJiawei 536b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 537b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 538b0ae3ac4SLinJiawei} 539b0ae3ac4SLinJiawei 540b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 541b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 542b0ae3ac4SLinJiawei 543b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 544b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 545b0ae3ac4SLinJiawei} 546b0ae3ac4SLinJiawei 547b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 548fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 549b0ae3ac4SLinJiawei 550b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 551b0ae3ac4SLinJiawei instr(31, 12) 552c2a8ae00SYikeZhou } 553c2a8ae00SYikeZhou} 554c2a8ae00SYikeZhou 555b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 556b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 557b0ae3ac4SLinJiawei 558b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 559b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 560b0ae3ac4SLinJiawei } 561b0ae3ac4SLinJiawei} 562b0ae3ac4SLinJiawei 563fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){ 564b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 565b0ae3ac4SLinJiawei 566b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 567fa16cf81Slewislzh Cat(instr(11, 7), instr(19, 15), instr(31, 20)) 568b0ae3ac4SLinJiawei } 56992c61038SXuan Hu 57092c61038SXuan Hu def getCSRAddr(imm: UInt): UInt = { 57192c61038SXuan Hu require(imm.getWidth == this.len) 57292c61038SXuan Hu imm(11, 0) 57392c61038SXuan Hu } 57492c61038SXuan Hu 57592c61038SXuan Hu def getRS1(imm: UInt): UInt = { 57692c61038SXuan Hu require(imm.getWidth == this.len) 57792c61038SXuan Hu imm(16, 12) 57892c61038SXuan Hu } 57992c61038SXuan Hu 58092c61038SXuan Hu def getRD(imm: UInt): UInt = { 58192c61038SXuan Hu require(imm.getWidth == this.len) 58292c61038SXuan Hu imm(21, 17) 58392c61038SXuan Hu } 58492c61038SXuan Hu 58592c61038SXuan Hu def getImm5(imm: UInt): UInt = { 58692c61038SXuan Hu require(imm.getWidth == this.len) 58792c61038SXuan Hu imm(16, 12) 58892c61038SXuan Hu } 589b0ae3ac4SLinJiawei} 590b0ae3ac4SLinJiawei 591ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 592ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 593ee8ff153Szfw 594ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 595ee8ff153Szfw instr(25, 20) 596ee8ff153Szfw } 597ee8ff153Szfw} 598ee8ff153Szfw 59958c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 60058c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 60158c35d23Shuxuan0307 60258c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 60358c35d23Shuxuan0307 instr(19, 15) 60458c35d23Shuxuan0307 } 60558c35d23Shuxuan0307} 606b52d4755SXuan Hu 60758c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 60858c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 60958c35d23Shuxuan0307 61058c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 61158c35d23Shuxuan0307 instr(19, 15) 61258c35d23Shuxuan0307 } 61358c35d23Shuxuan0307} 614b52d4755SXuan Hu 6154aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 6164aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6174aa9ed34Sfdy 6184aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6194aa9ed34Sfdy instr(30, 20) 6204aa9ed34Sfdy } 621e6ac7fe1SZiyue Zhang /** 622e6ac7fe1SZiyue Zhang * get VType from extended imm 623e6ac7fe1SZiyue Zhang * @param extedImm 624e6ac7fe1SZiyue Zhang * @return VType 625e6ac7fe1SZiyue Zhang */ 626e6ac7fe1SZiyue Zhang def getVType(extedImm: UInt): InstVType = { 627e6ac7fe1SZiyue Zhang val vtype = Wire(new InstVType) 628e6ac7fe1SZiyue Zhang vtype := extedImm(10, 0).asTypeOf(new InstVType) 629e6ac7fe1SZiyue Zhang vtype 630e6ac7fe1SZiyue Zhang } 6314aa9ed34Sfdy} 632b52d4755SXuan Hu 633e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){ 6344aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6354aa9ed34Sfdy 6364aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6375c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 638b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 639e6ac7fe1SZiyue Zhang val vtype8 = rvInst.ZIMM_VSETIVLI 640b52d4755SXuan Hu Cat(uimm5, vtype8) 641b52d4755SXuan Hu } 642b52d4755SXuan Hu /** 643b52d4755SXuan Hu * get VType from extended imm 644b52d4755SXuan Hu * @param extedImm 645b52d4755SXuan Hu * @return VType 646b52d4755SXuan Hu */ 647b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 648b52d4755SXuan Hu val vtype = Wire(new InstVType) 649e6ac7fe1SZiyue Zhang vtype := extedImm(9, 0).asTypeOf(new InstVType) 650b52d4755SXuan Hu vtype 651b52d4755SXuan Hu } 652b52d4755SXuan Hu 653b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 654e6ac7fe1SZiyue Zhang extedImm(14, 10) 6554aa9ed34Sfdy } 6564aa9ed34Sfdy} 657fe528fd6Ssinsanction 658fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){ 659fe528fd6Ssinsanction override def do_toImm32(minBits: UInt): UInt = minBits(31, 0) 660fe528fd6Ssinsanction 661fe528fd6Ssinsanction override def minBitsFromInstr(instr: UInt): UInt = { 662fe528fd6Ssinsanction instr(31, 0) 663fe528fd6Ssinsanction } 664fe528fd6Ssinsanction} 665fe528fd6Ssinsanction 6667e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){ 6677e30d16cSZhaoyang You override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 6687e30d16cSZhaoyang You 6697e30d16cSZhaoyang You override def minBitsFromInstr(instr: UInt): UInt = { 6707e30d16cSZhaoyang You Cat(instr(26), instr(19, 15)) 6717e30d16cSZhaoyang You } 6727e30d16cSZhaoyang You} 6737e30d16cSZhaoyang You 674b0ae3ac4SLinJiaweiobject ImmUnion { 675b0ae3ac4SLinJiawei val I = Imm_I() 676b0ae3ac4SLinJiawei val S = Imm_S() 677b0ae3ac4SLinJiawei val B = Imm_B() 678b0ae3ac4SLinJiawei val U = Imm_U() 679b0ae3ac4SLinJiawei val J = Imm_J() 680b0ae3ac4SLinJiawei val Z = Imm_Z() 681ee8ff153Szfw val B6 = Imm_B6() 68258c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 68358c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 6844aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 6854aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 686fe528fd6Ssinsanction val LUI32 = Imm_LUI32() 6877e30d16cSZhaoyang You val VRORVI = Imm_VRORVI() 6884aa9ed34Sfdy 689520f7dacSsinsanction // do not add special type lui32 to this, keep ImmUnion max len being 20. 6907e30d16cSZhaoyang You val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI) 691b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 692b0ae3ac4SLinJiawei val immSelMap = Seq( 693b0ae3ac4SLinJiawei SelImm.IMM_I, 694b0ae3ac4SLinJiawei SelImm.IMM_S, 695b0ae3ac4SLinJiawei SelImm.IMM_SB, 696b0ae3ac4SLinJiawei SelImm.IMM_U, 697b0ae3ac4SLinJiawei SelImm.IMM_UJ, 698ee8ff153Szfw SelImm.IMM_Z, 69958c35d23Shuxuan0307 SelImm.IMM_B6, 70058c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 7014aa9ed34Sfdy SelImm.IMM_OPIVIU, 7024aa9ed34Sfdy SelImm.IMM_VSETVLI, 703fe528fd6Ssinsanction SelImm.IMM_VSETIVLI, 7047e30d16cSZhaoyang You SelImm.IMM_VRORVI, 705b0ae3ac4SLinJiawei ).zip(imms) 706b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 707b0ae3ac4SLinJiawei} 708b0ae3ac4SLinJiawei 709fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 710fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 711fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 712765e58c6Ssinsanction Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm) 713fd7603d9SYinan Xu } 7143b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 715fd7603d9SYinan Xu val loadImmLen = Imm_I().len 7163b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 717f4dcd9fcSsinsanction Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0)) 718fd7603d9SYinan Xu } 719fd7603d9SYinan Xu} 720b0ae3ac4SLinJiawei 721be25371aSYikeZhou/** 722be25371aSYikeZhou * IO bundle for the Decode unit 723be25371aSYikeZhou */ 724aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle { 725aaa08c5aSxiaofeibao-xjtu val decodedInst = Output(new DecodedInst) 726aaa08c5aSxiaofeibao-xjtu val isComplex = Output(Bool()) 727aaa08c5aSxiaofeibao-xjtu val uopInfo = Output(new UopInfo) 728aaa08c5aSxiaofeibao-xjtu} 7292225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 7303b739f49SXuan Hu val enq = new Bundle { 7313b739f49SXuan Hu val ctrlFlow = Input(new StaticInst) 732d91483a6Sfdy val vtype = Input(new VType) 7335110577fSZiyue Zhang val vstart = Input(Vl()) 7344aa9ed34Sfdy } 7353b739f49SXuan Hu// val vconfig = Input(UInt(XLEN.W)) 736aaa08c5aSxiaofeibao-xjtu val deq = new DecodeUnitDeqIO 737af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 73815ed99a7SXuan Hu val fromCSR = Input(new CSRToDecode) 739be25371aSYikeZhou} 740be25371aSYikeZhou 741be25371aSYikeZhou/** 742be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 743be25371aSYikeZhou */ 7442225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 745be25371aSYikeZhou val io = IO(new DecodeUnitIO) 746be25371aSYikeZhou 7473b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 748be25371aSYikeZhou 74975e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 75075e2c883SXuan Hu 75157a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 75257a10886SXuan Hu FpDecode.table ++ 753bdda74fdSxiaofeibao-xjtu// FDivSqrtDecode.table ++ 754768f5f91SYangyu Chen BitmanipDecode.table ++ 755768f5f91SYangyu Chen ScalarCryptoDecode.table ++ 756a19215ddSYinan Xu XSTrapDecode.table ++ 757a19215ddSYinan Xu CBODecode.table ++ 758b65b9ebaSXuan Hu SvinvalDecode.table ++ 759e25e4d90SXuan Hu HypervisorDecode.table ++ 760545d7be0SYangyu Chen VecDecoder.table ++ 761*499d2763SZiyue Zhang ZicondDecode.table ++ 762*499d2763SZiyue Zhang ZimopDecode.table 763b65b9ebaSXuan Hu 76489cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 765a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 766239413e5SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue 767a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 768a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 769be25371aSYikeZhou 7704d24c305SYikeZhou // output 7713b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 772be25371aSYikeZhou 7732ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 7747ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 7753b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 776ec427417Slinzhida decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags 7771a1319cbSLinJiawei 7783b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 7793b739f49SXuan Hu 780a8db15d8Sfdy decodedInst.uopIdx := 0.U 781d91483a6Sfdy decodedInst.firstUop := true.B 782d91483a6Sfdy decodedInst.lastUop := true.B 783f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 7843235a9d8SZiyue-Zhang decodedInst.numWB := 1.U 785deb6421eSHaojin Tang 786*499d2763SZiyue Zhang val isZimop = (BitPat("b1?00??0111??_?????_100_?????_1110011") === ctrl_flow.instr) || 787*499d2763SZiyue Zhang (BitPat("b1?00??1?????_?????_100_?????_1110011") === ctrl_flow.instr) 788*499d2763SZiyue Zhang 78973c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 790*499d2763SZiyue Zhang // temp decode zimop as move 791*499d2763SZiyue Zhang decodedInst.isMove := (isMove || isZimop) && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep 79273c4359eSYikeZhou 79349a2cda2SXuan Hu // fmadd - b1000011 79449a2cda2SXuan Hu // fmsub - b1000111 79549a2cda2SXuan Hu // fnmsub- b1001011 79649a2cda2SXuan Hu // fnmadd- b1001111 79749a2cda2SXuan Hu private val isFMA = inst.OPCODE === BitPat("b100??11") 798e8b68a8eSgood-circle private val isVppu = FuType.isVppu(decodedInst.fuType) 799e8b68a8eSgood-circle private val isVecOPF = FuType.isVecOPF(decodedInst.fuType) 80049a2cda2SXuan Hu 801178dd38cSYikeZhou // read src1~3 location 80298cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 80398cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 80449a2cda2SXuan Hu // src(2) of fma is fs3, src(2) of vector inst is old vd 80549a2cda2SXuan Hu decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD) 8069c5a1080Sxiaofeibao decodedInst.lsrc(3) := V0_IDX.U 8079c5a1080Sxiaofeibao decodedInst.lsrc(4) := Vl_IDX.U 808b6b11f60SXuan Hu 809178dd38cSYikeZhou // read dest location 81098cfe81bSxgkiri decodedInst.ldest := inst.RD 8114d24c305SYikeZhou 812e4e68f86Sxiaofeibao // init v0Wen vlWen 813e4e68f86Sxiaofeibao decodedInst.v0Wen := false.B 814e4e68f86Sxiaofeibao decodedInst.vlWen := false.B 815e4e68f86Sxiaofeibao 816c2a8ae00SYikeZhou // fill in exception vector 817567f0269Ssinsanction val vecException = Module(new VecExceptionGen) 818567f0269Ssinsanction vecException.io.inst := io.enq.ctrlFlow.instr 819567f0269Ssinsanction vecException.io.decodedInst := decodedInst 820bdda74fdSxiaofeibao-xjtu vecException.io.vtype := decodedInst.vpu.vtype 8215110577fSZiyue Zhang vecException.io.vstart := decodedInst.vpu.vstart 8224d24c305SYikeZhou 82315ed99a7SXuan Hu private val exceptionII = 82415ed99a7SXuan Hu decodedInst.selImm === SelImm.INVALID_INSTR || 82515ed99a7SXuan Hu vecException.io.illegalInst || 82615ed99a7SXuan Hu io.fromCSR.illegalInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 82715ed99a7SXuan Hu io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 82815ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g || 82915ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v || 83015ed99a7SXuan Hu io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 8318b7dc6f5SsinceforYy io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 8328b7dc6f5SsinceforYy io.fromCSR.illegalInst.fsIsOff && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) || 8338b7dc6f5SsinceforYy (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) || 834d60bfe5aSsinceforYy FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) || 835d60bfe5aSsinceforYy isVecOPF) || 836b50a88ecSXuan Hu io.fromCSR.illegalInst.vsIsOff && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) || 837689f6b88SsinceforYy io.fromCSR.illegalInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) || 838689f6b88SsinceforYy (decodedInst.needFrm.scalaNeedFrm || FuType.isScalaNeedFrm(decodedInst.fuType)) && (((decodedInst.fpu.rm === 5.U) || (decodedInst.fpu.rm === 6.U)) || ((decodedInst.fpu.rm === 7.U) && io.fromCSR.illegalInst.frm)) || 839689f6b88SsinceforYy (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm 84015ed99a7SXuan Hu 84115ed99a7SXuan Hu private val exceptionVI = 84215ed99a7SXuan Hu io.fromCSR.virtualInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 84315ed99a7SXuan Hu io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 84415ed99a7SXuan Hu io.fromCSR.virtualInst.hfence && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) || 84515ed99a7SXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 846b50a88ecSXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 847b50a88ecSXuan Hu io.fromCSR.virtualInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) 84815ed99a7SXuan Hu 8495a9dd560SXuan Hu decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II) 85015ed99a7SXuan Hu decodedInst.exceptionVec(virtualInstr) := exceptionVI 851d0de7e4aSpeixiaokun 8527e0f64b0SGuanghui Cheng //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry. 8537e0f64b0SGuanghui Cheng decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger) 8547e0f64b0SGuanghui Cheng 8553b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 856b0ae3ac4SLinJiawei x => { 8577ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 858b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 859b0ae3ac4SLinJiawei x._1 -> minBits 860b0ae3ac4SLinJiawei } 861b0ae3ac4SLinJiawei )) 862aac4464eSYinan Xu 8637531c765SXuan Hu private val isLs = FuType.isLoadStore(decodedInst.fuType) 8647531c765SXuan Hu private val isVls = FuType.isVls(decodedInst.fuType) 8657531c765SXuan Hu private val isStore = FuType.isStore(decodedInst.fuType) 8667531c765SXuan Hu private val isAMO = FuType.isAMO(decodedInst.fuType) 8677531c765SXuan Hu private val isVStore = FuType.isVStore(decodedInst.fuType) 8687531c765SXuan Hu private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType) 8697531c765SXuan Hu 8707531c765SXuan Hu decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch) 87175e2c883SXuan Hu 87275e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 873be25371aSYikeZhou 8740bca6cb3SZiyue Zhang private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S) 87539c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 87639c388b5SXuan Hu private val narrowInsts = Seq( 87739c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 87839c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 87939c388b5SXuan Hu ) 88039c388b5SXuan Hu private val maskDstInsts = Seq( 88139c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 88239c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 88339c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 8849eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 8859eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 8869eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 8879eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 888f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 88939c388b5SXuan Hu ) 89030fcc710SZiyue Zhang private val maskOpInsts = Seq( 89130fcc710SZiyue Zhang VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 89230fcc710SZiyue Zhang ) 89394e6af68SZiyue-Zhang private val vmaInsts = Seq( 89494e6af68SZiyue-Zhang VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX, 89594e6af68SZiyue-Zhang VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX, 89694e6af68SZiyue-Zhang ) 897bdda74fdSxiaofeibao-xjtu private val wfflagsInsts = Seq( 898bdda74fdSxiaofeibao-xjtu // opfff 899bdda74fdSxiaofeibao-xjtu FADD_S, FSUB_S, FADD_D, FSUB_D, 900bdda74fdSxiaofeibao-xjtu FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, 901bdda74fdSxiaofeibao-xjtu FMIN_S, FMAX_S, FMIN_D, FMAX_D, 902bdda74fdSxiaofeibao-xjtu FMUL_S, FMUL_D, 903bdda74fdSxiaofeibao-xjtu FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, 904bdda74fdSxiaofeibao-xjtu FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, 905bdda74fdSxiaofeibao-xjtu FSGNJ_S, FSGNJN_S, FSGNJX_S, 906bdda74fdSxiaofeibao-xjtu // opfvv 907bdda74fdSxiaofeibao-xjtu VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV, 908bdda74fdSxiaofeibao-xjtu VFMUL_VV, VFDIV_VV, VFWMUL_VV, 909bdda74fdSxiaofeibao-xjtu VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV, 910bdda74fdSxiaofeibao-xjtu VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV, 911bdda74fdSxiaofeibao-xjtu VFSQRT_V, 912bdda74fdSxiaofeibao-xjtu VFMIN_VV, VFMAX_VV, 913bdda74fdSxiaofeibao-xjtu VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV, 914bdda74fdSxiaofeibao-xjtu VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV, 915bdda74fdSxiaofeibao-xjtu // opfvf 916bdda74fdSxiaofeibao-xjtu VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF, 917bdda74fdSxiaofeibao-xjtu VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF, 918bdda74fdSxiaofeibao-xjtu VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF, 919bdda74fdSxiaofeibao-xjtu VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF, 920bdda74fdSxiaofeibao-xjtu VFMIN_VF, VFMAX_VF, 921bdda74fdSxiaofeibao-xjtu VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF, 922bdda74fdSxiaofeibao-xjtu VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF, 923aab8ef9cSxiaofeibao-xjtu // vfred 924aab8ef9cSxiaofeibao-xjtu VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS, 925bdda74fdSxiaofeibao-xjtu // fcvt & vfcvt 926bdda74fdSxiaofeibao-xjtu FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU, 927bdda74fdSxiaofeibao-xjtu FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 928bdda74fdSxiaofeibao-xjtu FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU, 929bdda74fdSxiaofeibao-xjtu FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 930b189aafaSzmx FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H, 931ba899681Schengguanghui 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, 932ba899681Schengguanghui 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, 933ba899681Schengguanghui 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, 934ba899681Schengguanghui VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V, 935bdda74fdSxiaofeibao-xjtu ) 936689f6b88SsinceforYy 937689f6b88SsinceforYy private val scalaNeedFrmInsts = Seq( 938689f6b88SsinceforYy FADD_S, FSUB_S, FADD_D, FSUB_D, 939689f6b88SsinceforYy FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 940689f6b88SsinceforYy FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 941689f6b88SsinceforYy ) 942689f6b88SsinceforYy 943689f6b88SsinceforYy private val vectorNeedFrmInsts = Seq ( 944689f6b88SsinceforYy VFSLIDE1UP_VF, VFSLIDE1DOWN_VF, 945689f6b88SsinceforYy ) 946689f6b88SsinceforYy 947bdda74fdSxiaofeibao-xjtu decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _) 948689f6b88SsinceforYy decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 949689f6b88SsinceforYy decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 950bdda74fdSxiaofeibao-xjtu val fpToVecDecoder = Module(new FPToVecDecoder()) 951bdda74fdSxiaofeibao-xjtu fpToVecDecoder.io.instr := inst.asUInt 952bdda74fdSxiaofeibao-xjtu val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst 9533b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 954bdda74fdSxiaofeibao-xjtu when(isFpToVecInst){ 955bdda74fdSxiaofeibao-xjtu decodedInst.vpu := fpToVecDecoder.io.vpuCtrl 956bdda74fdSxiaofeibao-xjtu }.otherwise{ 95775e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 95875e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 95975e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 96075e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 96175e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 96275e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 96375e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 964d9355d3aSZiyue-Zhang decodedInst.vpu.veew := inst.WIDTH 96594e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 96639c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 967b6279fc6SZiyue Zhang val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _) 968b6279fc6SZiyue Zhang val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 969b6279fc6SZiyue Zhang val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _) 970b6279fc6SZiyue Zhang val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe 971dab1ad8cSsinsanction val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse 972dab1ad8cSsinsanction val isVlm = decodedInst.fuOpType === VlduType.vlm 973d8ceb649SZiyue Zhang val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV 97494e6af68SZiyue-Zhang val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _) 975dab1ad8cSsinsanction val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew 976b6279fc6SZiyue Zhang decodedInst.vpu.isNarrow := isNarrow 977b6279fc6SZiyue Zhang decodedInst.vpu.isDstMask := isDstMask 978b6279fc6SZiyue Zhang decodedInst.vpu.isOpMask := isOpMask 97994e6af68SZiyue-Zhang decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma 980dab1ad8cSsinsanction decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac 9815110577fSZiyue Zhang decodedInst.vpu.vstart := io.enq.vstart 982bdda74fdSxiaofeibao-xjtu } 98306f0a37aSZiyue Zhang decodedInst.vpu.specVill := io.enq.vtype.illegal 98406f0a37aSZiyue Zhang decodedInst.vpu.specVma := io.enq.vtype.vma 98506f0a37aSZiyue Zhang decodedInst.vpu.specVta := io.enq.vtype.vta 98606f0a37aSZiyue Zhang decodedInst.vpu.specVsew := io.enq.vtype.vsew 98706f0a37aSZiyue Zhang decodedInst.vpu.specVlmul := io.enq.vtype.vlmul 98875e2c883SXuan Hu 98931c51290Szhanglinjuan decodedInst.vlsInstr := isVls 99031c51290Szhanglinjuan 9916d56ac16Ssinsanction decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src 9926d56ac16Ssinsanction decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig 9936d56ac16Ssinsanction 9947f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 99587dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 99687dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 99706cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 99887dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 9990a34fc22SZiyue Zhang uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0) 1000c4501a6fSZiyue-Zhang uopInfoGen.io.in.preInfo.nf := inst.NF 100106cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr 1002c90e3eacSZiyue Zhang uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm 10037f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 1004ddc88dadSxiaofeibao // numOfUop should be 1 when vector instruction is illegalInst 1005ddc88dadSxiaofeibao io.deq.uopInfo.numOfUop := Mux(vecException.io.illegalInst, 1.U, uopInfoGen.io.out.uopInfo.numOfUop) 10063235a9d8SZiyue-Zhang io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB 10077f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 10087f9f0a79SzhanglyGit 1009cc1eb70dSXuan Hu val isCSR = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U 1010cc1eb70dSXuan Hu val isCSRR = isCSR && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U 1011cc1eb70dSXuan Hu val isCSRW = isCSR && inst.FUNCT3 === BitPat("b?10") && inst.RD === 0.U 1012cc1eb70dSXuan Hu dontTouch(isCSRR) 1013cc1eb70dSXuan Hu dontTouch(isCSRW) 1014cc1eb70dSXuan Hu 101587c5d21dSZiyue Zhang // for csrr vl instruction, convert to vsetvl 1016cc1eb70dSXuan Hu val isCsrrVlenb = isCSRR && inst.CSRIDX === CSRs.vlenb.U 1017cc1eb70dSXuan Hu val isCsrrVl = isCSRR && inst.CSRIDX === CSRs.vl.U 1018cc1eb70dSXuan Hu 1019ac17908cSHuijin Li // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i) 1020ac17908cSHuijin Li val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U 1021ac17908cSHuijin Li val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W) 1022ac17908cSHuijin Li val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W) 1023ac17908cSHuijin Li val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W) 1024ac17908cSHuijin Li 102587c5d21dSZiyue Zhang when (isCsrrVl) { 102663cb3754SZiyue Zhang // convert to vsetvl instruction 102787c5d21dSZiyue Zhang decodedInst.srcType(0) := SrcType.no 102887c5d21dSZiyue Zhang decodedInst.srcType(1) := SrcType.no 102987c5d21dSZiyue Zhang decodedInst.srcType(2) := SrcType.no 103087c5d21dSZiyue Zhang decodedInst.srcType(3) := SrcType.no 103187c5d21dSZiyue Zhang decodedInst.srcType(4) := SrcType.vp 103287c5d21dSZiyue Zhang decodedInst.lsrc(4) := Vl_IDX.U 103363cb3754SZiyue Zhang decodedInst.waitForward := false.B 103487c5d21dSZiyue Zhang decodedInst.blockBackward := false.B 10358c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 103663cb3754SZiyue Zhang }.elsewhen (isCsrrVlenb) { 103763cb3754SZiyue Zhang // convert to addi instruction 1038828a8a48SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 1039828a8a48SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 104063cb3754SZiyue Zhang decodedInst.srcType(2) := SrcType.no 104163cb3754SZiyue Zhang decodedInst.srcType(3) := SrcType.no 104263cb3754SZiyue Zhang decodedInst.srcType(4) := SrcType.no 104363cb3754SZiyue Zhang decodedInst.selImm := SelImm.IMM_I 104463cb3754SZiyue Zhang decodedInst.waitForward := false.B 104563cb3754SZiyue Zhang decodedInst.blockBackward := false.B 104663cb3754SZiyue Zhang decodedInst.canRobCompress := true.B 10478c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 1048ac17908cSHuijin Li }.elsewhen (isPreW || isPreR || isPreI) { 1049ac17908cSHuijin Li decodedInst.selImm := SelImm.IMM_S 1050ac17908cSHuijin Li decodedInst.fuType := FuType.ldu.U 1051ac17908cSHuijin Li decodedInst.canRobCompress := false.B 1052ac17908cSHuijin Li decodedInst.fuOpType := Mux1H(Seq( 1053ac17908cSHuijin Li isPreW -> LSUOpType.prefetch_w, 1054ac17908cSHuijin Li isPreR -> LSUOpType.prefetch_r, 1055ac17908cSHuijin Li isPreI -> LSUOpType.prefetch_i, 1056ac17908cSHuijin Li )) 1057*499d2763SZiyue Zhang }.elsewhen (isZimop) { 1058*499d2763SZiyue Zhang // set srcType for zimop 1059*499d2763SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 1060*499d2763SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 1061*499d2763SZiyue Zhang // use x0 as src1 1062*499d2763SZiyue Zhang decodedInst.lsrc(0) := 0.U 106387c5d21dSZiyue Zhang } 106487c5d21dSZiyue Zhang 106575e2c883SXuan Hu io.deq.decodedInst := decodedInst 10669faa51afSxiaofeibao-xjtu io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen 1067985804e6SXuan Hu io.deq.decodedInst.fuType := Mux1H(Seq( 1068cc1eb70dSXuan Hu // keep condition 1069cc1eb70dSXuan Hu (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType, 107087c5d21dSZiyue Zhang (isCsrrVl) -> FuType.vsetfwf.U, 107163cb3754SZiyue Zhang (isCsrrVlenb) -> FuType.alu.U, 1072cc1eb70dSXuan Hu 1073cc1eb70dSXuan Hu // change vlsu to vseglsu when NF =/= 0.U 1074f94f6503SXuan 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, 1075f94f6503SXuan Hu // MOP === b00 && SUMOP === b01000: unit-stride whole register store 1076f94f6503SXuan Hu // MOP =/= b00 : strided and indexed store 1077f94f6503SXuan 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, 1078f94f6503SXuan Hu // MOP === b00 && LUMOP === b01000: unit-stride whole register load 1079f94f6503SXuan Hu // MOP =/= b00 : strided and indexed load 1080f94f6503SXuan 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, 1081985804e6SXuan Hu )) 1082*499d2763SZiyue Zhang io.deq.decodedInst.imm := MuxCase(decodedInst.imm, Seq( 1083*499d2763SZiyue Zhang isCsrrVlenb -> (VLEN / 8).U, 1084*499d2763SZiyue Zhang isZimop -> 0.U, 1085*499d2763SZiyue Zhang )) 1086cc1eb70dSXuan Hu 10874fe0a83eSXuan Hu io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq( 1088cc1eb70dSXuan Hu isCsrrVl -> VSETOpType.csrrvl, 1089cc1eb70dSXuan Hu isCsrrVlenb -> ALUOpType.add, 10904fe0a83eSXuan Hu )) 10914fe0a83eSXuan Hu 10924fe0a83eSXuan Hu io.deq.decodedInst.blockBackward := MuxCase(decodedInst.blockBackward, Seq( 10934fe0a83eSXuan Hu isCSRR -> false.B, 1094cc1eb70dSXuan Hu )) 1095be25371aSYikeZhou //------------------------------------------------------------- 1096be25371aSYikeZhou // Debug Info 10973b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 10983b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 10993b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 11003b739f49SXuan 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", 11013b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 11023b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 11033b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 11043b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 11053b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 11063b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 11073b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 11083b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 1109be25371aSYikeZhou} 1110