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._ 22*cc1eb70dSXuan Huimport freechips.rocketchip.rocket.CSRs 233b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._ 246ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat 253c02ee8fSwakafaimport utility._ 263b739f49SXuan Huimport utils._ 27d0de7e4aSpeixiaokunimport xiangshan.ExceptionNO.{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 32*cc1eb70dSXuan 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 { 1331be7b39aSXuan Hu import PseudoInstructions.{CSRRC_RO, CSRRS_RO} 1341be7b39aSXuan Hu 13557a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 136768f5f91SYangyu Chen // RV32I 13757a10886SXuan Hu LW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw , SelImm.IMM_I, xWen = T), 13857a10886SXuan Hu LH -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh , SelImm.IMM_I, xWen = T), 13957a10886SXuan Hu LHU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T), 14057a10886SXuan Hu LB -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb , SelImm.IMM_I, xWen = T), 14157a10886SXuan Hu LBU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T), 14257a10886SXuan Hu SW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw , SelImm.IMM_S ), 14357a10886SXuan Hu SH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh , SelImm.IMM_S ), 14457a10886SXuan Hu SB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb , SelImm.IMM_S ), 14589cc69c1STang Haojin LUI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T), 14689cc69c1STang Haojin ADDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T), 14789cc69c1STang Haojin ANDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T), 14889cc69c1STang Haojin ORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or , SelImm.IMM_I, xWen = T, canRobCompress = T), 14989cc69c1STang Haojin XORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T), 15089cc69c1STang Haojin SLTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T), 15189cc69c1STang Haojin SLTIU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T), 15289cc69c1STang Haojin SLL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X , xWen = T, canRobCompress = T), 15389cc69c1STang Haojin ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X , xWen = T, canRobCompress = T), 15489cc69c1STang Haojin SUB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X , xWen = T, canRobCompress = T), 15589cc69c1STang Haojin SLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X , xWen = T, canRobCompress = T), 15689cc69c1STang Haojin SLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X , xWen = T, canRobCompress = T), 15789cc69c1STang Haojin AND -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X , xWen = T, canRobCompress = T), 15889cc69c1STang Haojin OR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or , SelImm.X , xWen = T, canRobCompress = T), 15989cc69c1STang Haojin XOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X , xWen = T, canRobCompress = T), 16089cc69c1STang Haojin SRA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X , xWen = T, canRobCompress = T), 16189cc69c1STang Haojin SRL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X , xWen = T, canRobCompress = T), 1624d24c305SYikeZhou 163768f5f91SYangyu Chen // RV64I (extend from RV32I) 164768f5f91SYangyu Chen LD -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld , SelImm.IMM_I, xWen = T), 165768f5f91SYangyu Chen LWU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T), 166768f5f91SYangyu Chen SD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd , SelImm.IMM_S ), 167768f5f91SYangyu Chen 168768f5f91SYangyu Chen SLLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T), 169768f5f91SYangyu Chen SRLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T), 170768f5f91SYangyu Chen SRAI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T), 171768f5f91SYangyu Chen 172768f5f91SYangyu Chen ADDIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T), 173768f5f91SYangyu Chen SLLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T), 174768f5f91SYangyu Chen SRAIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T), 175768f5f91SYangyu Chen SRLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T), 176768f5f91SYangyu Chen 177768f5f91SYangyu Chen ADDW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X , xWen = T, canRobCompress = T), 178768f5f91SYangyu Chen SUBW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X , xWen = T, canRobCompress = T), 179768f5f91SYangyu Chen SLLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X , xWen = T, canRobCompress = T), 180768f5f91SYangyu Chen SRAW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X , xWen = T, canRobCompress = T), 181768f5f91SYangyu Chen SRLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X , xWen = T, canRobCompress = T), 182768f5f91SYangyu Chen 183768f5f91SYangyu Chen // RV64M 18489cc69c1STang Haojin MUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul , SelImm.X, xWen = T, canRobCompress = T), 18589cc69c1STang Haojin MULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh , SelImm.X, xWen = T, canRobCompress = T), 18689cc69c1STang Haojin MULHU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T), 18789cc69c1STang Haojin MULHSU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T), 18889cc69c1STang Haojin MULW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw , SelImm.X, xWen = T, canRobCompress = T), 1894d24c305SYikeZhou 19089cc69c1STang Haojin DIV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div , SelImm.X, xWen = T, canRobCompress = T), 19189cc69c1STang Haojin DIVU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu , SelImm.X, xWen = T, canRobCompress = T), 19289cc69c1STang Haojin REM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem , SelImm.X, xWen = T, canRobCompress = T), 19389cc69c1STang Haojin REMU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu , SelImm.X, xWen = T, canRobCompress = T), 19489cc69c1STang Haojin DIVW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw , SelImm.X, xWen = T, canRobCompress = T), 19589cc69c1STang Haojin DIVUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T), 19689cc69c1STang Haojin REMW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw , SelImm.X, xWen = T, canRobCompress = T), 19789cc69c1STang Haojin REMUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T), 1984d24c305SYikeZhou 199f7af4c74Schengguanghui AUIPC -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T), 20057a10886SXuan Hu JAL -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal , SelImm.IMM_UJ, xWen = T), 2015110577fSZiyue Zhang JALR -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T), 2023b739f49SXuan Hu BEQ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq , SelImm.IMM_SB ), 2033b739f49SXuan Hu BNE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne , SelImm.IMM_SB ), 2043b739f49SXuan Hu BGE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge , SelImm.IMM_SB ), 2053b739f49SXuan Hu BGEU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu , SelImm.IMM_SB ), 2063b739f49SXuan Hu BLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt , SelImm.IMM_SB ), 2073b739f49SXuan Hu BLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu , SelImm.IMM_SB ), 2084d24c305SYikeZhou 209768f5f91SYangyu Chen // System, the immediate12 holds the CSR register. 21040ac5bb1SXuan Hu 21140ac5bb1SXuan Hu // CSR RO should be ahead of CSRRS and CSRRC, since decoder don't handle the inclusive relation-ship among the patterns. 2125fa145b9SXuan Hu CSRRS_RO -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 2135fa145b9SXuan Hu CSRRC_RO -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 2145fa145b9SXuan Hu 21557a10886SXuan Hu CSRRW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21657a10886SXuan Hu CSRRS -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21757a10886SXuan Hu CSRRC -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 2184d24c305SYikeZhou 21957a10886SXuan Hu CSRRWI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 22057a10886SXuan Hu CSRRSI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 22157a10886SXuan Hu CSRRCI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2224d24c305SYikeZhou 22357a10886SXuan Hu EBREAK -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22457a10886SXuan Hu ECALL -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22557a10886SXuan Hu SRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22657a10886SXuan Hu MRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22757a10886SXuan Hu DRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22857a10886SXuan Hu WFI -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X , xWen = T, noSpec = T, blockBack = T), 2294d24c305SYikeZhou 23057a10886SXuan Hu SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 23157a10886SXuan Hu FENCE_I -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 23257a10886SXuan Hu FENCE -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 2334d24c305SYikeZhou 234768f5f91SYangyu Chen // RV64A 23557a10886SXuan Hu AMOADD_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23657a10886SXuan Hu AMOXOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23757a10886SXuan Hu AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23857a10886SXuan Hu AMOAND_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23957a10886SXuan Hu AMOOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24057a10886SXuan Hu AMOMIN_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24157a10886SXuan Hu AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24257a10886SXuan Hu AMOMAX_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24357a10886SXuan Hu AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2444d24c305SYikeZhou 24557a10886SXuan Hu AMOADD_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24657a10886SXuan Hu AMOXOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24757a10886SXuan Hu AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24857a10886SXuan Hu AMOAND_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24957a10886SXuan Hu AMOOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 25057a10886SXuan Hu AMOMIN_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 25157a10886SXuan Hu AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25257a10886SXuan Hu AMOMAX_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 25357a10886SXuan Hu AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2544d24c305SYikeZhou 25557a10886SXuan Hu LR_W -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25657a10886SXuan Hu LR_D -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25757a10886SXuan Hu SC_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25857a10886SXuan Hu SC_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 259768f5f91SYangyu Chen ) 260768f5f91SYangyu Chen} 261ee8ff153Szfw 262768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{ 263768f5f91SYangyu Chen /* 264768f5f91SYangyu Chen Note: Some Bitmanip instruction may have different OP code between rv32 and rv64. 265768f5f91SYangyu Chen Including pseudo instruction like zext.h, and different funct12 like rev8. 266768f5f91SYangyu Chen If some day we need to support change XLEN via CSR, we should care about this. 267768f5f91SYangyu Chen */ 268768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 269768f5f91SYangyu Chen // Zba 270768f5f91SYangyu Chen ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T, canRobCompress = T), 271768f5f91SYangyu Chen SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T, canRobCompress = T), 272768f5f91SYangyu Chen SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T, canRobCompress = T), 273768f5f91SYangyu Chen SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T, canRobCompress = T), 274768f5f91SYangyu Chen SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T, canRobCompress = T), 275768f5f91SYangyu Chen SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T, canRobCompress = T), 276768f5f91SYangyu Chen SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T, canRobCompress = T), 277768f5f91SYangyu Chen SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T, canRobCompress = T), 278768f5f91SYangyu Chen 279768f5f91SYangyu Chen // Zbb 28089cc69c1STang Haojin ANDN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn , SelImm.X , xWen = T, canRobCompress = T), 28189cc69c1STang Haojin ORN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X , xWen = T, canRobCompress = T), 28289cc69c1STang Haojin XNOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor , SelImm.X , xWen = T, canRobCompress = T), 283ee8ff153Szfw 284768f5f91SYangyu Chen CLZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz , SelImm.X , xWen = T, canRobCompress = T), 285768f5f91SYangyu Chen CLZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw , SelImm.X , xWen = T, canRobCompress = T), 286768f5f91SYangyu Chen CTZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz , SelImm.X , xWen = T, canRobCompress = T), 287768f5f91SYangyu Chen CTZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw , SelImm.X , xWen = T, canRobCompress = T), 288768f5f91SYangyu Chen 289768f5f91SYangyu Chen CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop , SelImm.X , xWen = T, canRobCompress = T), 290768f5f91SYangyu Chen CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw , SelImm.X , xWen = T, canRobCompress = T), 291768f5f91SYangyu Chen 29289cc69c1STang Haojin MAX -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X , xWen = T, canRobCompress = T), 29389cc69c1STang Haojin MAXU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu , SelImm.X , xWen = T, canRobCompress = T), 294768f5f91SYangyu Chen MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X , xWen = T, canRobCompress = T), 295768f5f91SYangyu Chen MINU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu , SelImm.X , xWen = T, canRobCompress = T), 296ee8ff153Szfw 29789cc69c1STang Haojin SEXT_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sextb , SelImm.X , xWen = T, canRobCompress = T), 29889cc69c1STang Haojin SEXT_H -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sexth , SelImm.X , xWen = T, canRobCompress = T), 299768f5f91SYangyu Chen // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0. 300768f5f91SYangyu Chen // If we configured to have no Zbkb, we should add zext.h here. 301ee8ff153Szfw 302768f5f91SYangyu Chen ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol , SelImm.X , xWen = T, canRobCompress = T), 303768f5f91SYangyu Chen ROLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw , SelImm.X , xWen = T, canRobCompress = T), 30489cc69c1STang Haojin ROR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.X , xWen = T, canRobCompress = T), 30589cc69c1STang Haojin RORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.IMM_I, xWen = T, canRobCompress = T), 306768f5f91SYangyu Chen RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.IMM_I, xWen = T, canRobCompress = T), 307768f5f91SYangyu Chen RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.X , xWen = T, canRobCompress = T), 308ee8ff153Szfw 309768f5f91SYangyu Chen ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb , SelImm.X , xWen = T, canRobCompress = T), 310768f5f91SYangyu Chen 311768f5f91SYangyu Chen REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X , xWen = T, canRobCompress = T), 312768f5f91SYangyu Chen 313768f5f91SYangyu Chen // Zbc 314768f5f91SYangyu Chen CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul , SelImm.X , xWen = T, canRobCompress = T), 315768f5f91SYangyu Chen CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh , SelImm.X , xWen = T, canRobCompress = T), 316768f5f91SYangyu Chen CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr , SelImm.X , xWen = T, canRobCompress = T), 317768f5f91SYangyu Chen 318768f5f91SYangyu Chen // Zbs 319768f5f91SYangyu Chen BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.X , xWen = T, canRobCompress = T), 320768f5f91SYangyu Chen BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.IMM_I, xWen = T, canRobCompress = T), 321768f5f91SYangyu Chen BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.X , xWen = T, canRobCompress = T), 322768f5f91SYangyu Chen BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.IMM_I, xWen = T, canRobCompress = T), 323768f5f91SYangyu Chen BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.X , xWen = T, canRobCompress = T), 324768f5f91SYangyu Chen BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.IMM_I, xWen = T, canRobCompress = T), 325768f5f91SYangyu Chen BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.X , xWen = T, canRobCompress = T), 326768f5f91SYangyu Chen BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.IMM_I, xWen = T, canRobCompress = T), 327768f5f91SYangyu Chen 328768f5f91SYangyu Chen // Zbkb 329768f5f91SYangyu Chen // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb 330768f5f91SYangyu Chen PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X , xWen = T, canRobCompress = T), 331768f5f91SYangyu Chen PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh , SelImm.X , xWen = T, canRobCompress = T), 332768f5f91SYangyu Chen PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw , SelImm.X , xWen = T, canRobCompress = T), 333768f5f91SYangyu Chen BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X , xWen = T, canRobCompress = T), 334768f5f91SYangyu Chen // If configured to RV32, we should add zip and unzip. 335768f5f91SYangyu Chen 336768f5f91SYangyu Chen // Zbkc 337768f5f91SYangyu Chen // clmul, clmulh is in Zbc 338768f5f91SYangyu Chen 339768f5f91SYangyu Chen // Zbkx 340768f5f91SYangyu Chen XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn , SelImm.X , xWen = T, canRobCompress = T), 341768f5f91SYangyu Chen XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb , SelImm.X , xWen = T, canRobCompress = T), 342768f5f91SYangyu Chen ) 343768f5f91SYangyu Chen} 344768f5f91SYangyu Chen 345768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants { 346768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 347768f5f91SYangyu Chen // Zknd: NIST Suite: AES Decryption 348768f5f91SYangyu Chen AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds , SelImm.X , xWen = T, canRobCompress = T), 349768f5f91SYangyu Chen AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm , SelImm.X , xWen = T, canRobCompress = T), 350768f5f91SYangyu Chen AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im , SelImm.X , xWen = T, canRobCompress = T), 351768f5f91SYangyu Chen AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T), 352768f5f91SYangyu Chen AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2 , SelImm.X , xWen = T, canRobCompress = T), 353768f5f91SYangyu Chen 354768f5f91SYangyu Chen // Zkne: NIST Suite: AES Encryption 355768f5f91SYangyu Chen // aes64ks1i, aes64ks2 is in Zknd 356768f5f91SYangyu Chen AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es , SelImm.X , xWen = T, canRobCompress = T), 357768f5f91SYangyu Chen AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm , SelImm.X , xWen = T, canRobCompress = T), 358768f5f91SYangyu Chen 359768f5f91SYangyu Chen // Zknh: NIST Suite: Hash Function Instructions 360768f5f91SYangyu Chen SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T, canRobCompress = T), 361768f5f91SYangyu Chen SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T, canRobCompress = T), 362768f5f91SYangyu Chen SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T, canRobCompress = T), 363768f5f91SYangyu Chen SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T, canRobCompress = T), 364768f5f91SYangyu Chen SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T, canRobCompress = T), 365768f5f91SYangyu Chen SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T, canRobCompress = T), 366768f5f91SYangyu Chen SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T, canRobCompress = T), 367768f5f91SYangyu Chen SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T, canRobCompress = T), 368768f5f91SYangyu Chen 369768f5f91SYangyu Chen // Zksed: ShangMi Suite: SM4 Block Cipher Instructions 370768f5f91SYangyu Chen SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0 , SelImm.X , xWen = T, canRobCompress = T), 371768f5f91SYangyu Chen SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1 , SelImm.X , xWen = T, canRobCompress = T), 372768f5f91SYangyu Chen SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2 , SelImm.X , xWen = T, canRobCompress = T), 373768f5f91SYangyu Chen SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3 , SelImm.X , xWen = T, canRobCompress = T), 374768f5f91SYangyu Chen SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0 , SelImm.X , xWen = T, canRobCompress = T), 375768f5f91SYangyu Chen SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1 , SelImm.X , xWen = T, canRobCompress = T), 376768f5f91SYangyu Chen SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2 , SelImm.X , xWen = T, canRobCompress = T), 377768f5f91SYangyu Chen SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3 , SelImm.X , xWen = T, canRobCompress = T), 378768f5f91SYangyu Chen 379768f5f91SYangyu Chen // Zksh: ShangMi Suite: SM3 Hash Function Instructions 380768f5f91SYangyu Chen SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0 , SelImm.X , xWen = T, canRobCompress = T), 381768f5f91SYangyu Chen SM3P1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p1 , SelImm.X , xWen = T, canRobCompress = T), 3824d24c305SYikeZhou ) 383be25371aSYikeZhou} 384be25371aSYikeZhou 385be25371aSYikeZhou/** 386be25371aSYikeZhou * FP Decode constants 387be25371aSYikeZhou */ 38857a10886SXuan Huobject FpDecode extends DecodeConstants{ 38957a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 39057a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 39157a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 39257a10886SXuan Hu FSW -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S ), 39357a10886SXuan Hu FSD -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S ), 3944d24c305SYikeZhou 395964d9a87SZiyue Zhang FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T), 396964d9a87SZiyue Zhang FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T), 397c2a8ae00SYikeZhou 3984d24c305SYikeZhou // Int to FP 39989cc69c1STang Haojin FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40089cc69c1STang Haojin FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40189cc69c1STang Haojin FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40289cc69c1STang Haojin FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4034d24c305SYikeZhou 40489cc69c1STang Haojin FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40589cc69c1STang Haojin FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40689cc69c1STang Haojin FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40789cc69c1STang Haojin FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4084d24c305SYikeZhou 4094d24c305SYikeZhou ) 410be25371aSYikeZhou} 411be25371aSYikeZhou 412be25371aSYikeZhou/** 413be25371aSYikeZhou * FP Divide SquareRoot Constants 414be25371aSYikeZhou */ 415be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 41657a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 41789cc69c1STang Haojin FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41889cc69c1STang Haojin FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41989cc69c1STang Haojin FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 42089cc69c1STang Haojin FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 4214d24c305SYikeZhou ) 422be25371aSYikeZhou} 423be25371aSYikeZhou 4244d24c305SYikeZhou/** 425af2f7849Shappy-lx * Svinval extension Constants 426af2f7849Shappy-lx */ 427af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 42857a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 429af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 430af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 431af2f7849Shappy-lx */ 43257a10886SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X), 433af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 434af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 435af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 436af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 437af2f7849Shappy-lx */ 43857a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 439af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 440af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 441af2f7849Shappy-lx * then dispatch and issue this instrucion 442af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 443af2f7849Shappy-lx */ 44457a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 445af2f7849Shappy-lx /* what is Svinval extension ? 446af2f7849Shappy-lx * -----> sfecne.w.inval 447af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 448af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 449af2f7849Shappy-lx * -----> sfecne.inval.ir 450af2f7849Shappy-lx * 451af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 452af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 453af2f7849Shappy-lx */ 454af2f7849Shappy-lx ) 455af2f7849Shappy-lx} 45657a10886SXuan Hu 457af2f7849Shappy-lx/* 458ca18a0b4SWilliam Wang * CBO decode 459ca18a0b4SWilliam Wang */ 460ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 46157a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 46257a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 46357a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 46457a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 46557a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 466ca18a0b4SWilliam Wang ) 467ca18a0b4SWilliam Wang} 468ca18a0b4SWilliam Wang 469d0de7e4aSpeixiaokun/* 470d0de7e4aSpeixiaokun * Hypervisor decode 471d0de7e4aSpeixiaokun */ 472d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants { 473e25e4d90SXuan Hu override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 474e25e4d90SXuan Hu HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 475e25e4d90SXuan Hu HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 476e25e4d90SXuan Hu HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X), 477e25e4d90SXuan Hu HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X), 478e25e4d90SXuan Hu HLV_B -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvb, SelImm.X, xWen = T), 479e25e4d90SXuan Hu HLV_BU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvbu, SelImm.X, xWen = T), 480e25e4d90SXuan Hu HLV_D -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvd, SelImm.X, xWen = T), 481e25e4d90SXuan Hu HLV_H -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvh, SelImm.X, xWen = T), 482e25e4d90SXuan Hu HLV_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvhu, SelImm.X, xWen = T), 483e25e4d90SXuan Hu HLV_W -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvw, SelImm.X, xWen = T), 484e25e4d90SXuan Hu HLV_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvwu, SelImm.X, xWen = T), 485e25e4d90SXuan Hu HLVX_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxhu, SelImm.X, xWen = T), 486e25e4d90SXuan Hu HLVX_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxwu, SelImm.X, xWen = T), 487e25e4d90SXuan Hu HSV_B -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvb, SelImm.X), 488e25e4d90SXuan Hu HSV_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvd, SelImm.X), 489e25e4d90SXuan Hu HSV_H -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvh, SelImm.X), 490e25e4d90SXuan Hu HSV_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvw, SelImm.X), 491d0de7e4aSpeixiaokun ) 492d0de7e4aSpeixiaokun} 493d0de7e4aSpeixiaokun 494545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants { 495545d7be0SYangyu Chen override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 496545d7be0SYangyu Chen CZERO_EQZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T), 497545d7be0SYangyu Chen CZERO_NEZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T), 498545d7be0SYangyu Chen ) 499545d7be0SYangyu Chen} 500545d7be0SYangyu Chen 501ca18a0b4SWilliam Wang/** 5024d24c305SYikeZhou * XiangShan Trap Decode constants 5034d24c305SYikeZhou */ 5044d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 505361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 50657a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 50757a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 5084d24c305SYikeZhou ) 5094d24c305SYikeZhou} 510be25371aSYikeZhou 51149f433deSXuan Huabstract class Imm(val len: Int) { 512b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 513b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 514b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 515b0ae3ac4SLinJiawei} 516b0ae3ac4SLinJiawei 517b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 518fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 519b0ae3ac4SLinJiawei 520b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 521b0ae3ac4SLinJiawei Cat(instr(31, 20)) 522b0ae3ac4SLinJiawei} 523b0ae3ac4SLinJiawei 524b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 525b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 526b0ae3ac4SLinJiawei 527b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 528b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 529b0ae3ac4SLinJiawei} 530b0ae3ac4SLinJiawei 531b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 532b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 533b0ae3ac4SLinJiawei 534b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 535b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 536b0ae3ac4SLinJiawei} 537b0ae3ac4SLinJiawei 538b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 539fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 540b0ae3ac4SLinJiawei 541b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 542b0ae3ac4SLinJiawei instr(31, 12) 543c2a8ae00SYikeZhou } 544c2a8ae00SYikeZhou} 545c2a8ae00SYikeZhou 546b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 547b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 548b0ae3ac4SLinJiawei 549b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 550b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 551b0ae3ac4SLinJiawei } 552b0ae3ac4SLinJiawei} 553b0ae3ac4SLinJiawei 554b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){ 555b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 556b0ae3ac4SLinJiawei 557b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 558b0ae3ac4SLinJiawei Cat(instr(19, 15), instr(31, 20)) 559b0ae3ac4SLinJiawei } 560b0ae3ac4SLinJiawei} 561b0ae3ac4SLinJiawei 562ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 563ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 564ee8ff153Szfw 565ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 566ee8ff153Szfw instr(25, 20) 567ee8ff153Szfw } 568ee8ff153Szfw} 569ee8ff153Szfw 57058c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 57158c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 57258c35d23Shuxuan0307 57358c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 57458c35d23Shuxuan0307 instr(19, 15) 57558c35d23Shuxuan0307 } 57658c35d23Shuxuan0307} 577b52d4755SXuan Hu 57858c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 57958c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 58058c35d23Shuxuan0307 58158c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 58258c35d23Shuxuan0307 instr(19, 15) 58358c35d23Shuxuan0307 } 58458c35d23Shuxuan0307} 585b52d4755SXuan Hu 5864aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 5874aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 5884aa9ed34Sfdy 5894aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 5904aa9ed34Sfdy instr(30, 20) 5914aa9ed34Sfdy } 592e6ac7fe1SZiyue Zhang /** 593e6ac7fe1SZiyue Zhang * get VType from extended imm 594e6ac7fe1SZiyue Zhang * @param extedImm 595e6ac7fe1SZiyue Zhang * @return VType 596e6ac7fe1SZiyue Zhang */ 597e6ac7fe1SZiyue Zhang def getVType(extedImm: UInt): InstVType = { 598e6ac7fe1SZiyue Zhang val vtype = Wire(new InstVType) 599e6ac7fe1SZiyue Zhang vtype := extedImm(10, 0).asTypeOf(new InstVType) 600e6ac7fe1SZiyue Zhang vtype 601e6ac7fe1SZiyue Zhang } 6024aa9ed34Sfdy} 603b52d4755SXuan Hu 604e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){ 6054aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6064aa9ed34Sfdy 6074aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6085c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 609b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 610e6ac7fe1SZiyue Zhang val vtype8 = rvInst.ZIMM_VSETIVLI 611b52d4755SXuan Hu Cat(uimm5, vtype8) 612b52d4755SXuan Hu } 613b52d4755SXuan Hu /** 614b52d4755SXuan Hu * get VType from extended imm 615b52d4755SXuan Hu * @param extedImm 616b52d4755SXuan Hu * @return VType 617b52d4755SXuan Hu */ 618b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 619b52d4755SXuan Hu val vtype = Wire(new InstVType) 620e6ac7fe1SZiyue Zhang vtype := extedImm(9, 0).asTypeOf(new InstVType) 621b52d4755SXuan Hu vtype 622b52d4755SXuan Hu } 623b52d4755SXuan Hu 624b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 625e6ac7fe1SZiyue Zhang extedImm(14, 10) 6264aa9ed34Sfdy } 6274aa9ed34Sfdy} 628fe528fd6Ssinsanction 629fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){ 630fe528fd6Ssinsanction override def do_toImm32(minBits: UInt): UInt = minBits(31, 0) 631fe528fd6Ssinsanction 632fe528fd6Ssinsanction override def minBitsFromInstr(instr: UInt): UInt = { 633fe528fd6Ssinsanction instr(31, 0) 634fe528fd6Ssinsanction } 635fe528fd6Ssinsanction} 636fe528fd6Ssinsanction 6377e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){ 6387e30d16cSZhaoyang You override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 6397e30d16cSZhaoyang You 6407e30d16cSZhaoyang You override def minBitsFromInstr(instr: UInt): UInt = { 6417e30d16cSZhaoyang You Cat(instr(26), instr(19, 15)) 6427e30d16cSZhaoyang You } 6437e30d16cSZhaoyang You} 6447e30d16cSZhaoyang You 645b0ae3ac4SLinJiaweiobject ImmUnion { 646b0ae3ac4SLinJiawei val I = Imm_I() 647b0ae3ac4SLinJiawei val S = Imm_S() 648b0ae3ac4SLinJiawei val B = Imm_B() 649b0ae3ac4SLinJiawei val U = Imm_U() 650b0ae3ac4SLinJiawei val J = Imm_J() 651b0ae3ac4SLinJiawei val Z = Imm_Z() 652ee8ff153Szfw val B6 = Imm_B6() 65358c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 65458c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 6554aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 6564aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 657fe528fd6Ssinsanction val LUI32 = Imm_LUI32() 6587e30d16cSZhaoyang You val VRORVI = Imm_VRORVI() 6594aa9ed34Sfdy 660520f7dacSsinsanction // do not add special type lui32 to this, keep ImmUnion max len being 20. 6617e30d16cSZhaoyang You val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI) 662b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 663b0ae3ac4SLinJiawei val immSelMap = Seq( 664b0ae3ac4SLinJiawei SelImm.IMM_I, 665b0ae3ac4SLinJiawei SelImm.IMM_S, 666b0ae3ac4SLinJiawei SelImm.IMM_SB, 667b0ae3ac4SLinJiawei SelImm.IMM_U, 668b0ae3ac4SLinJiawei SelImm.IMM_UJ, 669ee8ff153Szfw SelImm.IMM_Z, 67058c35d23Shuxuan0307 SelImm.IMM_B6, 67158c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 6724aa9ed34Sfdy SelImm.IMM_OPIVIU, 6734aa9ed34Sfdy SelImm.IMM_VSETVLI, 674fe528fd6Ssinsanction SelImm.IMM_VSETIVLI, 6757e30d16cSZhaoyang You SelImm.IMM_VRORVI, 676b0ae3ac4SLinJiawei ).zip(imms) 677b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 678b0ae3ac4SLinJiawei} 679b0ae3ac4SLinJiawei 680fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 681fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 682fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 683765e58c6Ssinsanction Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm) 684fd7603d9SYinan Xu } 6853b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 686fd7603d9SYinan Xu val loadImmLen = Imm_I().len 6873b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 688f4dcd9fcSsinsanction Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0)) 689fd7603d9SYinan Xu } 690fd7603d9SYinan Xu} 691b0ae3ac4SLinJiawei 692be25371aSYikeZhou/** 693be25371aSYikeZhou * IO bundle for the Decode unit 694be25371aSYikeZhou */ 695aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle { 696aaa08c5aSxiaofeibao-xjtu val decodedInst = Output(new DecodedInst) 697aaa08c5aSxiaofeibao-xjtu val isComplex = Output(Bool()) 698aaa08c5aSxiaofeibao-xjtu val uopInfo = Output(new UopInfo) 699aaa08c5aSxiaofeibao-xjtu} 7002225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 7013b739f49SXuan Hu val enq = new Bundle { 7023b739f49SXuan Hu val ctrlFlow = Input(new StaticInst) 703d91483a6Sfdy val vtype = Input(new VType) 7045110577fSZiyue Zhang val vstart = Input(Vl()) 7054aa9ed34Sfdy } 7063b739f49SXuan Hu// val vconfig = Input(UInt(XLEN.W)) 707aaa08c5aSxiaofeibao-xjtu val deq = new DecodeUnitDeqIO 708af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 70915ed99a7SXuan Hu val fromCSR = Input(new CSRToDecode) 710be25371aSYikeZhou} 711be25371aSYikeZhou 712be25371aSYikeZhou/** 713be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 714be25371aSYikeZhou */ 7152225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 716be25371aSYikeZhou val io = IO(new DecodeUnitIO) 717be25371aSYikeZhou 7183b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 719be25371aSYikeZhou 72075e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 72175e2c883SXuan Hu 72257a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 72357a10886SXuan Hu FpDecode.table ++ 724bdda74fdSxiaofeibao-xjtu// FDivSqrtDecode.table ++ 725768f5f91SYangyu Chen BitmanipDecode.table ++ 726768f5f91SYangyu Chen ScalarCryptoDecode.table ++ 727a19215ddSYinan Xu XSTrapDecode.table ++ 728a19215ddSYinan Xu CBODecode.table ++ 729b65b9ebaSXuan Hu SvinvalDecode.table ++ 730e25e4d90SXuan Hu HypervisorDecode.table ++ 731545d7be0SYangyu Chen VecDecoder.table ++ 732545d7be0SYangyu Chen ZicondDecode.table 733b65b9ebaSXuan Hu 73489cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 735a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 736239413e5SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue 737a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 738a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 739be25371aSYikeZhou 7404d24c305SYikeZhou // output 7413b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 742be25371aSYikeZhou 7432ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 7447ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 7453b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 7461a1319cbSLinJiawei 7473b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 7483b739f49SXuan Hu 749a8db15d8Sfdy decodedInst.uopIdx := 0.U 750d91483a6Sfdy decodedInst.firstUop := true.B 751d91483a6Sfdy decodedInst.lastUop := true.B 752f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 7533235a9d8SZiyue-Zhang decodedInst.numWB := 1.U 754deb6421eSHaojin Tang 75573c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 756f7af4c74Schengguanghui decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep 75773c4359eSYikeZhou 75849a2cda2SXuan Hu // fmadd - b1000011 75949a2cda2SXuan Hu // fmsub - b1000111 76049a2cda2SXuan Hu // fnmsub- b1001011 76149a2cda2SXuan Hu // fnmadd- b1001111 76249a2cda2SXuan Hu private val isFMA = inst.OPCODE === BitPat("b100??11") 763e8b68a8eSgood-circle private val isVppu = FuType.isVppu(decodedInst.fuType) 764e8b68a8eSgood-circle private val isVecOPF = FuType.isVecOPF(decodedInst.fuType) 76549a2cda2SXuan Hu 766178dd38cSYikeZhou // read src1~3 location 76798cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 76898cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 76949a2cda2SXuan Hu // src(2) of fma is fs3, src(2) of vector inst is old vd 77049a2cda2SXuan Hu decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD) 7719c5a1080Sxiaofeibao decodedInst.lsrc(3) := V0_IDX.U 7729c5a1080Sxiaofeibao decodedInst.lsrc(4) := Vl_IDX.U 773b6b11f60SXuan Hu 774178dd38cSYikeZhou // read dest location 77598cfe81bSxgkiri decodedInst.ldest := inst.RD 7764d24c305SYikeZhou 777e4e68f86Sxiaofeibao // init v0Wen vlWen 778e4e68f86Sxiaofeibao decodedInst.v0Wen := false.B 779e4e68f86Sxiaofeibao decodedInst.vlWen := false.B 780e4e68f86Sxiaofeibao 781c2a8ae00SYikeZhou // fill in exception vector 782567f0269Ssinsanction val vecException = Module(new VecExceptionGen) 783567f0269Ssinsanction vecException.io.inst := io.enq.ctrlFlow.instr 784567f0269Ssinsanction vecException.io.decodedInst := decodedInst 785bdda74fdSxiaofeibao-xjtu vecException.io.vtype := decodedInst.vpu.vtype 7865110577fSZiyue Zhang vecException.io.vstart := decodedInst.vpu.vstart 7874d24c305SYikeZhou 78815ed99a7SXuan Hu private val exceptionII = 78915ed99a7SXuan Hu decodedInst.selImm === SelImm.INVALID_INSTR || 79015ed99a7SXuan Hu vecException.io.illegalInst || 79115ed99a7SXuan Hu io.fromCSR.illegalInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 79215ed99a7SXuan Hu io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 79315ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g || 79415ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v || 79515ed99a7SXuan Hu io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 7968b7dc6f5SsinceforYy io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 7978b7dc6f5SsinceforYy io.fromCSR.illegalInst.fsIsOff && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) || 7988b7dc6f5SsinceforYy (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) || 799d60bfe5aSsinceforYy FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) || 800d60bfe5aSsinceforYy isVecOPF) || 801b50a88ecSXuan Hu io.fromCSR.illegalInst.vsIsOff && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) || 802b50a88ecSXuan Hu io.fromCSR.illegalInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) 80315ed99a7SXuan Hu 80415ed99a7SXuan Hu private val exceptionVI = 80515ed99a7SXuan Hu io.fromCSR.virtualInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 80615ed99a7SXuan Hu io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 80715ed99a7SXuan Hu io.fromCSR.virtualInst.hfence && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) || 80815ed99a7SXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 809b50a88ecSXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 810b50a88ecSXuan Hu io.fromCSR.virtualInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) 81115ed99a7SXuan Hu 81215ed99a7SXuan Hu decodedInst.exceptionVec(illegalInstr) := exceptionII 81315ed99a7SXuan Hu decodedInst.exceptionVec(virtualInstr) := exceptionVI 814d0de7e4aSpeixiaokun 8153b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 816b0ae3ac4SLinJiawei x => { 8177ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 818b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 819b0ae3ac4SLinJiawei x._1 -> minBits 820b0ae3ac4SLinJiawei } 821b0ae3ac4SLinJiawei )) 822aac4464eSYinan Xu 8237531c765SXuan Hu private val isLs = FuType.isLoadStore(decodedInst.fuType) 8247531c765SXuan Hu private val isVls = FuType.isVls(decodedInst.fuType) 8257531c765SXuan Hu private val isStore = FuType.isStore(decodedInst.fuType) 8267531c765SXuan Hu private val isAMO = FuType.isAMO(decodedInst.fuType) 8277531c765SXuan Hu private val isVStore = FuType.isVStore(decodedInst.fuType) 8287531c765SXuan Hu private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType) 8297531c765SXuan Hu 8307531c765SXuan Hu decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch) 83175e2c883SXuan Hu 83275e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 833be25371aSYikeZhou 8340bca6cb3SZiyue Zhang private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S) 83539c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 83639c388b5SXuan Hu private val narrowInsts = Seq( 83739c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 83839c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 83939c388b5SXuan Hu ) 84039c388b5SXuan Hu private val maskDstInsts = Seq( 84139c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 84239c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 84339c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 8449eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 8459eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 8469eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 8479eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 848f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 84939c388b5SXuan Hu ) 85030fcc710SZiyue Zhang private val maskOpInsts = Seq( 85130fcc710SZiyue Zhang VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 85230fcc710SZiyue Zhang ) 85394e6af68SZiyue-Zhang private val vmaInsts = Seq( 85494e6af68SZiyue-Zhang VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX, 85594e6af68SZiyue-Zhang VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX, 85694e6af68SZiyue-Zhang ) 857bdda74fdSxiaofeibao-xjtu private val wfflagsInsts = Seq( 858bdda74fdSxiaofeibao-xjtu // opfff 859bdda74fdSxiaofeibao-xjtu FADD_S, FSUB_S, FADD_D, FSUB_D, 860bdda74fdSxiaofeibao-xjtu FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, 861bdda74fdSxiaofeibao-xjtu FMIN_S, FMAX_S, FMIN_D, FMAX_D, 862bdda74fdSxiaofeibao-xjtu FMUL_S, FMUL_D, 863bdda74fdSxiaofeibao-xjtu FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, 864bdda74fdSxiaofeibao-xjtu FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, 865bdda74fdSxiaofeibao-xjtu FSGNJ_S, FSGNJN_S, FSGNJX_S, 866bdda74fdSxiaofeibao-xjtu // opfvv 867bdda74fdSxiaofeibao-xjtu VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV, 868bdda74fdSxiaofeibao-xjtu VFMUL_VV, VFDIV_VV, VFWMUL_VV, 869bdda74fdSxiaofeibao-xjtu VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV, 870bdda74fdSxiaofeibao-xjtu VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV, 871bdda74fdSxiaofeibao-xjtu VFSQRT_V, 872bdda74fdSxiaofeibao-xjtu VFMIN_VV, VFMAX_VV, 873bdda74fdSxiaofeibao-xjtu VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV, 874bdda74fdSxiaofeibao-xjtu VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV, 875bdda74fdSxiaofeibao-xjtu // opfvf 876bdda74fdSxiaofeibao-xjtu VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF, 877bdda74fdSxiaofeibao-xjtu VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF, 878bdda74fdSxiaofeibao-xjtu VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF, 879bdda74fdSxiaofeibao-xjtu VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF, 880bdda74fdSxiaofeibao-xjtu VFMIN_VF, VFMAX_VF, 881bdda74fdSxiaofeibao-xjtu VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF, 882bdda74fdSxiaofeibao-xjtu VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF, 883aab8ef9cSxiaofeibao-xjtu // vfred 884aab8ef9cSxiaofeibao-xjtu VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS, 885bdda74fdSxiaofeibao-xjtu // fcvt & vfcvt 886bdda74fdSxiaofeibao-xjtu FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU, 887bdda74fdSxiaofeibao-xjtu FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 888bdda74fdSxiaofeibao-xjtu FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU, 889bdda74fdSxiaofeibao-xjtu FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 890ba899681Schengguanghui 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, 891ba899681Schengguanghui 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, 892ba899681Schengguanghui 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, 893ba899681Schengguanghui VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V, 894bdda74fdSxiaofeibao-xjtu ) 895bdda74fdSxiaofeibao-xjtu decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _) 896bdda74fdSxiaofeibao-xjtu val fpToVecDecoder = Module(new FPToVecDecoder()) 897bdda74fdSxiaofeibao-xjtu fpToVecDecoder.io.instr := inst.asUInt 898bdda74fdSxiaofeibao-xjtu val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst 8993b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 900bdda74fdSxiaofeibao-xjtu when(isFpToVecInst){ 901bdda74fdSxiaofeibao-xjtu decodedInst.vpu := fpToVecDecoder.io.vpuCtrl 902bdda74fdSxiaofeibao-xjtu }.otherwise{ 90375e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 90475e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 90575e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 90675e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 90775e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 90875e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 90975e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 910d9355d3aSZiyue-Zhang decodedInst.vpu.veew := inst.WIDTH 91194e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 91239c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 913b6279fc6SZiyue Zhang val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _) 914b6279fc6SZiyue Zhang val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 915b6279fc6SZiyue Zhang val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _) 916b6279fc6SZiyue Zhang val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe 917dab1ad8cSsinsanction val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse 918dab1ad8cSsinsanction val isVlm = decodedInst.fuOpType === VlduType.vlm 919d8ceb649SZiyue Zhang val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV 92094e6af68SZiyue-Zhang val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _) 921dab1ad8cSsinsanction val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew 922b6279fc6SZiyue Zhang decodedInst.vpu.isNarrow := isNarrow 923b6279fc6SZiyue Zhang decodedInst.vpu.isDstMask := isDstMask 924b6279fc6SZiyue Zhang decodedInst.vpu.isOpMask := isOpMask 92594e6af68SZiyue-Zhang decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma 926dab1ad8cSsinsanction decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac 9275110577fSZiyue Zhang decodedInst.vpu.vstart := io.enq.vstart 928bdda74fdSxiaofeibao-xjtu } 92975e2c883SXuan Hu 93031c51290Szhanglinjuan decodedInst.vlsInstr := isVls 93131c51290Szhanglinjuan 9326d56ac16Ssinsanction decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src 9336d56ac16Ssinsanction decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig 9346d56ac16Ssinsanction 9357f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 93687dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 93787dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 93806cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 93987dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 9400a34fc22SZiyue Zhang uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0) 941c4501a6fSZiyue-Zhang uopInfoGen.io.in.preInfo.nf := inst.NF 94206cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr 943c90e3eacSZiyue Zhang uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm 9447f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 9457f9f0a79SzhanglyGit io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop 9463235a9d8SZiyue-Zhang io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB 9477f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 9487f9f0a79SzhanglyGit 949*cc1eb70dSXuan Hu val isCSR = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U 950*cc1eb70dSXuan Hu val isCSRR = isCSR && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U 951*cc1eb70dSXuan Hu val isCSRW = isCSR && inst.FUNCT3 === BitPat("b?10") && inst.RD === 0.U 952*cc1eb70dSXuan Hu dontTouch(isCSRR) 953*cc1eb70dSXuan Hu dontTouch(isCSRW) 954*cc1eb70dSXuan Hu 95587c5d21dSZiyue Zhang // for csrr vl instruction, convert to vsetvl 956*cc1eb70dSXuan Hu val isCsrrVlenb = isCSRR && inst.CSRIDX === CSRs.vlenb.U 957*cc1eb70dSXuan Hu val isCsrrVl = isCSRR && inst.CSRIDX === CSRs.vl.U 958*cc1eb70dSXuan Hu 95987c5d21dSZiyue Zhang when (isCsrrVl) { 96063cb3754SZiyue Zhang // convert to vsetvl instruction 96187c5d21dSZiyue Zhang decodedInst.srcType(0) := SrcType.no 96287c5d21dSZiyue Zhang decodedInst.srcType(1) := SrcType.no 96387c5d21dSZiyue Zhang decodedInst.srcType(2) := SrcType.no 96487c5d21dSZiyue Zhang decodedInst.srcType(3) := SrcType.no 96587c5d21dSZiyue Zhang decodedInst.srcType(4) := SrcType.vp 96687c5d21dSZiyue Zhang decodedInst.lsrc(4) := Vl_IDX.U 96763cb3754SZiyue Zhang decodedInst.waitForward := false.B 96887c5d21dSZiyue Zhang decodedInst.blockBackward := false.B 96963cb3754SZiyue Zhang }.elsewhen(isCsrrVlenb){ 97063cb3754SZiyue Zhang // convert to addi instruction 971828a8a48SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 972828a8a48SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 97363cb3754SZiyue Zhang decodedInst.srcType(2) := SrcType.no 97463cb3754SZiyue Zhang decodedInst.srcType(3) := SrcType.no 97563cb3754SZiyue Zhang decodedInst.srcType(4) := SrcType.no 97663cb3754SZiyue Zhang decodedInst.selImm := SelImm.IMM_I 97763cb3754SZiyue Zhang decodedInst.waitForward := false.B 97863cb3754SZiyue Zhang decodedInst.blockBackward := false.B 97963cb3754SZiyue Zhang decodedInst.canRobCompress := true.B 98087c5d21dSZiyue Zhang } 98187c5d21dSZiyue Zhang 98275e2c883SXuan Hu io.deq.decodedInst := decodedInst 9839faa51afSxiaofeibao-xjtu io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen 984985804e6SXuan Hu io.deq.decodedInst.fuType := Mux1H(Seq( 985*cc1eb70dSXuan Hu // keep condition 986*cc1eb70dSXuan Hu (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType, 98787c5d21dSZiyue Zhang (isCsrrVl) -> FuType.vsetfwf.U, 98863cb3754SZiyue Zhang (isCsrrVlenb) -> FuType.alu.U, 989*cc1eb70dSXuan Hu 990*cc1eb70dSXuan Hu // change vlsu to vseglsu when NF =/= 0.U 991f94f6503SXuan 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, 992f94f6503SXuan Hu // MOP === b00 && SUMOP === b01000: unit-stride whole register store 993f94f6503SXuan Hu // MOP =/= b00 : strided and indexed store 994f94f6503SXuan 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, 995f94f6503SXuan Hu // MOP === b00 && LUMOP === b01000: unit-stride whole register load 996f94f6503SXuan Hu // MOP =/= b00 : strided and indexed load 997f94f6503SXuan 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, 998985804e6SXuan Hu )) 99963cb3754SZiyue Zhang io.deq.decodedInst.imm := Mux(isCsrrVlenb, (VLEN / 8).U, decodedInst.imm) 1000*cc1eb70dSXuan Hu 1001*cc1eb70dSXuan Hu io.deq.decodedInst.fuOpType := Mux1H(Seq( 1002*cc1eb70dSXuan Hu // keep condition 1003*cc1eb70dSXuan Hu !isCsrrVl && !isCsrrVlenb -> decodedInst.fuOpType, 1004*cc1eb70dSXuan Hu isCsrrVl -> VSETOpType.csrrvl, 1005*cc1eb70dSXuan Hu isCsrrVlenb -> ALUOpType.add, 1006*cc1eb70dSXuan Hu )) 1007be25371aSYikeZhou //------------------------------------------------------------- 1008be25371aSYikeZhou // Debug Info 10093b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 10103b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 10113b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 10123b739f49SXuan 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", 10133b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 10143b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 10153b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 10163b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 10173b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 10183b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 10193b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 10203b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 1021be25371aSYikeZhou} 1022