1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 17be25371aSYikeZhoupackage xiangshan.backend.decode 18be25371aSYikeZhou 198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters 20be25371aSYikeZhouimport chisel3._ 21be25371aSYikeZhouimport chisel3.util._ 223b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._ 236ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat 243c02ee8fSwakafaimport utility._ 253b739f49SXuan Huimport utils._ 26d0de7e4aSpeixiaokunimport xiangshan.ExceptionNO.{illegalInstr, virtualInstr} 276ab6918fSYinan Xuimport xiangshan._ 28730cfbc0SXuan Huimport xiangshan.backend.fu.FuType 29730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst} 301be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions 315c1681d0SXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, XSInstBitFields} 325110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl} 33be25371aSYikeZhou 34be25371aSYikeZhou/** 35be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/ 36be25371aSYikeZhou */ 37be25371aSYikeZhouabstract trait DecodeConstants { 38361e6d51SJiuyang Liu // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt. 3957a10886SXuan Hu def X = BitPat("b0") 404d24c305SYikeZhou def N = BitPat("b0") 414d24c305SYikeZhou def Y = BitPat("b1") 4257a10886SXuan Hu def T = true 4357a10886SXuan Hu def F = false 444d24c305SYikeZhou 45c2a8ae00SYikeZhou def decodeDefault: List[BitPat] = // illegal instruction 4620e31bd1SYinan Xu // srcType(0) srcType(1) srcType(2) fuType fuOpType rfWen 474d24c305SYikeZhou // | | | | | | fpWen 4857a10886SXuan Hu // | | | | | | | vecWen 4957a10886SXuan Hu // | | | | | | | | isXSTrap 5057a10886SXuan Hu // | | | | | | | | | noSpecExec 5157a10886SXuan Hu // | | | | | | | | | | blockBackward 5257a10886SXuan Hu // | | | | | | | | | | | flushPipe 5389cc69c1STang Haojin // | | | | | | | | | | | | canRobCompress 5489cc69c1STang Haojin // | | | | | | | | | | | | | uopSplitType 5589cc69c1STang Haojin // | | | | | | | | | | | | | | selImm 5689cc69c1STang 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 574d24c305SYikeZhou 5857a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] 5957a10886SXuan Hu final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate())) 60be25371aSYikeZhou} 61be25371aSYikeZhou 62c2a8ae00SYikeZhoutrait DecodeUnitConstants 634d24c305SYikeZhou{ 644d24c305SYikeZhou // abstract out instruction decode magic numbers 654d24c305SYikeZhou val RD_MSB = 11 664d24c305SYikeZhou val RD_LSB = 7 674d24c305SYikeZhou val RS1_MSB = 19 684d24c305SYikeZhou val RS1_LSB = 15 694d24c305SYikeZhou val RS2_MSB = 24 704d24c305SYikeZhou val RS2_LSB = 20 714d24c305SYikeZhou val RS3_MSB = 31 724d24c305SYikeZhou val RS3_LSB = 27 734d24c305SYikeZhou} 744d24c305SYikeZhou 75be25371aSYikeZhou/** 76be25371aSYikeZhou * Decoded control signals 774d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala 78be25371aSYikeZhou */ 79c2a8ae00SYikeZhou 8057a10886SXuan Huabstract class XSDecodeBase { 8157a10886SXuan Hu def X = BitPat("b?") 8257a10886SXuan Hu def N = BitPat("b0") 8357a10886SXuan Hu def Y = BitPat("b1") 8457a10886SXuan Hu def T = true 8557a10886SXuan Hu def F = false 8657a10886SXuan Hu def generate() : List[BitPat] 8757a10886SXuan Hu} 8857a10886SXuan Hu 8957a10886SXuan Hucase class XSDecode( 9057a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 91239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat, 92e2695e90SzhanglyGit uopSplitType: BitPat = UopSplitType.X, 9357a10886SXuan Hu xWen: Boolean = false, 9457a10886SXuan Hu fWen: Boolean = false, 9557a10886SXuan Hu vWen: Boolean = false, 9657a10886SXuan Hu mWen: Boolean = false, 9757a10886SXuan Hu xsTrap: Boolean = false, 9857a10886SXuan Hu noSpec: Boolean = false, 9957a10886SXuan Hu blockBack: Boolean = false, 10057a10886SXuan Hu flushPipe: Boolean = false, 10189cc69c1STang Haojin canRobCompress: Boolean = false, 10257a10886SXuan Hu) extends XSDecodeBase { 10357a10886SXuan Hu def generate() : List[BitPat] = { 10489cc69c1STang 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) 10557a10886SXuan Hu } 10657a10886SXuan Hu} 10757a10886SXuan Hu 10857a10886SXuan Hucase class FDecode( 10957a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 110239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X, 11117ec87f2SXuan Hu uopSplitType: BitPat = UopSplitType.X, 11257a10886SXuan Hu xWen: Boolean = false, 11357a10886SXuan Hu fWen: Boolean = false, 11457a10886SXuan Hu vWen: Boolean = false, 11557a10886SXuan Hu mWen: Boolean = false, 11657a10886SXuan Hu xsTrap: Boolean = false, 11757a10886SXuan Hu noSpec: Boolean = false, 11857a10886SXuan Hu blockBack: Boolean = false, 11957a10886SXuan Hu flushPipe: Boolean = false, 12089cc69c1STang Haojin canRobCompress: Boolean = false, 12157a10886SXuan Hu) extends XSDecodeBase { 12257a10886SXuan Hu def generate() : List[BitPat] = { 12389cc69c1STang Haojin XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate() 12457a10886SXuan Hu } 12557a10886SXuan Hu} 12657a10886SXuan Hu 127be25371aSYikeZhou/** 128be25371aSYikeZhou * Overall Decode constants 129be25371aSYikeZhou */ 130be25371aSYikeZhouobject XDecode extends DecodeConstants { 1311be7b39aSXuan Hu import PseudoInstructions.{CSRRC_RO, CSRRS_RO} 1321be7b39aSXuan Hu 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 20940ac5bb1SXuan Hu // CSR RO should be ahead of CSRRS and CSRRC, since decoder don't handle the inclusive relation-ship among the patterns. 210*5fa145b9SXuan Hu CSRRS_RO -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 211*5fa145b9SXuan Hu CSRRC_RO -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.ro, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 212*5fa145b9SXuan Hu 21357a10886SXuan Hu CSRRW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21457a10886SXuan Hu CSRRS -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21557a10886SXuan Hu CSRRC -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 2164d24c305SYikeZhou 21757a10886SXuan Hu CSRRWI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21857a10886SXuan Hu CSRRSI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21957a10886SXuan Hu CSRRCI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2204d24c305SYikeZhou 22157a10886SXuan Hu EBREAK -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22257a10886SXuan Hu ECALL -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22357a10886SXuan Hu SRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22457a10886SXuan Hu MRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22557a10886SXuan Hu DRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22657a10886SXuan Hu WFI -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X , xWen = T, noSpec = T, blockBack = T), 2274d24c305SYikeZhou 22857a10886SXuan Hu SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22957a10886SXuan Hu FENCE_I -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 23057a10886SXuan Hu FENCE -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 2314d24c305SYikeZhou 232768f5f91SYangyu Chen // RV64A 23357a10886SXuan Hu AMOADD_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23457a10886SXuan Hu AMOXOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23557a10886SXuan Hu AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23657a10886SXuan Hu AMOAND_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23757a10886SXuan Hu AMOOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23857a10886SXuan Hu AMOMIN_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23957a10886SXuan Hu AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24057a10886SXuan Hu AMOMAX_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24157a10886SXuan Hu AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2424d24c305SYikeZhou 24357a10886SXuan Hu AMOADD_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24457a10886SXuan Hu AMOXOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24557a10886SXuan Hu AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24657a10886SXuan Hu AMOAND_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24757a10886SXuan Hu AMOOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24857a10886SXuan Hu AMOMIN_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24957a10886SXuan Hu AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25057a10886SXuan Hu AMOMAX_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 25157a10886SXuan Hu AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2524d24c305SYikeZhou 25357a10886SXuan Hu LR_W -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25457a10886SXuan Hu LR_D -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25557a10886SXuan Hu SC_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25657a10886SXuan Hu SC_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 257768f5f91SYangyu Chen ) 258768f5f91SYangyu Chen} 259ee8ff153Szfw 260768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{ 261768f5f91SYangyu Chen /* 262768f5f91SYangyu Chen Note: Some Bitmanip instruction may have different OP code between rv32 and rv64. 263768f5f91SYangyu Chen Including pseudo instruction like zext.h, and different funct12 like rev8. 264768f5f91SYangyu Chen If some day we need to support change XLEN via CSR, we should care about this. 265768f5f91SYangyu Chen */ 266768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 267768f5f91SYangyu Chen // Zba 268768f5f91SYangyu Chen ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T, canRobCompress = T), 269768f5f91SYangyu Chen SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T, canRobCompress = T), 270768f5f91SYangyu Chen SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T, canRobCompress = T), 271768f5f91SYangyu Chen SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T, canRobCompress = T), 272768f5f91SYangyu Chen SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T, canRobCompress = T), 273768f5f91SYangyu Chen SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T, canRobCompress = T), 274768f5f91SYangyu Chen SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T, canRobCompress = T), 275768f5f91SYangyu Chen SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T, canRobCompress = T), 276768f5f91SYangyu Chen 277768f5f91SYangyu Chen // Zbb 27889cc69c1STang Haojin ANDN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn , SelImm.X , xWen = T, canRobCompress = T), 27989cc69c1STang Haojin ORN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X , xWen = T, canRobCompress = T), 28089cc69c1STang Haojin XNOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor , SelImm.X , xWen = T, canRobCompress = T), 281ee8ff153Szfw 282768f5f91SYangyu Chen CLZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz , SelImm.X , xWen = T, canRobCompress = T), 283768f5f91SYangyu Chen CLZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw , SelImm.X , xWen = T, canRobCompress = T), 284768f5f91SYangyu Chen CTZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz , SelImm.X , xWen = T, canRobCompress = T), 285768f5f91SYangyu Chen CTZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw , SelImm.X , xWen = T, canRobCompress = T), 286768f5f91SYangyu Chen 287768f5f91SYangyu Chen CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop , SelImm.X , xWen = T, canRobCompress = T), 288768f5f91SYangyu Chen CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw , SelImm.X , xWen = T, canRobCompress = T), 289768f5f91SYangyu Chen 29089cc69c1STang Haojin MAX -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X , xWen = T, canRobCompress = T), 29189cc69c1STang Haojin MAXU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu , SelImm.X , xWen = T, canRobCompress = T), 292768f5f91SYangyu Chen MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X , xWen = T, canRobCompress = T), 293768f5f91SYangyu Chen MINU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu , SelImm.X , xWen = T, canRobCompress = T), 294ee8ff153Szfw 29589cc69c1STang Haojin SEXT_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sextb , SelImm.X , xWen = T, canRobCompress = T), 29689cc69c1STang Haojin SEXT_H -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sexth , SelImm.X , xWen = T, canRobCompress = T), 297768f5f91SYangyu Chen // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0. 298768f5f91SYangyu Chen // If we configured to have no Zbkb, we should add zext.h here. 299ee8ff153Szfw 300768f5f91SYangyu Chen ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol , SelImm.X , xWen = T, canRobCompress = T), 301768f5f91SYangyu Chen ROLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw , SelImm.X , xWen = T, canRobCompress = T), 30289cc69c1STang Haojin ROR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.X , xWen = T, canRobCompress = T), 30389cc69c1STang Haojin RORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.IMM_I, xWen = T, canRobCompress = T), 304768f5f91SYangyu Chen RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.IMM_I, xWen = T, canRobCompress = T), 305768f5f91SYangyu Chen RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.X , xWen = T, canRobCompress = T), 306ee8ff153Szfw 307768f5f91SYangyu Chen ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb , SelImm.X , xWen = T, canRobCompress = T), 308768f5f91SYangyu Chen 309768f5f91SYangyu Chen REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X , xWen = T, canRobCompress = T), 310768f5f91SYangyu Chen 311768f5f91SYangyu Chen // Zbc 312768f5f91SYangyu Chen CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul , SelImm.X , xWen = T, canRobCompress = T), 313768f5f91SYangyu Chen CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh , SelImm.X , xWen = T, canRobCompress = T), 314768f5f91SYangyu Chen CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr , SelImm.X , xWen = T, canRobCompress = T), 315768f5f91SYangyu Chen 316768f5f91SYangyu Chen // Zbs 317768f5f91SYangyu Chen BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.X , xWen = T, canRobCompress = T), 318768f5f91SYangyu Chen BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.IMM_I, xWen = T, canRobCompress = T), 319768f5f91SYangyu Chen BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.X , xWen = T, canRobCompress = T), 320768f5f91SYangyu Chen BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.IMM_I, xWen = T, canRobCompress = T), 321768f5f91SYangyu Chen BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.X , xWen = T, canRobCompress = T), 322768f5f91SYangyu Chen BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.IMM_I, xWen = T, canRobCompress = T), 323768f5f91SYangyu Chen BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.X , xWen = T, canRobCompress = T), 324768f5f91SYangyu Chen BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.IMM_I, xWen = T, canRobCompress = T), 325768f5f91SYangyu Chen 326768f5f91SYangyu Chen // Zbkb 327768f5f91SYangyu Chen // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb 328768f5f91SYangyu Chen PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X , xWen = T, canRobCompress = T), 329768f5f91SYangyu Chen PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh , SelImm.X , xWen = T, canRobCompress = T), 330768f5f91SYangyu Chen PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw , SelImm.X , xWen = T, canRobCompress = T), 331768f5f91SYangyu Chen BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X , xWen = T, canRobCompress = T), 332768f5f91SYangyu Chen // If configured to RV32, we should add zip and unzip. 333768f5f91SYangyu Chen 334768f5f91SYangyu Chen // Zbkc 335768f5f91SYangyu Chen // clmul, clmulh is in Zbc 336768f5f91SYangyu Chen 337768f5f91SYangyu Chen // Zbkx 338768f5f91SYangyu Chen XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn , SelImm.X , xWen = T, canRobCompress = T), 339768f5f91SYangyu Chen XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb , SelImm.X , xWen = T, canRobCompress = T), 340768f5f91SYangyu Chen ) 341768f5f91SYangyu Chen} 342768f5f91SYangyu Chen 343768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants { 344768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 345768f5f91SYangyu Chen // Zknd: NIST Suite: AES Decryption 346768f5f91SYangyu Chen AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds , SelImm.X , xWen = T, canRobCompress = T), 347768f5f91SYangyu Chen AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm , SelImm.X , xWen = T, canRobCompress = T), 348768f5f91SYangyu Chen AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im , SelImm.X , xWen = T, canRobCompress = T), 349768f5f91SYangyu Chen AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T), 350768f5f91SYangyu Chen AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2 , SelImm.X , xWen = T, canRobCompress = T), 351768f5f91SYangyu Chen 352768f5f91SYangyu Chen // Zkne: NIST Suite: AES Encryption 353768f5f91SYangyu Chen // aes64ks1i, aes64ks2 is in Zknd 354768f5f91SYangyu Chen AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es , SelImm.X , xWen = T, canRobCompress = T), 355768f5f91SYangyu Chen AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm , SelImm.X , xWen = T, canRobCompress = T), 356768f5f91SYangyu Chen 357768f5f91SYangyu Chen // Zknh: NIST Suite: Hash Function Instructions 358768f5f91SYangyu Chen SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T, canRobCompress = T), 359768f5f91SYangyu Chen SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T, canRobCompress = T), 360768f5f91SYangyu Chen SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T, canRobCompress = T), 361768f5f91SYangyu Chen SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T, canRobCompress = T), 362768f5f91SYangyu Chen SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T, canRobCompress = T), 363768f5f91SYangyu Chen SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T, canRobCompress = T), 364768f5f91SYangyu Chen SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T, canRobCompress = T), 365768f5f91SYangyu Chen SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T, canRobCompress = T), 366768f5f91SYangyu Chen 367768f5f91SYangyu Chen // Zksed: ShangMi Suite: SM4 Block Cipher Instructions 368768f5f91SYangyu Chen SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0 , SelImm.X , xWen = T, canRobCompress = T), 369768f5f91SYangyu Chen SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1 , SelImm.X , xWen = T, canRobCompress = T), 370768f5f91SYangyu Chen SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2 , SelImm.X , xWen = T, canRobCompress = T), 371768f5f91SYangyu Chen SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3 , SelImm.X , xWen = T, canRobCompress = T), 372768f5f91SYangyu Chen SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0 , SelImm.X , xWen = T, canRobCompress = T), 373768f5f91SYangyu Chen SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1 , SelImm.X , xWen = T, canRobCompress = T), 374768f5f91SYangyu Chen SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2 , SelImm.X , xWen = T, canRobCompress = T), 375768f5f91SYangyu Chen SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3 , SelImm.X , xWen = T, canRobCompress = T), 376768f5f91SYangyu Chen 377768f5f91SYangyu Chen // Zksh: ShangMi Suite: SM3 Hash Function Instructions 378768f5f91SYangyu Chen SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0 , SelImm.X , xWen = T, canRobCompress = T), 379768f5f91SYangyu Chen SM3P1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p1 , SelImm.X , xWen = T, canRobCompress = T), 3804d24c305SYikeZhou ) 381be25371aSYikeZhou} 382be25371aSYikeZhou 383be25371aSYikeZhou/** 384be25371aSYikeZhou * FP Decode constants 385be25371aSYikeZhou */ 38657a10886SXuan Huobject FpDecode extends DecodeConstants{ 38757a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 38857a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 38957a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 39057a10886SXuan Hu FSW -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S ), 39157a10886SXuan Hu FSD -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S ), 3924d24c305SYikeZhou 393964d9a87SZiyue Zhang FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T), 394964d9a87SZiyue Zhang FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T), 395c2a8ae00SYikeZhou 3964d24c305SYikeZhou // Int to FP 39789cc69c1STang Haojin FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39889cc69c1STang Haojin FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39989cc69c1STang Haojin FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40089cc69c1STang Haojin FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4014d24c305SYikeZhou 40289cc69c1STang Haojin FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40389cc69c1STang Haojin FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40489cc69c1STang Haojin FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40589cc69c1STang Haojin FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4064d24c305SYikeZhou 4074d24c305SYikeZhou ) 408be25371aSYikeZhou} 409be25371aSYikeZhou 410be25371aSYikeZhou/** 411be25371aSYikeZhou * FP Divide SquareRoot Constants 412be25371aSYikeZhou */ 413be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 41457a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 41589cc69c1STang Haojin FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41689cc69c1STang Haojin FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41789cc69c1STang Haojin FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41889cc69c1STang Haojin FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 4194d24c305SYikeZhou ) 420be25371aSYikeZhou} 421be25371aSYikeZhou 4224d24c305SYikeZhou/** 423af2f7849Shappy-lx * Svinval extension Constants 424af2f7849Shappy-lx */ 425af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 42657a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 427af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 428af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 429af2f7849Shappy-lx */ 43057a10886SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X), 431af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 432af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 433af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 434af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 435af2f7849Shappy-lx */ 43657a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 437af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 438af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 439af2f7849Shappy-lx * then dispatch and issue this instrucion 440af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 441af2f7849Shappy-lx */ 44257a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 443af2f7849Shappy-lx /* what is Svinval extension ? 444af2f7849Shappy-lx * -----> sfecne.w.inval 445af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 446af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 447af2f7849Shappy-lx * -----> sfecne.inval.ir 448af2f7849Shappy-lx * 449af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 450af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 451af2f7849Shappy-lx */ 452af2f7849Shappy-lx ) 453af2f7849Shappy-lx} 45457a10886SXuan Hu 455af2f7849Shappy-lx/* 456ca18a0b4SWilliam Wang * CBO decode 457ca18a0b4SWilliam Wang */ 458ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 45957a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 46057a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 46157a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 46257a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 46357a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 464ca18a0b4SWilliam Wang ) 465ca18a0b4SWilliam Wang} 466ca18a0b4SWilliam Wang 467d0de7e4aSpeixiaokun/* 468d0de7e4aSpeixiaokun * Hypervisor decode 469d0de7e4aSpeixiaokun */ 470d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants { 471e25e4d90SXuan Hu override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 472e25e4d90SXuan Hu HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 473e25e4d90SXuan Hu HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 474e25e4d90SXuan Hu HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X), 475e25e4d90SXuan Hu HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X), 476e25e4d90SXuan Hu HLV_B -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvb, SelImm.X, xWen = T), 477e25e4d90SXuan Hu HLV_BU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvbu, SelImm.X, xWen = T), 478e25e4d90SXuan Hu HLV_D -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvd, SelImm.X, xWen = T), 479e25e4d90SXuan Hu HLV_H -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvh, SelImm.X, xWen = T), 480e25e4d90SXuan Hu HLV_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvhu, SelImm.X, xWen = T), 481e25e4d90SXuan Hu HLV_W -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvw, SelImm.X, xWen = T), 482e25e4d90SXuan Hu HLV_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvwu, SelImm.X, xWen = T), 483e25e4d90SXuan Hu HLVX_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxhu, SelImm.X, xWen = T), 484e25e4d90SXuan Hu HLVX_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxwu, SelImm.X, xWen = T), 485e25e4d90SXuan Hu HSV_B -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvb, SelImm.X), 486e25e4d90SXuan Hu HSV_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvd, SelImm.X), 487e25e4d90SXuan Hu HSV_H -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvh, SelImm.X), 488e25e4d90SXuan Hu HSV_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvw, SelImm.X), 489d0de7e4aSpeixiaokun ) 490d0de7e4aSpeixiaokun} 491d0de7e4aSpeixiaokun 492545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants { 493545d7be0SYangyu Chen override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 494545d7be0SYangyu Chen CZERO_EQZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T), 495545d7be0SYangyu Chen CZERO_NEZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T), 496545d7be0SYangyu Chen ) 497545d7be0SYangyu Chen} 498545d7be0SYangyu Chen 499ca18a0b4SWilliam Wang/** 5004d24c305SYikeZhou * XiangShan Trap Decode constants 5014d24c305SYikeZhou */ 5024d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 503361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 50457a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 50557a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 5064d24c305SYikeZhou ) 5074d24c305SYikeZhou} 508be25371aSYikeZhou 50949f433deSXuan Huabstract class Imm(val len: Int) { 510b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 511b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 512b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 513b0ae3ac4SLinJiawei} 514b0ae3ac4SLinJiawei 515b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 516fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 517b0ae3ac4SLinJiawei 518b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 519b0ae3ac4SLinJiawei Cat(instr(31, 20)) 520b0ae3ac4SLinJiawei} 521b0ae3ac4SLinJiawei 522b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 523b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 524b0ae3ac4SLinJiawei 525b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 526b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 527b0ae3ac4SLinJiawei} 528b0ae3ac4SLinJiawei 529b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 530b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 531b0ae3ac4SLinJiawei 532b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 533b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 534b0ae3ac4SLinJiawei} 535b0ae3ac4SLinJiawei 536b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 537fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 538b0ae3ac4SLinJiawei 539b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 540b0ae3ac4SLinJiawei instr(31, 12) 541c2a8ae00SYikeZhou } 542c2a8ae00SYikeZhou} 543c2a8ae00SYikeZhou 544b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 545b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 546b0ae3ac4SLinJiawei 547b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 548b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 549b0ae3ac4SLinJiawei } 550b0ae3ac4SLinJiawei} 551b0ae3ac4SLinJiawei 552b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){ 553b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 554b0ae3ac4SLinJiawei 555b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 556b0ae3ac4SLinJiawei Cat(instr(19, 15), instr(31, 20)) 557b0ae3ac4SLinJiawei } 558b0ae3ac4SLinJiawei} 559b0ae3ac4SLinJiawei 560ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 561ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 562ee8ff153Szfw 563ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 564ee8ff153Szfw instr(25, 20) 565ee8ff153Szfw } 566ee8ff153Szfw} 567ee8ff153Szfw 56858c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 56958c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 57058c35d23Shuxuan0307 57158c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 57258c35d23Shuxuan0307 instr(19, 15) 57358c35d23Shuxuan0307 } 57458c35d23Shuxuan0307} 575b52d4755SXuan Hu 57658c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 57758c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 57858c35d23Shuxuan0307 57958c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 58058c35d23Shuxuan0307 instr(19, 15) 58158c35d23Shuxuan0307 } 58258c35d23Shuxuan0307} 583b52d4755SXuan Hu 5844aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 5854aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 5864aa9ed34Sfdy 5874aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 5884aa9ed34Sfdy instr(30, 20) 5894aa9ed34Sfdy } 590e6ac7fe1SZiyue Zhang /** 591e6ac7fe1SZiyue Zhang * get VType from extended imm 592e6ac7fe1SZiyue Zhang * @param extedImm 593e6ac7fe1SZiyue Zhang * @return VType 594e6ac7fe1SZiyue Zhang */ 595e6ac7fe1SZiyue Zhang def getVType(extedImm: UInt): InstVType = { 596e6ac7fe1SZiyue Zhang val vtype = Wire(new InstVType) 597e6ac7fe1SZiyue Zhang vtype := extedImm(10, 0).asTypeOf(new InstVType) 598e6ac7fe1SZiyue Zhang vtype 599e6ac7fe1SZiyue Zhang } 6004aa9ed34Sfdy} 601b52d4755SXuan Hu 602e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){ 6034aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6044aa9ed34Sfdy 6054aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6065c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 607b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 608e6ac7fe1SZiyue Zhang val vtype8 = rvInst.ZIMM_VSETIVLI 609b52d4755SXuan Hu Cat(uimm5, vtype8) 610b52d4755SXuan Hu } 611b52d4755SXuan Hu /** 612b52d4755SXuan Hu * get VType from extended imm 613b52d4755SXuan Hu * @param extedImm 614b52d4755SXuan Hu * @return VType 615b52d4755SXuan Hu */ 616b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 617b52d4755SXuan Hu val vtype = Wire(new InstVType) 618e6ac7fe1SZiyue Zhang vtype := extedImm(9, 0).asTypeOf(new InstVType) 619b52d4755SXuan Hu vtype 620b52d4755SXuan Hu } 621b52d4755SXuan Hu 622b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 623e6ac7fe1SZiyue Zhang extedImm(14, 10) 6244aa9ed34Sfdy } 6254aa9ed34Sfdy} 626fe528fd6Ssinsanction 627fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){ 628fe528fd6Ssinsanction override def do_toImm32(minBits: UInt): UInt = minBits(31, 0) 629fe528fd6Ssinsanction 630fe528fd6Ssinsanction override def minBitsFromInstr(instr: UInt): UInt = { 631fe528fd6Ssinsanction instr(31, 0) 632fe528fd6Ssinsanction } 633fe528fd6Ssinsanction} 634fe528fd6Ssinsanction 6357e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){ 6367e30d16cSZhaoyang You override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 6377e30d16cSZhaoyang You 6387e30d16cSZhaoyang You override def minBitsFromInstr(instr: UInt): UInt = { 6397e30d16cSZhaoyang You Cat(instr(26), instr(19, 15)) 6407e30d16cSZhaoyang You } 6417e30d16cSZhaoyang You} 6427e30d16cSZhaoyang You 643b0ae3ac4SLinJiaweiobject ImmUnion { 644b0ae3ac4SLinJiawei val I = Imm_I() 645b0ae3ac4SLinJiawei val S = Imm_S() 646b0ae3ac4SLinJiawei val B = Imm_B() 647b0ae3ac4SLinJiawei val U = Imm_U() 648b0ae3ac4SLinJiawei val J = Imm_J() 649b0ae3ac4SLinJiawei val Z = Imm_Z() 650ee8ff153Szfw val B6 = Imm_B6() 65158c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 65258c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 6534aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 6544aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 655fe528fd6Ssinsanction val LUI32 = Imm_LUI32() 6567e30d16cSZhaoyang You val VRORVI = Imm_VRORVI() 6574aa9ed34Sfdy 658520f7dacSsinsanction // do not add special type lui32 to this, keep ImmUnion max len being 20. 6597e30d16cSZhaoyang You val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI) 660b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 661b0ae3ac4SLinJiawei val immSelMap = Seq( 662b0ae3ac4SLinJiawei SelImm.IMM_I, 663b0ae3ac4SLinJiawei SelImm.IMM_S, 664b0ae3ac4SLinJiawei SelImm.IMM_SB, 665b0ae3ac4SLinJiawei SelImm.IMM_U, 666b0ae3ac4SLinJiawei SelImm.IMM_UJ, 667ee8ff153Szfw SelImm.IMM_Z, 66858c35d23Shuxuan0307 SelImm.IMM_B6, 66958c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 6704aa9ed34Sfdy SelImm.IMM_OPIVIU, 6714aa9ed34Sfdy SelImm.IMM_VSETVLI, 672fe528fd6Ssinsanction SelImm.IMM_VSETIVLI, 6737e30d16cSZhaoyang You SelImm.IMM_VRORVI, 674b0ae3ac4SLinJiawei ).zip(imms) 675b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 676b0ae3ac4SLinJiawei} 677b0ae3ac4SLinJiawei 678fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 679fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 680fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 681765e58c6Ssinsanction Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm) 682fd7603d9SYinan Xu } 6833b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 684fd7603d9SYinan Xu val loadImmLen = Imm_I().len 6853b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 686f4dcd9fcSsinsanction Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0)) 687fd7603d9SYinan Xu } 688fd7603d9SYinan Xu} 689b0ae3ac4SLinJiawei 690be25371aSYikeZhou/** 691be25371aSYikeZhou * IO bundle for the Decode unit 692be25371aSYikeZhou */ 693aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle { 694aaa08c5aSxiaofeibao-xjtu val decodedInst = Output(new DecodedInst) 695aaa08c5aSxiaofeibao-xjtu val isComplex = Output(Bool()) 696aaa08c5aSxiaofeibao-xjtu val uopInfo = Output(new UopInfo) 697aaa08c5aSxiaofeibao-xjtu} 6982225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 6993b739f49SXuan Hu val enq = new Bundle { 7003b739f49SXuan Hu val ctrlFlow = Input(new StaticInst) 701d91483a6Sfdy val vtype = Input(new VType) 7025110577fSZiyue Zhang val vstart = Input(Vl()) 7034aa9ed34Sfdy } 7043b739f49SXuan Hu// val vconfig = Input(UInt(XLEN.W)) 705aaa08c5aSxiaofeibao-xjtu val deq = new DecodeUnitDeqIO 706af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 707be25371aSYikeZhou} 708be25371aSYikeZhou 709be25371aSYikeZhou/** 710be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 711be25371aSYikeZhou */ 7122225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 713be25371aSYikeZhou val io = IO(new DecodeUnitIO) 714be25371aSYikeZhou 7153b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 716be25371aSYikeZhou 71775e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 71875e2c883SXuan Hu 71957a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 72057a10886SXuan Hu FpDecode.table ++ 721bdda74fdSxiaofeibao-xjtu// FDivSqrtDecode.table ++ 722768f5f91SYangyu Chen BitmanipDecode.table ++ 723768f5f91SYangyu Chen ScalarCryptoDecode.table ++ 724a19215ddSYinan Xu XSTrapDecode.table ++ 725a19215ddSYinan Xu CBODecode.table ++ 726b65b9ebaSXuan Hu SvinvalDecode.table ++ 727e25e4d90SXuan Hu HypervisorDecode.table ++ 728545d7be0SYangyu Chen VecDecoder.table ++ 729545d7be0SYangyu Chen ZicondDecode.table 730b65b9ebaSXuan Hu 73189cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 732a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 733239413e5SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue 734a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 735a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 736be25371aSYikeZhou 7374d24c305SYikeZhou // output 7383b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 739be25371aSYikeZhou 7402ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 7417ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 7423b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 7431a1319cbSLinJiawei 7443b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 7453b739f49SXuan Hu 746a8db15d8Sfdy decodedInst.uopIdx := 0.U 747d91483a6Sfdy decodedInst.firstUop := true.B 748d91483a6Sfdy decodedInst.lastUop := true.B 749f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 7503235a9d8SZiyue-Zhang decodedInst.numWB := 1.U 751deb6421eSHaojin Tang 75273c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 753f7af4c74Schengguanghui decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep 75473c4359eSYikeZhou 75549a2cda2SXuan Hu // fmadd - b1000011 75649a2cda2SXuan Hu // fmsub - b1000111 75749a2cda2SXuan Hu // fnmsub- b1001011 75849a2cda2SXuan Hu // fnmadd- b1001111 75949a2cda2SXuan Hu private val isFMA = inst.OPCODE === BitPat("b100??11") 760e8b68a8eSgood-circle private val isVppu = FuType.isVppu(decodedInst.fuType) 761e8b68a8eSgood-circle private val isVecOPF = FuType.isVecOPF(decodedInst.fuType) 76249a2cda2SXuan Hu 763178dd38cSYikeZhou // read src1~3 location 76498cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 76598cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 76649a2cda2SXuan Hu // src(2) of fma is fs3, src(2) of vector inst is old vd 76749a2cda2SXuan Hu decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD) 7689c5a1080Sxiaofeibao decodedInst.lsrc(3) := V0_IDX.U 7699c5a1080Sxiaofeibao decodedInst.lsrc(4) := Vl_IDX.U 770b6b11f60SXuan Hu 771178dd38cSYikeZhou // read dest location 77298cfe81bSxgkiri decodedInst.ldest := inst.RD 7734d24c305SYikeZhou 774e4e68f86Sxiaofeibao // init v0Wen vlWen 775e4e68f86Sxiaofeibao decodedInst.v0Wen := false.B 776e4e68f86Sxiaofeibao decodedInst.vlWen := false.B 777e4e68f86Sxiaofeibao 778c2a8ae00SYikeZhou // fill in exception vector 779567f0269Ssinsanction val vecException = Module(new VecExceptionGen) 780567f0269Ssinsanction vecException.io.inst := io.enq.ctrlFlow.instr 781567f0269Ssinsanction vecException.io.decodedInst := decodedInst 782bdda74fdSxiaofeibao-xjtu vecException.io.vtype := decodedInst.vpu.vtype 7835110577fSZiyue Zhang vecException.io.vstart := decodedInst.vpu.vstart 784567f0269Ssinsanction decodedInst.exceptionVec(illegalInstr) := decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst 7854d24c305SYikeZhou 786af2f7849Shappy-lx when (!io.csrCtrl.svinval_enable) { 787567f0269Ssinsanction val base_ii = decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst 788af2f7849Shappy-lx val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr 789af2f7849Shappy-lx val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr 790af2f7849Shappy-lx val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr 791d0de7e4aSpeixiaokun val hinval_gvma = HINVAL_GVMA === ctrl_flow.instr 792d0de7e4aSpeixiaokun val hinval_vvma = HINVAL_VVMA === ctrl_flow.instr 793d0de7e4aSpeixiaokun val svinval_ii = sinval || w_inval || inval_ir || hinval_gvma || hinval_vvma 7943b739f49SXuan Hu decodedInst.exceptionVec(illegalInstr) := base_ii || svinval_ii 7953b739f49SXuan Hu decodedInst.flushPipe := false.B 796af2f7849Shappy-lx } 797af2f7849Shappy-lx 798d0de7e4aSpeixiaokun when(io.csrCtrl.virtMode){ 799e25e4d90SXuan Hu // Todo: optimize EX_VI decode 800d0de7e4aSpeixiaokun // vs/vu attempting to exec hyperinst will raise virtual instruction 801e25e4d90SXuan Hu decodedInst.exceptionVec(virtualInstr) := ctrl_flow.instr === HLV_B || ctrl_flow.instr === HLV_BU || 802d0de7e4aSpeixiaokun ctrl_flow.instr === HLV_H || ctrl_flow.instr === HLV_HU || 803d0de7e4aSpeixiaokun ctrl_flow.instr === HLVX_HU || ctrl_flow.instr === HLV_W || 804d0de7e4aSpeixiaokun ctrl_flow.instr === HLVX_WU || ctrl_flow.instr === HLV_WU || 805d0de7e4aSpeixiaokun ctrl_flow.instr === HLV_D || ctrl_flow.instr === HSV_B || 806d0de7e4aSpeixiaokun ctrl_flow.instr === HSV_H || ctrl_flow.instr === HSV_W || 807d0de7e4aSpeixiaokun ctrl_flow.instr === HSV_D || ctrl_flow.instr === HFENCE_VVMA || 808d0de7e4aSpeixiaokun ctrl_flow.instr === HFENCE_GVMA || ctrl_flow.instr === HINVAL_GVMA || 809d0de7e4aSpeixiaokun ctrl_flow.instr === HINVAL_VVMA 810d0de7e4aSpeixiaokun } 811d0de7e4aSpeixiaokun 8123b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 813b0ae3ac4SLinJiawei x => { 8147ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 815b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 816b0ae3ac4SLinJiawei x._1 -> minBits 817b0ae3ac4SLinJiawei } 818b0ae3ac4SLinJiawei )) 819aac4464eSYinan Xu 8207531c765SXuan Hu private val isLs = FuType.isLoadStore(decodedInst.fuType) 8217531c765SXuan Hu private val isVls = FuType.isVls(decodedInst.fuType) 8227531c765SXuan Hu private val isStore = FuType.isStore(decodedInst.fuType) 8237531c765SXuan Hu private val isAMO = FuType.isAMO(decodedInst.fuType) 8247531c765SXuan Hu private val isVStore = FuType.isVStore(decodedInst.fuType) 8257531c765SXuan Hu private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType) 8267531c765SXuan Hu 8277531c765SXuan Hu decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch) 82875e2c883SXuan Hu 82975e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 830be25371aSYikeZhou 8310bca6cb3SZiyue Zhang private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S) 83239c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 83339c388b5SXuan Hu private val narrowInsts = Seq( 83439c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 83539c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 83639c388b5SXuan Hu ) 83739c388b5SXuan Hu private val maskDstInsts = Seq( 83839c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 83939c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 84039c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 8419eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 8429eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 8439eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 8449eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 845f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 84639c388b5SXuan Hu ) 84730fcc710SZiyue Zhang private val maskOpInsts = Seq( 84830fcc710SZiyue Zhang VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 84930fcc710SZiyue Zhang ) 85094e6af68SZiyue-Zhang private val vmaInsts = Seq( 85194e6af68SZiyue-Zhang VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX, 85294e6af68SZiyue-Zhang VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX, 85394e6af68SZiyue-Zhang ) 854bdda74fdSxiaofeibao-xjtu private val wfflagsInsts = Seq( 855bdda74fdSxiaofeibao-xjtu // opfff 856bdda74fdSxiaofeibao-xjtu FADD_S, FSUB_S, FADD_D, FSUB_D, 857bdda74fdSxiaofeibao-xjtu FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, 858bdda74fdSxiaofeibao-xjtu FMIN_S, FMAX_S, FMIN_D, FMAX_D, 859bdda74fdSxiaofeibao-xjtu FMUL_S, FMUL_D, 860bdda74fdSxiaofeibao-xjtu FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, 861bdda74fdSxiaofeibao-xjtu FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, 862bdda74fdSxiaofeibao-xjtu FSGNJ_S, FSGNJN_S, FSGNJX_S, 863bdda74fdSxiaofeibao-xjtu // opfvv 864bdda74fdSxiaofeibao-xjtu VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV, 865bdda74fdSxiaofeibao-xjtu VFMUL_VV, VFDIV_VV, VFWMUL_VV, 866bdda74fdSxiaofeibao-xjtu VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV, 867bdda74fdSxiaofeibao-xjtu VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV, 868bdda74fdSxiaofeibao-xjtu VFSQRT_V, 869bdda74fdSxiaofeibao-xjtu VFMIN_VV, VFMAX_VV, 870bdda74fdSxiaofeibao-xjtu VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV, 871bdda74fdSxiaofeibao-xjtu VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV, 872bdda74fdSxiaofeibao-xjtu // opfvf 873bdda74fdSxiaofeibao-xjtu VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF, 874bdda74fdSxiaofeibao-xjtu VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF, 875bdda74fdSxiaofeibao-xjtu VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF, 876bdda74fdSxiaofeibao-xjtu VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF, 877bdda74fdSxiaofeibao-xjtu VFMIN_VF, VFMAX_VF, 878bdda74fdSxiaofeibao-xjtu VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF, 879bdda74fdSxiaofeibao-xjtu VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF, 880aab8ef9cSxiaofeibao-xjtu // vfred 881aab8ef9cSxiaofeibao-xjtu VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS, 882bdda74fdSxiaofeibao-xjtu // fcvt & vfcvt 883bdda74fdSxiaofeibao-xjtu FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU, 884bdda74fdSxiaofeibao-xjtu FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 885bdda74fdSxiaofeibao-xjtu FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU, 886bdda74fdSxiaofeibao-xjtu FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 887ba899681Schengguanghui 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, 888ba899681Schengguanghui 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, 889ba899681Schengguanghui 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, 890ba899681Schengguanghui VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V, 891bdda74fdSxiaofeibao-xjtu ) 892bdda74fdSxiaofeibao-xjtu decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _) 893bdda74fdSxiaofeibao-xjtu val fpToVecDecoder = Module(new FPToVecDecoder()) 894bdda74fdSxiaofeibao-xjtu fpToVecDecoder.io.instr := inst.asUInt 895bdda74fdSxiaofeibao-xjtu val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst 8963b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 897bdda74fdSxiaofeibao-xjtu when(isFpToVecInst){ 898bdda74fdSxiaofeibao-xjtu decodedInst.vpu := fpToVecDecoder.io.vpuCtrl 899bdda74fdSxiaofeibao-xjtu }.otherwise{ 90075e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 90175e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 90275e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 90375e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 90475e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 90575e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 90675e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 907d9355d3aSZiyue-Zhang decodedInst.vpu.veew := inst.WIDTH 90894e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 90939c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 910b6279fc6SZiyue Zhang val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _) 911b6279fc6SZiyue Zhang val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 912b6279fc6SZiyue Zhang val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _) 913b6279fc6SZiyue Zhang val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe 914dab1ad8cSsinsanction val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse 915dab1ad8cSsinsanction val isVlm = decodedInst.fuOpType === VlduType.vlm 916d8ceb649SZiyue Zhang val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV 91794e6af68SZiyue-Zhang val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _) 918dab1ad8cSsinsanction val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew 919b6279fc6SZiyue Zhang decodedInst.vpu.isNarrow := isNarrow 920b6279fc6SZiyue Zhang decodedInst.vpu.isDstMask := isDstMask 921b6279fc6SZiyue Zhang decodedInst.vpu.isOpMask := isOpMask 92294e6af68SZiyue-Zhang decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma 923dab1ad8cSsinsanction decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac 9245110577fSZiyue Zhang decodedInst.vpu.vstart := io.enq.vstart 925bdda74fdSxiaofeibao-xjtu } 92675e2c883SXuan Hu 92731c51290Szhanglinjuan decodedInst.vlsInstr := isVls 92831c51290Szhanglinjuan 9296d56ac16Ssinsanction decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src 9306d56ac16Ssinsanction decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig 9316d56ac16Ssinsanction 9327f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 93387dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 93487dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 93506cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 93687dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 9370a34fc22SZiyue Zhang uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0) 938c4501a6fSZiyue-Zhang uopInfoGen.io.in.preInfo.nf := inst.NF 93906cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr 940c90e3eacSZiyue Zhang uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm 9417f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 9427f9f0a79SzhanglyGit io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop 9433235a9d8SZiyue-Zhang io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB 9447f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 9457f9f0a79SzhanglyGit 94687c5d21dSZiyue Zhang // for csrr vl instruction, convert to vsetvl 94787c5d21dSZiyue Zhang val Vl = 0xC20.U 94863cb3754SZiyue Zhang val Vlenb = 0xC22.U 94963cb3754SZiyue Zhang val isCsrInst = FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) 95063cb3754SZiyue Zhang // rs1 is x0 or uimm == 0 95163cb3754SZiyue Zhang val isCsrRead = (decodedInst.fuOpType === CSROpType.set || decodedInst.fuOpType === CSROpType.clr) && inst.RS1 === 0.U 95263cb3754SZiyue Zhang val isCsrrVl = isCsrInst && isCsrRead && inst.CSRIDX === Vl 95363cb3754SZiyue Zhang val isCsrrVlenb = isCsrInst && isCsrRead && inst.CSRIDX === Vlenb 95487c5d21dSZiyue Zhang when (isCsrrVl) { 95563cb3754SZiyue Zhang // convert to vsetvl instruction 95687c5d21dSZiyue Zhang decodedInst.srcType(0) := SrcType.no 95787c5d21dSZiyue Zhang decodedInst.srcType(1) := SrcType.no 95887c5d21dSZiyue Zhang decodedInst.srcType(2) := SrcType.no 95987c5d21dSZiyue Zhang decodedInst.srcType(3) := SrcType.no 96087c5d21dSZiyue Zhang decodedInst.srcType(4) := SrcType.vp 96187c5d21dSZiyue Zhang decodedInst.lsrc(4) := Vl_IDX.U 96263cb3754SZiyue Zhang decodedInst.waitForward := false.B 96387c5d21dSZiyue Zhang decodedInst.blockBackward := false.B 96463cb3754SZiyue Zhang }.elsewhen(isCsrrVlenb){ 96563cb3754SZiyue Zhang // convert to addi instruction 966828a8a48SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 967828a8a48SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 96863cb3754SZiyue Zhang decodedInst.srcType(2) := SrcType.no 96963cb3754SZiyue Zhang decodedInst.srcType(3) := SrcType.no 97063cb3754SZiyue Zhang decodedInst.srcType(4) := SrcType.no 97163cb3754SZiyue Zhang decodedInst.selImm := SelImm.IMM_I 97263cb3754SZiyue Zhang decodedInst.waitForward := false.B 97363cb3754SZiyue Zhang decodedInst.blockBackward := false.B 97463cb3754SZiyue Zhang decodedInst.canRobCompress := true.B 97587c5d21dSZiyue Zhang } 97687c5d21dSZiyue Zhang 97775e2c883SXuan Hu io.deq.decodedInst := decodedInst 9789faa51afSxiaofeibao-xjtu io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen 979985804e6SXuan Hu // change vlsu to vseglsu when NF =/= 0.U 980985804e6SXuan Hu io.deq.decodedInst.fuType := Mux1H(Seq( 98187c5d21dSZiyue Zhang ( isCsrrVl) -> FuType.vsetfwf.U, 98263cb3754SZiyue Zhang ( isCsrrVlenb) -> FuType.alu.U, 98363cb3754SZiyue Zhang (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType, 984f94f6503SXuan 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, 985f94f6503SXuan Hu // MOP === b00 && SUMOP === b01000: unit-stride whole register store 986f94f6503SXuan Hu // MOP =/= b00 : strided and indexed store 987f94f6503SXuan 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, 988f94f6503SXuan Hu // MOP === b00 && LUMOP === b01000: unit-stride whole register load 989f94f6503SXuan Hu // MOP =/= b00 : strided and indexed load 990f94f6503SXuan 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, 991985804e6SXuan Hu )) 99263cb3754SZiyue Zhang io.deq.decodedInst.fuOpType := Mux(isCsrrVlenb, ALUOpType.add, decodedInst.fuOpType) 99363cb3754SZiyue Zhang io.deq.decodedInst.imm := Mux(isCsrrVlenb, (VLEN / 8).U, decodedInst.imm) 994be25371aSYikeZhou //------------------------------------------------------------- 995be25371aSYikeZhou // Debug Info 9963b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 9973b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 9983b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 9993b739f49SXuan 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", 10003b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 10013b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 10023b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 10033b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 10043b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 10053b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 10063b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 10073b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 1008be25371aSYikeZhou} 1009