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._ 277e0f64b0SGuanghui Chengimport xiangshan.ExceptionNO.{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 35be25371aSYikeZhou 36be25371aSYikeZhou/** 37be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/ 38be25371aSYikeZhou */ 39be25371aSYikeZhouabstract trait DecodeConstants { 40361e6d51SJiuyang Liu // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt. 4157a10886SXuan Hu def X = BitPat("b0") 424d24c305SYikeZhou def N = BitPat("b0") 434d24c305SYikeZhou def Y = BitPat("b1") 4457a10886SXuan Hu def T = true 4557a10886SXuan Hu def F = false 464d24c305SYikeZhou 47c2a8ae00SYikeZhou def decodeDefault: List[BitPat] = // illegal instruction 4820e31bd1SYinan Xu // srcType(0) srcType(1) srcType(2) fuType fuOpType rfWen 494d24c305SYikeZhou // | | | | | | fpWen 5057a10886SXuan Hu // | | | | | | | vecWen 5157a10886SXuan Hu // | | | | | | | | isXSTrap 5257a10886SXuan Hu // | | | | | | | | | noSpecExec 5357a10886SXuan Hu // | | | | | | | | | | blockBackward 5457a10886SXuan Hu // | | | | | | | | | | | flushPipe 5589cc69c1STang Haojin // | | | | | | | | | | | | canRobCompress 5689cc69c1STang Haojin // | | | | | | | | | | | | | uopSplitType 5789cc69c1STang Haojin // | | | | | | | | | | | | | | selImm 5889cc69c1STang Haojin List(SrcType.X, SrcType.X, SrcType.X, FuType.X, FuOpType.X, N, N, N, N, N, N, N, N, UopSplitType.X, SelImm.INVALID_INSTR) // Use SelImm to indicate invalid instr 594d24c305SYikeZhou 6057a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] 6157a10886SXuan Hu final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate())) 62be25371aSYikeZhou} 63be25371aSYikeZhou 64c2a8ae00SYikeZhoutrait DecodeUnitConstants 654d24c305SYikeZhou{ 664d24c305SYikeZhou // abstract out instruction decode magic numbers 674d24c305SYikeZhou val RD_MSB = 11 684d24c305SYikeZhou val RD_LSB = 7 694d24c305SYikeZhou val RS1_MSB = 19 704d24c305SYikeZhou val RS1_LSB = 15 714d24c305SYikeZhou val RS2_MSB = 24 724d24c305SYikeZhou val RS2_LSB = 20 734d24c305SYikeZhou val RS3_MSB = 31 744d24c305SYikeZhou val RS3_LSB = 27 754d24c305SYikeZhou} 764d24c305SYikeZhou 77be25371aSYikeZhou/** 78be25371aSYikeZhou * Decoded control signals 794d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala 80be25371aSYikeZhou */ 81c2a8ae00SYikeZhou 8257a10886SXuan Huabstract class XSDecodeBase { 8357a10886SXuan Hu def X = BitPat("b?") 8457a10886SXuan Hu def N = BitPat("b0") 8557a10886SXuan Hu def Y = BitPat("b1") 8657a10886SXuan Hu def T = true 8757a10886SXuan Hu def F = false 8857a10886SXuan Hu def generate() : List[BitPat] 8957a10886SXuan Hu} 9057a10886SXuan Hu 9157a10886SXuan Hucase class XSDecode( 9257a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 93239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat, 94e2695e90SzhanglyGit uopSplitType: BitPat = UopSplitType.X, 9557a10886SXuan Hu xWen: Boolean = false, 9657a10886SXuan Hu fWen: Boolean = false, 9757a10886SXuan Hu vWen: Boolean = false, 9857a10886SXuan Hu mWen: Boolean = false, 9957a10886SXuan Hu xsTrap: Boolean = false, 10057a10886SXuan Hu noSpec: Boolean = false, 10157a10886SXuan Hu blockBack: Boolean = false, 10257a10886SXuan Hu flushPipe: Boolean = false, 10389cc69c1STang Haojin canRobCompress: Boolean = false, 10457a10886SXuan Hu) extends XSDecodeBase { 10557a10886SXuan Hu def generate() : List[BitPat] = { 10689cc69c1STang Haojin List (src1, src2, src3, BitPat(fu.U(FuType.num.W)), fuOp, xWen.B, fWen.B, (vWen || mWen).B, xsTrap.B, noSpec.B, blockBack.B, flushPipe.B, canRobCompress.B, uopSplitType, selImm) 10757a10886SXuan Hu } 10857a10886SXuan Hu} 10957a10886SXuan Hu 11057a10886SXuan Hucase class FDecode( 11157a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 112239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X, 11317ec87f2SXuan Hu uopSplitType: BitPat = UopSplitType.X, 11457a10886SXuan Hu xWen: Boolean = false, 11557a10886SXuan Hu fWen: Boolean = false, 11657a10886SXuan Hu vWen: Boolean = false, 11757a10886SXuan Hu mWen: Boolean = false, 11857a10886SXuan Hu xsTrap: Boolean = false, 11957a10886SXuan Hu noSpec: Boolean = false, 12057a10886SXuan Hu blockBack: Boolean = false, 12157a10886SXuan Hu flushPipe: Boolean = false, 12289cc69c1STang Haojin canRobCompress: Boolean = false, 12357a10886SXuan Hu) extends XSDecodeBase { 12457a10886SXuan Hu def generate() : List[BitPat] = { 12589cc69c1STang Haojin XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate() 12657a10886SXuan Hu } 12757a10886SXuan Hu} 12857a10886SXuan Hu 129be25371aSYikeZhou/** 130be25371aSYikeZhou * Overall Decode constants 131be25371aSYikeZhou */ 132be25371aSYikeZhouobject XDecode extends DecodeConstants { 13357a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 134768f5f91SYangyu Chen // RV32I 13557a10886SXuan Hu LW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw , SelImm.IMM_I, xWen = T), 13657a10886SXuan Hu LH -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh , SelImm.IMM_I, xWen = T), 13757a10886SXuan Hu LHU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T), 13857a10886SXuan Hu LB -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb , SelImm.IMM_I, xWen = T), 13957a10886SXuan Hu LBU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T), 14057a10886SXuan Hu SW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw , SelImm.IMM_S ), 14157a10886SXuan Hu SH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh , SelImm.IMM_S ), 14257a10886SXuan Hu SB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb , SelImm.IMM_S ), 14389cc69c1STang Haojin LUI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T), 14489cc69c1STang Haojin ADDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T), 14589cc69c1STang Haojin ANDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T), 14689cc69c1STang Haojin ORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or , SelImm.IMM_I, xWen = T, canRobCompress = T), 14789cc69c1STang Haojin XORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T), 14889cc69c1STang Haojin SLTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T), 14989cc69c1STang Haojin SLTIU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T), 15089cc69c1STang Haojin SLL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X , xWen = T, canRobCompress = T), 15189cc69c1STang Haojin ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X , xWen = T, canRobCompress = T), 15289cc69c1STang Haojin SUB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X , xWen = T, canRobCompress = T), 15389cc69c1STang Haojin SLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X , xWen = T, canRobCompress = T), 15489cc69c1STang Haojin SLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X , xWen = T, canRobCompress = T), 15589cc69c1STang Haojin AND -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X , xWen = T, canRobCompress = T), 15689cc69c1STang Haojin OR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or , SelImm.X , xWen = T, canRobCompress = T), 15789cc69c1STang Haojin XOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X , xWen = T, canRobCompress = T), 15889cc69c1STang Haojin SRA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X , xWen = T, canRobCompress = T), 15989cc69c1STang Haojin SRL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X , xWen = T, canRobCompress = T), 1604d24c305SYikeZhou 161768f5f91SYangyu Chen // RV64I (extend from RV32I) 162768f5f91SYangyu Chen LD -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld , SelImm.IMM_I, xWen = T), 163768f5f91SYangyu Chen LWU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T), 164768f5f91SYangyu Chen SD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd , SelImm.IMM_S ), 165768f5f91SYangyu Chen 166768f5f91SYangyu Chen SLLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T), 167768f5f91SYangyu Chen SRLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T), 168768f5f91SYangyu Chen SRAI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T), 169768f5f91SYangyu Chen 170768f5f91SYangyu Chen ADDIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T), 171768f5f91SYangyu Chen SLLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T), 172768f5f91SYangyu Chen SRAIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T), 173768f5f91SYangyu Chen SRLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T), 174768f5f91SYangyu Chen 175768f5f91SYangyu Chen ADDW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X , xWen = T, canRobCompress = T), 176768f5f91SYangyu Chen SUBW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X , xWen = T, canRobCompress = T), 177768f5f91SYangyu Chen SLLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X , xWen = T, canRobCompress = T), 178768f5f91SYangyu Chen SRAW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X , xWen = T, canRobCompress = T), 179768f5f91SYangyu Chen SRLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X , xWen = T, canRobCompress = T), 180768f5f91SYangyu Chen 181768f5f91SYangyu Chen // RV64M 18289cc69c1STang Haojin MUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul , SelImm.X, xWen = T, canRobCompress = T), 18389cc69c1STang Haojin MULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh , SelImm.X, xWen = T, canRobCompress = T), 18489cc69c1STang Haojin MULHU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T), 18589cc69c1STang Haojin MULHSU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T), 18689cc69c1STang Haojin MULW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw , SelImm.X, xWen = T, canRobCompress = T), 1874d24c305SYikeZhou 18889cc69c1STang Haojin DIV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div , SelImm.X, xWen = T, canRobCompress = T), 18989cc69c1STang Haojin DIVU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu , SelImm.X, xWen = T, canRobCompress = T), 19089cc69c1STang Haojin REM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem , SelImm.X, xWen = T, canRobCompress = T), 19189cc69c1STang Haojin REMU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu , SelImm.X, xWen = T, canRobCompress = T), 19289cc69c1STang Haojin DIVW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw , SelImm.X, xWen = T, canRobCompress = T), 19389cc69c1STang Haojin DIVUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T), 19489cc69c1STang Haojin REMW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw , SelImm.X, xWen = T, canRobCompress = T), 19589cc69c1STang Haojin REMUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T), 1964d24c305SYikeZhou 197f7af4c74Schengguanghui AUIPC -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T), 19857a10886SXuan Hu JAL -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal , SelImm.IMM_UJ, xWen = T), 1995110577fSZiyue Zhang JALR -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T), 2003b739f49SXuan Hu BEQ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq , SelImm.IMM_SB ), 2013b739f49SXuan Hu BNE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne , SelImm.IMM_SB ), 2023b739f49SXuan Hu BGE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge , SelImm.IMM_SB ), 2033b739f49SXuan Hu BGEU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu , SelImm.IMM_SB ), 2043b739f49SXuan Hu BLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt , SelImm.IMM_SB ), 2053b739f49SXuan Hu BLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu , SelImm.IMM_SB ), 2064d24c305SYikeZhou 207768f5f91SYangyu Chen // System, the immediate12 holds the CSR register. 20840ac5bb1SXuan Hu 209fa16cf81Slewislzh CSRRW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 210fa16cf81Slewislzh CSRRS -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 211fa16cf81Slewislzh CSRRC -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2124d24c305SYikeZhou 21357a10886SXuan Hu CSRRWI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21457a10886SXuan Hu CSRRSI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21557a10886SXuan Hu CSRRCI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2164d24c305SYikeZhou 21757a10886SXuan Hu EBREAK -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21857a10886SXuan Hu ECALL -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21957a10886SXuan Hu SRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22057a10886SXuan Hu MRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22157a10886SXuan Hu DRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22257a10886SXuan Hu WFI -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X , xWen = T, noSpec = T, blockBack = T), 2234d24c305SYikeZhou 22457a10886SXuan Hu SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22557a10886SXuan Hu FENCE_I -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22657a10886SXuan Hu FENCE -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 2274d24c305SYikeZhou 228768f5f91SYangyu Chen // RV64A 22957a10886SXuan Hu AMOADD_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23057a10886SXuan Hu AMOXOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23157a10886SXuan Hu AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23257a10886SXuan Hu AMOAND_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23357a10886SXuan Hu AMOOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23457a10886SXuan Hu AMOMIN_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23557a10886SXuan Hu AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23657a10886SXuan Hu AMOMAX_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23757a10886SXuan Hu AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2384d24c305SYikeZhou 23957a10886SXuan Hu AMOADD_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24057a10886SXuan Hu AMOXOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24157a10886SXuan Hu AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24257a10886SXuan Hu AMOAND_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24357a10886SXuan Hu AMOOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24457a10886SXuan Hu AMOMIN_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24557a10886SXuan Hu AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24657a10886SXuan Hu AMOMAX_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24757a10886SXuan Hu AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2484d24c305SYikeZhou 24957a10886SXuan Hu LR_W -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25057a10886SXuan Hu LR_D -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25157a10886SXuan Hu SC_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25257a10886SXuan Hu SC_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 253768f5f91SYangyu Chen ) 254768f5f91SYangyu Chen} 255ee8ff153Szfw 256768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{ 257768f5f91SYangyu Chen /* 258768f5f91SYangyu Chen Note: Some Bitmanip instruction may have different OP code between rv32 and rv64. 259768f5f91SYangyu Chen Including pseudo instruction like zext.h, and different funct12 like rev8. 260768f5f91SYangyu Chen If some day we need to support change XLEN via CSR, we should care about this. 261768f5f91SYangyu Chen */ 262768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 263768f5f91SYangyu Chen // Zba 264768f5f91SYangyu Chen ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T, canRobCompress = T), 265768f5f91SYangyu Chen SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T, canRobCompress = T), 266768f5f91SYangyu Chen SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T, canRobCompress = T), 267768f5f91SYangyu Chen SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T, canRobCompress = T), 268768f5f91SYangyu Chen SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T, canRobCompress = T), 269768f5f91SYangyu Chen SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T, canRobCompress = T), 270768f5f91SYangyu Chen SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T, canRobCompress = T), 271768f5f91SYangyu Chen SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T, canRobCompress = T), 272768f5f91SYangyu Chen 273768f5f91SYangyu Chen // Zbb 27489cc69c1STang Haojin ANDN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn , SelImm.X , xWen = T, canRobCompress = T), 27589cc69c1STang Haojin ORN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X , xWen = T, canRobCompress = T), 27689cc69c1STang Haojin XNOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor , SelImm.X , xWen = T, canRobCompress = T), 277ee8ff153Szfw 278768f5f91SYangyu Chen CLZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz , SelImm.X , xWen = T, canRobCompress = T), 279768f5f91SYangyu Chen CLZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw , SelImm.X , xWen = T, canRobCompress = T), 280768f5f91SYangyu Chen CTZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz , SelImm.X , xWen = T, canRobCompress = T), 281768f5f91SYangyu Chen CTZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw , SelImm.X , xWen = T, canRobCompress = T), 282768f5f91SYangyu Chen 283768f5f91SYangyu Chen CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop , SelImm.X , xWen = T, canRobCompress = T), 284768f5f91SYangyu Chen CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw , SelImm.X , xWen = T, canRobCompress = T), 285768f5f91SYangyu Chen 28689cc69c1STang Haojin MAX -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X , xWen = T, canRobCompress = T), 28789cc69c1STang Haojin MAXU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu , SelImm.X , xWen = T, canRobCompress = T), 288768f5f91SYangyu Chen MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X , xWen = T, canRobCompress = T), 289768f5f91SYangyu Chen MINU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu , SelImm.X , xWen = T, canRobCompress = T), 290ee8ff153Szfw 29189cc69c1STang Haojin SEXT_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sextb , SelImm.X , xWen = T, canRobCompress = T), 29289cc69c1STang Haojin SEXT_H -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sexth , SelImm.X , xWen = T, canRobCompress = T), 293768f5f91SYangyu Chen // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0. 294768f5f91SYangyu Chen // If we configured to have no Zbkb, we should add zext.h here. 295ee8ff153Szfw 296768f5f91SYangyu Chen ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol , SelImm.X , xWen = T, canRobCompress = T), 297768f5f91SYangyu Chen ROLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw , SelImm.X , xWen = T, canRobCompress = T), 29889cc69c1STang Haojin ROR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.X , xWen = T, canRobCompress = T), 29989cc69c1STang Haojin RORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.IMM_I, xWen = T, canRobCompress = T), 300768f5f91SYangyu Chen RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.IMM_I, xWen = T, canRobCompress = T), 301768f5f91SYangyu Chen RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.X , xWen = T, canRobCompress = T), 302ee8ff153Szfw 303768f5f91SYangyu Chen ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb , SelImm.X , xWen = T, canRobCompress = T), 304768f5f91SYangyu Chen 305768f5f91SYangyu Chen REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X , xWen = T, canRobCompress = T), 306768f5f91SYangyu Chen 307768f5f91SYangyu Chen // Zbc 308768f5f91SYangyu Chen CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul , SelImm.X , xWen = T, canRobCompress = T), 309768f5f91SYangyu Chen CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh , SelImm.X , xWen = T, canRobCompress = T), 310768f5f91SYangyu Chen CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr , SelImm.X , xWen = T, canRobCompress = T), 311768f5f91SYangyu Chen 312768f5f91SYangyu Chen // Zbs 313768f5f91SYangyu Chen BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.X , xWen = T, canRobCompress = T), 314768f5f91SYangyu Chen BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.IMM_I, xWen = T, canRobCompress = T), 315768f5f91SYangyu Chen BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.X , xWen = T, canRobCompress = T), 316768f5f91SYangyu Chen BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.IMM_I, xWen = T, canRobCompress = T), 317768f5f91SYangyu Chen BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.X , xWen = T, canRobCompress = T), 318768f5f91SYangyu Chen BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.IMM_I, xWen = T, canRobCompress = T), 319768f5f91SYangyu Chen BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.X , xWen = T, canRobCompress = T), 320768f5f91SYangyu Chen BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.IMM_I, xWen = T, canRobCompress = T), 321768f5f91SYangyu Chen 322768f5f91SYangyu Chen // Zbkb 323768f5f91SYangyu Chen // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb 324768f5f91SYangyu Chen PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X , xWen = T, canRobCompress = T), 325768f5f91SYangyu Chen PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh , SelImm.X , xWen = T, canRobCompress = T), 326768f5f91SYangyu Chen PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw , SelImm.X , xWen = T, canRobCompress = T), 327768f5f91SYangyu Chen BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X , xWen = T, canRobCompress = T), 328768f5f91SYangyu Chen // If configured to RV32, we should add zip and unzip. 329768f5f91SYangyu Chen 330768f5f91SYangyu Chen // Zbkc 331768f5f91SYangyu Chen // clmul, clmulh is in Zbc 332768f5f91SYangyu Chen 333768f5f91SYangyu Chen // Zbkx 334768f5f91SYangyu Chen XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn , SelImm.X , xWen = T, canRobCompress = T), 335768f5f91SYangyu Chen XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb , SelImm.X , xWen = T, canRobCompress = T), 336768f5f91SYangyu Chen ) 337768f5f91SYangyu Chen} 338768f5f91SYangyu Chen 339768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants { 340768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 341768f5f91SYangyu Chen // Zknd: NIST Suite: AES Decryption 342768f5f91SYangyu Chen AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds , SelImm.X , xWen = T, canRobCompress = T), 343768f5f91SYangyu Chen AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm , SelImm.X , xWen = T, canRobCompress = T), 344768f5f91SYangyu Chen AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im , SelImm.X , xWen = T, canRobCompress = T), 345768f5f91SYangyu Chen AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T), 346768f5f91SYangyu Chen AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2 , SelImm.X , xWen = T, canRobCompress = T), 347768f5f91SYangyu Chen 348768f5f91SYangyu Chen // Zkne: NIST Suite: AES Encryption 349768f5f91SYangyu Chen // aes64ks1i, aes64ks2 is in Zknd 350768f5f91SYangyu Chen AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es , SelImm.X , xWen = T, canRobCompress = T), 351768f5f91SYangyu Chen AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm , SelImm.X , xWen = T, canRobCompress = T), 352768f5f91SYangyu Chen 353768f5f91SYangyu Chen // Zknh: NIST Suite: Hash Function Instructions 354768f5f91SYangyu Chen SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T, canRobCompress = T), 355768f5f91SYangyu Chen SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T, canRobCompress = T), 356768f5f91SYangyu Chen SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T, canRobCompress = T), 357768f5f91SYangyu Chen SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T, canRobCompress = T), 358768f5f91SYangyu Chen SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T, canRobCompress = T), 359768f5f91SYangyu Chen SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T, canRobCompress = T), 360768f5f91SYangyu Chen SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T, canRobCompress = T), 361768f5f91SYangyu Chen SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T, canRobCompress = T), 362768f5f91SYangyu Chen 363768f5f91SYangyu Chen // Zksed: ShangMi Suite: SM4 Block Cipher Instructions 364768f5f91SYangyu Chen SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0 , SelImm.X , xWen = T, canRobCompress = T), 365768f5f91SYangyu Chen SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1 , SelImm.X , xWen = T, canRobCompress = T), 366768f5f91SYangyu Chen SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2 , SelImm.X , xWen = T, canRobCompress = T), 367768f5f91SYangyu Chen SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3 , SelImm.X , xWen = T, canRobCompress = T), 368768f5f91SYangyu Chen SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0 , SelImm.X , xWen = T, canRobCompress = T), 369768f5f91SYangyu Chen SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1 , SelImm.X , xWen = T, canRobCompress = T), 370768f5f91SYangyu Chen SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2 , SelImm.X , xWen = T, canRobCompress = T), 371768f5f91SYangyu Chen SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3 , SelImm.X , xWen = T, canRobCompress = T), 372768f5f91SYangyu Chen 373768f5f91SYangyu Chen // Zksh: ShangMi Suite: SM3 Hash Function Instructions 374768f5f91SYangyu Chen SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0 , SelImm.X , xWen = T, canRobCompress = T), 375768f5f91SYangyu Chen SM3P1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p1 , SelImm.X , xWen = T, canRobCompress = T), 3764d24c305SYikeZhou ) 377be25371aSYikeZhou} 378be25371aSYikeZhou 379be25371aSYikeZhou/** 380be25371aSYikeZhou * FP Decode constants 381be25371aSYikeZhou */ 38257a10886SXuan Huobject FpDecode extends DecodeConstants{ 38357a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 384b189aafaSzmx FLH -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T), 38557a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 38657a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 387b189aafaSzmx FSH -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S ), 38857a10886SXuan Hu FSW -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S ), 38957a10886SXuan Hu FSD -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S ), 3904d24c305SYikeZhou 391964d9a87SZiyue Zhang FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T), 392964d9a87SZiyue Zhang FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T), 393b189aafaSzmx FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T), 394c2a8ae00SYikeZhou 3954d24c305SYikeZhou // Int to FP 39689cc69c1STang Haojin FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39789cc69c1STang Haojin FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39889cc69c1STang Haojin FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39989cc69c1STang Haojin FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4004d24c305SYikeZhou 40189cc69c1STang Haojin FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40289cc69c1STang Haojin FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40389cc69c1STang Haojin FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40489cc69c1STang Haojin FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4054d24c305SYikeZhou 4064d24c305SYikeZhou ) 407be25371aSYikeZhou} 408be25371aSYikeZhou 409be25371aSYikeZhou/** 410be25371aSYikeZhou * FP Divide SquareRoot Constants 411be25371aSYikeZhou */ 412be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 41357a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 41489cc69c1STang Haojin FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41589cc69c1STang Haojin FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41689cc69c1STang Haojin FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41789cc69c1STang Haojin FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 4184d24c305SYikeZhou ) 419be25371aSYikeZhou} 420be25371aSYikeZhou 4214d24c305SYikeZhou/** 422af2f7849Shappy-lx * Svinval extension Constants 423af2f7849Shappy-lx */ 424af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 42557a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 426af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 427af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 428af2f7849Shappy-lx */ 42957a10886SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X), 430af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 431af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 432af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 433af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 434af2f7849Shappy-lx */ 43557a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 436af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 437af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 438af2f7849Shappy-lx * then dispatch and issue this instrucion 439af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 440af2f7849Shappy-lx */ 44157a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 442af2f7849Shappy-lx /* what is Svinval extension ? 443af2f7849Shappy-lx * -----> sfecne.w.inval 444af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 445af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 446af2f7849Shappy-lx * -----> sfecne.inval.ir 447af2f7849Shappy-lx * 448af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 449af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 450af2f7849Shappy-lx */ 451af2f7849Shappy-lx ) 452af2f7849Shappy-lx} 45357a10886SXuan Hu 454af2f7849Shappy-lx/* 455ca18a0b4SWilliam Wang * CBO decode 456ca18a0b4SWilliam Wang */ 457ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 45857a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 45957a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 46057a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 46157a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 46257a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 463ca18a0b4SWilliam Wang ) 464ca18a0b4SWilliam Wang} 465ca18a0b4SWilliam Wang 466d0de7e4aSpeixiaokun/* 467d0de7e4aSpeixiaokun * Hypervisor decode 468d0de7e4aSpeixiaokun */ 469d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants { 470e25e4d90SXuan Hu override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 471e25e4d90SXuan Hu HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 472e25e4d90SXuan Hu HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 473e25e4d90SXuan Hu HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X), 474e25e4d90SXuan Hu HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X), 475e25e4d90SXuan Hu HLV_B -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvb, SelImm.X, xWen = T), 476e25e4d90SXuan Hu HLV_BU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvbu, SelImm.X, xWen = T), 477e25e4d90SXuan Hu HLV_D -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvd, SelImm.X, xWen = T), 478e25e4d90SXuan Hu HLV_H -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvh, SelImm.X, xWen = T), 479e25e4d90SXuan Hu HLV_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvhu, SelImm.X, xWen = T), 480e25e4d90SXuan Hu HLV_W -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvw, SelImm.X, xWen = T), 481e25e4d90SXuan Hu HLV_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvwu, SelImm.X, xWen = T), 482e25e4d90SXuan Hu HLVX_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxhu, SelImm.X, xWen = T), 483e25e4d90SXuan Hu HLVX_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxwu, SelImm.X, xWen = T), 484e25e4d90SXuan Hu HSV_B -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvb, SelImm.X), 485e25e4d90SXuan Hu HSV_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvd, SelImm.X), 486e25e4d90SXuan Hu HSV_H -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvh, SelImm.X), 487e25e4d90SXuan Hu HSV_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvw, SelImm.X), 488d0de7e4aSpeixiaokun ) 489d0de7e4aSpeixiaokun} 490d0de7e4aSpeixiaokun 491545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants { 492545d7be0SYangyu Chen override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 493545d7be0SYangyu Chen CZERO_EQZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T), 494545d7be0SYangyu Chen CZERO_NEZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T), 495545d7be0SYangyu Chen ) 496545d7be0SYangyu Chen} 497545d7be0SYangyu Chen 498ca18a0b4SWilliam Wang/** 4994d24c305SYikeZhou * XiangShan Trap Decode constants 5004d24c305SYikeZhou */ 5014d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 502361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 50357a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 50457a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 5054d24c305SYikeZhou ) 5064d24c305SYikeZhou} 507be25371aSYikeZhou 50849f433deSXuan Huabstract class Imm(val len: Int) { 509b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 510b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 511b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 512b0ae3ac4SLinJiawei} 513b0ae3ac4SLinJiawei 514b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 515fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 516b0ae3ac4SLinJiawei 517b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 518b0ae3ac4SLinJiawei Cat(instr(31, 20)) 519b0ae3ac4SLinJiawei} 520b0ae3ac4SLinJiawei 521b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 522b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 523b0ae3ac4SLinJiawei 524b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 525b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 526b0ae3ac4SLinJiawei} 527b0ae3ac4SLinJiawei 528b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 529b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 530b0ae3ac4SLinJiawei 531b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 532b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 533b0ae3ac4SLinJiawei} 534b0ae3ac4SLinJiawei 535b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 536fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 537b0ae3ac4SLinJiawei 538b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 539b0ae3ac4SLinJiawei instr(31, 12) 540c2a8ae00SYikeZhou } 541c2a8ae00SYikeZhou} 542c2a8ae00SYikeZhou 543b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 544b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 545b0ae3ac4SLinJiawei 546b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 547b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 548b0ae3ac4SLinJiawei } 549b0ae3ac4SLinJiawei} 550b0ae3ac4SLinJiawei 551fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){ 552b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 553b0ae3ac4SLinJiawei 554b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 555fa16cf81Slewislzh Cat(instr(11, 7), instr(19, 15), instr(31, 20)) 556b0ae3ac4SLinJiawei } 557*92c61038SXuan Hu 558*92c61038SXuan Hu def getCSRAddr(imm: UInt): UInt = { 559*92c61038SXuan Hu require(imm.getWidth == this.len) 560*92c61038SXuan Hu imm(11, 0) 561*92c61038SXuan Hu } 562*92c61038SXuan Hu 563*92c61038SXuan Hu def getRS1(imm: UInt): UInt = { 564*92c61038SXuan Hu require(imm.getWidth == this.len) 565*92c61038SXuan Hu imm(16, 12) 566*92c61038SXuan Hu } 567*92c61038SXuan Hu 568*92c61038SXuan Hu def getRD(imm: UInt): UInt = { 569*92c61038SXuan Hu require(imm.getWidth == this.len) 570*92c61038SXuan Hu imm(21, 17) 571*92c61038SXuan Hu } 572*92c61038SXuan Hu 573*92c61038SXuan Hu def getImm5(imm: UInt): UInt = { 574*92c61038SXuan Hu require(imm.getWidth == this.len) 575*92c61038SXuan Hu imm(16, 12) 576*92c61038SXuan Hu } 577b0ae3ac4SLinJiawei} 578b0ae3ac4SLinJiawei 579ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 580ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 581ee8ff153Szfw 582ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 583ee8ff153Szfw instr(25, 20) 584ee8ff153Szfw } 585ee8ff153Szfw} 586ee8ff153Szfw 58758c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 58858c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 58958c35d23Shuxuan0307 59058c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 59158c35d23Shuxuan0307 instr(19, 15) 59258c35d23Shuxuan0307 } 59358c35d23Shuxuan0307} 594b52d4755SXuan Hu 59558c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 59658c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 59758c35d23Shuxuan0307 59858c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 59958c35d23Shuxuan0307 instr(19, 15) 60058c35d23Shuxuan0307 } 60158c35d23Shuxuan0307} 602b52d4755SXuan Hu 6034aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 6044aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6054aa9ed34Sfdy 6064aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6074aa9ed34Sfdy instr(30, 20) 6084aa9ed34Sfdy } 609e6ac7fe1SZiyue Zhang /** 610e6ac7fe1SZiyue Zhang * get VType from extended imm 611e6ac7fe1SZiyue Zhang * @param extedImm 612e6ac7fe1SZiyue Zhang * @return VType 613e6ac7fe1SZiyue Zhang */ 614e6ac7fe1SZiyue Zhang def getVType(extedImm: UInt): InstVType = { 615e6ac7fe1SZiyue Zhang val vtype = Wire(new InstVType) 616e6ac7fe1SZiyue Zhang vtype := extedImm(10, 0).asTypeOf(new InstVType) 617e6ac7fe1SZiyue Zhang vtype 618e6ac7fe1SZiyue Zhang } 6194aa9ed34Sfdy} 620b52d4755SXuan Hu 621e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){ 6224aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6234aa9ed34Sfdy 6244aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6255c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 626b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 627e6ac7fe1SZiyue Zhang val vtype8 = rvInst.ZIMM_VSETIVLI 628b52d4755SXuan Hu Cat(uimm5, vtype8) 629b52d4755SXuan Hu } 630b52d4755SXuan Hu /** 631b52d4755SXuan Hu * get VType from extended imm 632b52d4755SXuan Hu * @param extedImm 633b52d4755SXuan Hu * @return VType 634b52d4755SXuan Hu */ 635b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 636b52d4755SXuan Hu val vtype = Wire(new InstVType) 637e6ac7fe1SZiyue Zhang vtype := extedImm(9, 0).asTypeOf(new InstVType) 638b52d4755SXuan Hu vtype 639b52d4755SXuan Hu } 640b52d4755SXuan Hu 641b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 642e6ac7fe1SZiyue Zhang extedImm(14, 10) 6434aa9ed34Sfdy } 6444aa9ed34Sfdy} 645fe528fd6Ssinsanction 646fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){ 647fe528fd6Ssinsanction override def do_toImm32(minBits: UInt): UInt = minBits(31, 0) 648fe528fd6Ssinsanction 649fe528fd6Ssinsanction override def minBitsFromInstr(instr: UInt): UInt = { 650fe528fd6Ssinsanction instr(31, 0) 651fe528fd6Ssinsanction } 652fe528fd6Ssinsanction} 653fe528fd6Ssinsanction 6547e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){ 6557e30d16cSZhaoyang You override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 6567e30d16cSZhaoyang You 6577e30d16cSZhaoyang You override def minBitsFromInstr(instr: UInt): UInt = { 6587e30d16cSZhaoyang You Cat(instr(26), instr(19, 15)) 6597e30d16cSZhaoyang You } 6607e30d16cSZhaoyang You} 6617e30d16cSZhaoyang You 662b0ae3ac4SLinJiaweiobject ImmUnion { 663b0ae3ac4SLinJiawei val I = Imm_I() 664b0ae3ac4SLinJiawei val S = Imm_S() 665b0ae3ac4SLinJiawei val B = Imm_B() 666b0ae3ac4SLinJiawei val U = Imm_U() 667b0ae3ac4SLinJiawei val J = Imm_J() 668b0ae3ac4SLinJiawei val Z = Imm_Z() 669ee8ff153Szfw val B6 = Imm_B6() 67058c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 67158c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 6724aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 6734aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 674fe528fd6Ssinsanction val LUI32 = Imm_LUI32() 6757e30d16cSZhaoyang You val VRORVI = Imm_VRORVI() 6764aa9ed34Sfdy 677520f7dacSsinsanction // do not add special type lui32 to this, keep ImmUnion max len being 20. 6787e30d16cSZhaoyang You val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI) 679b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 680b0ae3ac4SLinJiawei val immSelMap = Seq( 681b0ae3ac4SLinJiawei SelImm.IMM_I, 682b0ae3ac4SLinJiawei SelImm.IMM_S, 683b0ae3ac4SLinJiawei SelImm.IMM_SB, 684b0ae3ac4SLinJiawei SelImm.IMM_U, 685b0ae3ac4SLinJiawei SelImm.IMM_UJ, 686ee8ff153Szfw SelImm.IMM_Z, 68758c35d23Shuxuan0307 SelImm.IMM_B6, 68858c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 6894aa9ed34Sfdy SelImm.IMM_OPIVIU, 6904aa9ed34Sfdy SelImm.IMM_VSETVLI, 691fe528fd6Ssinsanction SelImm.IMM_VSETIVLI, 6927e30d16cSZhaoyang You SelImm.IMM_VRORVI, 693b0ae3ac4SLinJiawei ).zip(imms) 694b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 695b0ae3ac4SLinJiawei} 696b0ae3ac4SLinJiawei 697fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 698fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 699fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 700765e58c6Ssinsanction Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm) 701fd7603d9SYinan Xu } 7023b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 703fd7603d9SYinan Xu val loadImmLen = Imm_I().len 7043b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 705f4dcd9fcSsinsanction Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0)) 706fd7603d9SYinan Xu } 707fd7603d9SYinan Xu} 708b0ae3ac4SLinJiawei 709be25371aSYikeZhou/** 710be25371aSYikeZhou * IO bundle for the Decode unit 711be25371aSYikeZhou */ 712aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle { 713aaa08c5aSxiaofeibao-xjtu val decodedInst = Output(new DecodedInst) 714aaa08c5aSxiaofeibao-xjtu val isComplex = Output(Bool()) 715aaa08c5aSxiaofeibao-xjtu val uopInfo = Output(new UopInfo) 716aaa08c5aSxiaofeibao-xjtu} 7172225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 7183b739f49SXuan Hu val enq = new Bundle { 7193b739f49SXuan Hu val ctrlFlow = Input(new StaticInst) 720d91483a6Sfdy val vtype = Input(new VType) 7215110577fSZiyue Zhang val vstart = Input(Vl()) 7224aa9ed34Sfdy } 7233b739f49SXuan Hu// val vconfig = Input(UInt(XLEN.W)) 724aaa08c5aSxiaofeibao-xjtu val deq = new DecodeUnitDeqIO 725af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 72615ed99a7SXuan Hu val fromCSR = Input(new CSRToDecode) 727be25371aSYikeZhou} 728be25371aSYikeZhou 729be25371aSYikeZhou/** 730be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 731be25371aSYikeZhou */ 7322225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 733be25371aSYikeZhou val io = IO(new DecodeUnitIO) 734be25371aSYikeZhou 7353b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 736be25371aSYikeZhou 73775e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 73875e2c883SXuan Hu 73957a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 74057a10886SXuan Hu FpDecode.table ++ 741bdda74fdSxiaofeibao-xjtu// FDivSqrtDecode.table ++ 742768f5f91SYangyu Chen BitmanipDecode.table ++ 743768f5f91SYangyu Chen ScalarCryptoDecode.table ++ 744a19215ddSYinan Xu XSTrapDecode.table ++ 745a19215ddSYinan Xu CBODecode.table ++ 746b65b9ebaSXuan Hu SvinvalDecode.table ++ 747e25e4d90SXuan Hu HypervisorDecode.table ++ 748545d7be0SYangyu Chen VecDecoder.table ++ 749545d7be0SYangyu Chen ZicondDecode.table 750b65b9ebaSXuan Hu 75189cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 752a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 753239413e5SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue 754a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 755a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 756be25371aSYikeZhou 7574d24c305SYikeZhou // output 7583b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 759be25371aSYikeZhou 7602ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 7617ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 7623b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 763ec427417Slinzhida decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags 7641a1319cbSLinJiawei 7653b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 7663b739f49SXuan Hu 767a8db15d8Sfdy decodedInst.uopIdx := 0.U 768d91483a6Sfdy decodedInst.firstUop := true.B 769d91483a6Sfdy decodedInst.lastUop := true.B 770f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 7713235a9d8SZiyue-Zhang decodedInst.numWB := 1.U 772deb6421eSHaojin Tang 77373c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 774f7af4c74Schengguanghui decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep 77573c4359eSYikeZhou 77649a2cda2SXuan Hu // fmadd - b1000011 77749a2cda2SXuan Hu // fmsub - b1000111 77849a2cda2SXuan Hu // fnmsub- b1001011 77949a2cda2SXuan Hu // fnmadd- b1001111 78049a2cda2SXuan Hu private val isFMA = inst.OPCODE === BitPat("b100??11") 781e8b68a8eSgood-circle private val isVppu = FuType.isVppu(decodedInst.fuType) 782e8b68a8eSgood-circle private val isVecOPF = FuType.isVecOPF(decodedInst.fuType) 78349a2cda2SXuan Hu 784178dd38cSYikeZhou // read src1~3 location 78598cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 78698cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 78749a2cda2SXuan Hu // src(2) of fma is fs3, src(2) of vector inst is old vd 78849a2cda2SXuan Hu decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD) 7899c5a1080Sxiaofeibao decodedInst.lsrc(3) := V0_IDX.U 7909c5a1080Sxiaofeibao decodedInst.lsrc(4) := Vl_IDX.U 791b6b11f60SXuan Hu 792178dd38cSYikeZhou // read dest location 79398cfe81bSxgkiri decodedInst.ldest := inst.RD 7944d24c305SYikeZhou 795e4e68f86Sxiaofeibao // init v0Wen vlWen 796e4e68f86Sxiaofeibao decodedInst.v0Wen := false.B 797e4e68f86Sxiaofeibao decodedInst.vlWen := false.B 798e4e68f86Sxiaofeibao 799c2a8ae00SYikeZhou // fill in exception vector 800567f0269Ssinsanction val vecException = Module(new VecExceptionGen) 801567f0269Ssinsanction vecException.io.inst := io.enq.ctrlFlow.instr 802567f0269Ssinsanction vecException.io.decodedInst := decodedInst 803bdda74fdSxiaofeibao-xjtu vecException.io.vtype := decodedInst.vpu.vtype 8045110577fSZiyue Zhang vecException.io.vstart := decodedInst.vpu.vstart 8054d24c305SYikeZhou 80615ed99a7SXuan Hu private val exceptionII = 80715ed99a7SXuan Hu decodedInst.selImm === SelImm.INVALID_INSTR || 80815ed99a7SXuan Hu vecException.io.illegalInst || 80915ed99a7SXuan Hu io.fromCSR.illegalInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 81015ed99a7SXuan Hu io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 81115ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g || 81215ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v || 81315ed99a7SXuan Hu io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 8148b7dc6f5SsinceforYy io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 8158b7dc6f5SsinceforYy io.fromCSR.illegalInst.fsIsOff && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) || 8168b7dc6f5SsinceforYy (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) || 817d60bfe5aSsinceforYy FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) || 818d60bfe5aSsinceforYy isVecOPF) || 819b50a88ecSXuan Hu io.fromCSR.illegalInst.vsIsOff && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) || 820689f6b88SsinceforYy io.fromCSR.illegalInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) || 821689f6b88SsinceforYy (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)) || 822689f6b88SsinceforYy (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm 82315ed99a7SXuan Hu 82415ed99a7SXuan Hu private val exceptionVI = 82515ed99a7SXuan Hu io.fromCSR.virtualInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 82615ed99a7SXuan Hu io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 82715ed99a7SXuan Hu io.fromCSR.virtualInst.hfence && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) || 82815ed99a7SXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 829b50a88ecSXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 830b50a88ecSXuan Hu io.fromCSR.virtualInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) 83115ed99a7SXuan Hu 83215ed99a7SXuan Hu decodedInst.exceptionVec(illegalInstr) := exceptionII 83315ed99a7SXuan Hu decodedInst.exceptionVec(virtualInstr) := exceptionVI 834d0de7e4aSpeixiaokun 8357e0f64b0SGuanghui Cheng //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry. 8367e0f64b0SGuanghui Cheng decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger) 8377e0f64b0SGuanghui Cheng 8383b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 839b0ae3ac4SLinJiawei x => { 8407ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 841b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 842b0ae3ac4SLinJiawei x._1 -> minBits 843b0ae3ac4SLinJiawei } 844b0ae3ac4SLinJiawei )) 845aac4464eSYinan Xu 8467531c765SXuan Hu private val isLs = FuType.isLoadStore(decodedInst.fuType) 8477531c765SXuan Hu private val isVls = FuType.isVls(decodedInst.fuType) 8487531c765SXuan Hu private val isStore = FuType.isStore(decodedInst.fuType) 8497531c765SXuan Hu private val isAMO = FuType.isAMO(decodedInst.fuType) 8507531c765SXuan Hu private val isVStore = FuType.isVStore(decodedInst.fuType) 8517531c765SXuan Hu private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType) 8527531c765SXuan Hu 8537531c765SXuan Hu decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch) 85475e2c883SXuan Hu 85575e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 856be25371aSYikeZhou 8570bca6cb3SZiyue Zhang private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S) 85839c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 85939c388b5SXuan Hu private val narrowInsts = Seq( 86039c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 86139c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 86239c388b5SXuan Hu ) 86339c388b5SXuan Hu private val maskDstInsts = Seq( 86439c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 86539c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 86639c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 8679eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 8689eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 8699eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 8709eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 871f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 87239c388b5SXuan Hu ) 87330fcc710SZiyue Zhang private val maskOpInsts = Seq( 87430fcc710SZiyue Zhang VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 87530fcc710SZiyue Zhang ) 87694e6af68SZiyue-Zhang private val vmaInsts = Seq( 87794e6af68SZiyue-Zhang VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX, 87894e6af68SZiyue-Zhang VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX, 87994e6af68SZiyue-Zhang ) 880bdda74fdSxiaofeibao-xjtu private val wfflagsInsts = Seq( 881bdda74fdSxiaofeibao-xjtu // opfff 882bdda74fdSxiaofeibao-xjtu FADD_S, FSUB_S, FADD_D, FSUB_D, 883bdda74fdSxiaofeibao-xjtu FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, 884bdda74fdSxiaofeibao-xjtu FMIN_S, FMAX_S, FMIN_D, FMAX_D, 885bdda74fdSxiaofeibao-xjtu FMUL_S, FMUL_D, 886bdda74fdSxiaofeibao-xjtu FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, 887bdda74fdSxiaofeibao-xjtu FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, 888bdda74fdSxiaofeibao-xjtu FSGNJ_S, FSGNJN_S, FSGNJX_S, 889bdda74fdSxiaofeibao-xjtu // opfvv 890bdda74fdSxiaofeibao-xjtu VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV, 891bdda74fdSxiaofeibao-xjtu VFMUL_VV, VFDIV_VV, VFWMUL_VV, 892bdda74fdSxiaofeibao-xjtu VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV, 893bdda74fdSxiaofeibao-xjtu VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV, 894bdda74fdSxiaofeibao-xjtu VFSQRT_V, 895bdda74fdSxiaofeibao-xjtu VFMIN_VV, VFMAX_VV, 896bdda74fdSxiaofeibao-xjtu VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV, 897bdda74fdSxiaofeibao-xjtu VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV, 898bdda74fdSxiaofeibao-xjtu // opfvf 899bdda74fdSxiaofeibao-xjtu VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF, 900bdda74fdSxiaofeibao-xjtu VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF, 901bdda74fdSxiaofeibao-xjtu VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF, 902bdda74fdSxiaofeibao-xjtu VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF, 903bdda74fdSxiaofeibao-xjtu VFMIN_VF, VFMAX_VF, 904bdda74fdSxiaofeibao-xjtu VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF, 905bdda74fdSxiaofeibao-xjtu VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF, 906aab8ef9cSxiaofeibao-xjtu // vfred 907aab8ef9cSxiaofeibao-xjtu VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS, 908bdda74fdSxiaofeibao-xjtu // fcvt & vfcvt 909bdda74fdSxiaofeibao-xjtu FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU, 910bdda74fdSxiaofeibao-xjtu FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 911bdda74fdSxiaofeibao-xjtu FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU, 912bdda74fdSxiaofeibao-xjtu FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 913b189aafaSzmx FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H, 914ba899681Schengguanghui 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, 915ba899681Schengguanghui 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, 916ba899681Schengguanghui 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, 917ba899681Schengguanghui VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V, 918bdda74fdSxiaofeibao-xjtu ) 919689f6b88SsinceforYy 920689f6b88SsinceforYy private val scalaNeedFrmInsts = Seq( 921689f6b88SsinceforYy FADD_S, FSUB_S, FADD_D, FSUB_D, 922689f6b88SsinceforYy FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 923689f6b88SsinceforYy FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 924689f6b88SsinceforYy ) 925689f6b88SsinceforYy 926689f6b88SsinceforYy private val vectorNeedFrmInsts = Seq ( 927689f6b88SsinceforYy VFSLIDE1UP_VF, VFSLIDE1DOWN_VF, 928689f6b88SsinceforYy ) 929689f6b88SsinceforYy 930bdda74fdSxiaofeibao-xjtu decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _) 931689f6b88SsinceforYy decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 932689f6b88SsinceforYy decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 933bdda74fdSxiaofeibao-xjtu val fpToVecDecoder = Module(new FPToVecDecoder()) 934bdda74fdSxiaofeibao-xjtu fpToVecDecoder.io.instr := inst.asUInt 935bdda74fdSxiaofeibao-xjtu val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst 9363b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 937bdda74fdSxiaofeibao-xjtu when(isFpToVecInst){ 938bdda74fdSxiaofeibao-xjtu decodedInst.vpu := fpToVecDecoder.io.vpuCtrl 939bdda74fdSxiaofeibao-xjtu }.otherwise{ 94075e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 94175e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 94275e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 94375e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 94475e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 94575e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 94675e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 947d9355d3aSZiyue-Zhang decodedInst.vpu.veew := inst.WIDTH 94894e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 94939c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 950b6279fc6SZiyue Zhang val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _) 951b6279fc6SZiyue Zhang val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 952b6279fc6SZiyue Zhang val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _) 953b6279fc6SZiyue Zhang val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe 954dab1ad8cSsinsanction val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse 955dab1ad8cSsinsanction val isVlm = decodedInst.fuOpType === VlduType.vlm 956d8ceb649SZiyue Zhang val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV 95794e6af68SZiyue-Zhang val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _) 958dab1ad8cSsinsanction val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew 959b6279fc6SZiyue Zhang decodedInst.vpu.isNarrow := isNarrow 960b6279fc6SZiyue Zhang decodedInst.vpu.isDstMask := isDstMask 961b6279fc6SZiyue Zhang decodedInst.vpu.isOpMask := isOpMask 96294e6af68SZiyue-Zhang decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma 963dab1ad8cSsinsanction decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac 9645110577fSZiyue Zhang decodedInst.vpu.vstart := io.enq.vstart 965bdda74fdSxiaofeibao-xjtu } 96606f0a37aSZiyue Zhang decodedInst.vpu.specVill := io.enq.vtype.illegal 96706f0a37aSZiyue Zhang decodedInst.vpu.specVma := io.enq.vtype.vma 96806f0a37aSZiyue Zhang decodedInst.vpu.specVta := io.enq.vtype.vta 96906f0a37aSZiyue Zhang decodedInst.vpu.specVsew := io.enq.vtype.vsew 97006f0a37aSZiyue Zhang decodedInst.vpu.specVlmul := io.enq.vtype.vlmul 97175e2c883SXuan Hu 97231c51290Szhanglinjuan decodedInst.vlsInstr := isVls 97331c51290Szhanglinjuan 9746d56ac16Ssinsanction decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src 9756d56ac16Ssinsanction decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig 9766d56ac16Ssinsanction 9777f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 97887dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 97987dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 98006cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 98187dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 9820a34fc22SZiyue Zhang uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0) 983c4501a6fSZiyue-Zhang uopInfoGen.io.in.preInfo.nf := inst.NF 98406cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr 985c90e3eacSZiyue Zhang uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm 9867f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 987ddc88dadSxiaofeibao // numOfUop should be 1 when vector instruction is illegalInst 988ddc88dadSxiaofeibao io.deq.uopInfo.numOfUop := Mux(vecException.io.illegalInst, 1.U, uopInfoGen.io.out.uopInfo.numOfUop) 9893235a9d8SZiyue-Zhang io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB 9907f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 9917f9f0a79SzhanglyGit 992cc1eb70dSXuan Hu val isCSR = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U 993cc1eb70dSXuan Hu val isCSRR = isCSR && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U 994cc1eb70dSXuan Hu val isCSRW = isCSR && inst.FUNCT3 === BitPat("b?10") && inst.RD === 0.U 995cc1eb70dSXuan Hu dontTouch(isCSRR) 996cc1eb70dSXuan Hu dontTouch(isCSRW) 997cc1eb70dSXuan Hu 99887c5d21dSZiyue Zhang // for csrr vl instruction, convert to vsetvl 999cc1eb70dSXuan Hu val isCsrrVlenb = isCSRR && inst.CSRIDX === CSRs.vlenb.U 1000cc1eb70dSXuan Hu val isCsrrVl = isCSRR && inst.CSRIDX === CSRs.vl.U 1001cc1eb70dSXuan Hu 1002ac17908cSHuijin Li // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i) 1003ac17908cSHuijin Li val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U 1004ac17908cSHuijin Li val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W) 1005ac17908cSHuijin Li val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W) 1006ac17908cSHuijin Li val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W) 1007ac17908cSHuijin Li 100887c5d21dSZiyue Zhang when (isCsrrVl) { 100963cb3754SZiyue Zhang // convert to vsetvl instruction 101087c5d21dSZiyue Zhang decodedInst.srcType(0) := SrcType.no 101187c5d21dSZiyue Zhang decodedInst.srcType(1) := SrcType.no 101287c5d21dSZiyue Zhang decodedInst.srcType(2) := SrcType.no 101387c5d21dSZiyue Zhang decodedInst.srcType(3) := SrcType.no 101487c5d21dSZiyue Zhang decodedInst.srcType(4) := SrcType.vp 101587c5d21dSZiyue Zhang decodedInst.lsrc(4) := Vl_IDX.U 101663cb3754SZiyue Zhang decodedInst.waitForward := false.B 101787c5d21dSZiyue Zhang decodedInst.blockBackward := false.B 10188c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 101963cb3754SZiyue Zhang }.elsewhen(isCsrrVlenb){ 102063cb3754SZiyue Zhang // convert to addi instruction 1021828a8a48SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 1022828a8a48SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 102363cb3754SZiyue Zhang decodedInst.srcType(2) := SrcType.no 102463cb3754SZiyue Zhang decodedInst.srcType(3) := SrcType.no 102563cb3754SZiyue Zhang decodedInst.srcType(4) := SrcType.no 102663cb3754SZiyue Zhang decodedInst.selImm := SelImm.IMM_I 102763cb3754SZiyue Zhang decodedInst.waitForward := false.B 102863cb3754SZiyue Zhang decodedInst.blockBackward := false.B 102963cb3754SZiyue Zhang decodedInst.canRobCompress := true.B 10308c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 1031ac17908cSHuijin Li }.elsewhen(isPreW || isPreR || isPreI){ 1032ac17908cSHuijin Li decodedInst.selImm := SelImm.IMM_S 1033ac17908cSHuijin Li decodedInst.fuType := FuType.ldu.U 1034ac17908cSHuijin Li decodedInst.canRobCompress := false.B 1035ac17908cSHuijin Li decodedInst.fuOpType := Mux1H(Seq( 1036ac17908cSHuijin Li isPreW -> LSUOpType.prefetch_w, 1037ac17908cSHuijin Li isPreR -> LSUOpType.prefetch_r, 1038ac17908cSHuijin Li isPreI -> LSUOpType.prefetch_i, 1039ac17908cSHuijin Li )) 1040ac17908cSHuijin Li 104187c5d21dSZiyue Zhang } 104287c5d21dSZiyue Zhang 104375e2c883SXuan Hu io.deq.decodedInst := decodedInst 10449faa51afSxiaofeibao-xjtu io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen 1045985804e6SXuan Hu io.deq.decodedInst.fuType := Mux1H(Seq( 1046cc1eb70dSXuan Hu // keep condition 1047cc1eb70dSXuan Hu (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType, 104887c5d21dSZiyue Zhang (isCsrrVl) -> FuType.vsetfwf.U, 104963cb3754SZiyue Zhang (isCsrrVlenb) -> FuType.alu.U, 1050cc1eb70dSXuan Hu 1051cc1eb70dSXuan Hu // change vlsu to vseglsu when NF =/= 0.U 1052f94f6503SXuan 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, 1053f94f6503SXuan Hu // MOP === b00 && SUMOP === b01000: unit-stride whole register store 1054f94f6503SXuan Hu // MOP =/= b00 : strided and indexed store 1055f94f6503SXuan 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, 1056f94f6503SXuan Hu // MOP === b00 && LUMOP === b01000: unit-stride whole register load 1057f94f6503SXuan Hu // MOP =/= b00 : strided and indexed load 1058f94f6503SXuan 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, 1059985804e6SXuan Hu )) 106063cb3754SZiyue Zhang io.deq.decodedInst.imm := Mux(isCsrrVlenb, (VLEN / 8).U, decodedInst.imm) 1061cc1eb70dSXuan Hu 10624fe0a83eSXuan Hu io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq( 1063cc1eb70dSXuan Hu isCsrrVl -> VSETOpType.csrrvl, 1064cc1eb70dSXuan Hu isCsrrVlenb -> ALUOpType.add, 10654fe0a83eSXuan Hu )) 10664fe0a83eSXuan Hu 10674fe0a83eSXuan Hu io.deq.decodedInst.blockBackward := MuxCase(decodedInst.blockBackward, Seq( 10684fe0a83eSXuan Hu isCSRR -> false.B, 1069cc1eb70dSXuan Hu )) 1070be25371aSYikeZhou //------------------------------------------------------------- 1071be25371aSYikeZhou // Debug Info 10723b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 10733b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 10743b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 10753b739f49SXuan 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", 10763b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 10773b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 10783b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 10793b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 10803b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 10813b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 10823b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 10833b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 1084be25371aSYikeZhou} 1085