1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 17be25371aSYikeZhoupackage xiangshan.backend.decode 18be25371aSYikeZhou 198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters 20be25371aSYikeZhouimport chisel3._ 21be25371aSYikeZhouimport chisel3.util._ 22cc1eb70dSXuan Huimport freechips.rocketchip.rocket.CSRs 233b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._ 246ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat 253c02ee8fSwakafaimport utility._ 263b739f49SXuan Huimport utils._ 275a9dd560SXuan Huimport xiangshan.ExceptionNO.{EX_II, breakPoint, illegalInstr, virtualInstr} 286ab6918fSYinan Xuimport xiangshan._ 29730cfbc0SXuan Huimport xiangshan.backend.fu.FuType 30730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst} 311be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions 32cc1eb70dSXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, OPCODE5Bit, XSInstBitFields} 335110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl} 3415ed99a7SXuan Huimport xiangshan.backend.fu.wrapper.CSRToDecode 35499d2763SZiyue Zhangimport xiangshan.backend.decode.Zimop._ 36*20b2b626SsinceforYyimport yunsuan.{VfaluType, VfcvtType} 37be25371aSYikeZhou 38be25371aSYikeZhou/** 39be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/ 40be25371aSYikeZhou */ 41be25371aSYikeZhouabstract trait DecodeConstants { 42361e6d51SJiuyang Liu // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt. 4357a10886SXuan Hu def X = BitPat("b0") 444d24c305SYikeZhou def N = BitPat("b0") 454d24c305SYikeZhou def Y = BitPat("b1") 4657a10886SXuan Hu def T = true 4757a10886SXuan Hu def F = false 484d24c305SYikeZhou 49c2a8ae00SYikeZhou def decodeDefault: List[BitPat] = // illegal instruction 5020e31bd1SYinan Xu // srcType(0) srcType(1) srcType(2) fuType fuOpType rfWen 514d24c305SYikeZhou // | | | | | | fpWen 5257a10886SXuan Hu // | | | | | | | vecWen 5357a10886SXuan Hu // | | | | | | | | isXSTrap 5457a10886SXuan Hu // | | | | | | | | | noSpecExec 5557a10886SXuan Hu // | | | | | | | | | | blockBackward 5657a10886SXuan Hu // | | | | | | | | | | | flushPipe 5789cc69c1STang Haojin // | | | | | | | | | | | | canRobCompress 5889cc69c1STang Haojin // | | | | | | | | | | | | | uopSplitType 5989cc69c1STang Haojin // | | | | | | | | | | | | | | selImm 6089cc69c1STang 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 614d24c305SYikeZhou 6257a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] 6357a10886SXuan Hu final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate())) 64be25371aSYikeZhou} 65be25371aSYikeZhou 66c2a8ae00SYikeZhoutrait DecodeUnitConstants 674d24c305SYikeZhou{ 684d24c305SYikeZhou // abstract out instruction decode magic numbers 694d24c305SYikeZhou val RD_MSB = 11 704d24c305SYikeZhou val RD_LSB = 7 714d24c305SYikeZhou val RS1_MSB = 19 724d24c305SYikeZhou val RS1_LSB = 15 734d24c305SYikeZhou val RS2_MSB = 24 744d24c305SYikeZhou val RS2_LSB = 20 754d24c305SYikeZhou val RS3_MSB = 31 764d24c305SYikeZhou val RS3_LSB = 27 774d24c305SYikeZhou} 784d24c305SYikeZhou 79be25371aSYikeZhou/** 80be25371aSYikeZhou * Decoded control signals 814d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala 82be25371aSYikeZhou */ 83c2a8ae00SYikeZhou 8457a10886SXuan Huabstract class XSDecodeBase { 8557a10886SXuan Hu def X = BitPat("b?") 8657a10886SXuan Hu def N = BitPat("b0") 8757a10886SXuan Hu def Y = BitPat("b1") 8857a10886SXuan Hu def T = true 8957a10886SXuan Hu def F = false 9057a10886SXuan Hu def generate() : List[BitPat] 9157a10886SXuan Hu} 9257a10886SXuan Hu 9357a10886SXuan Hucase class XSDecode( 9457a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 95239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat, 96e2695e90SzhanglyGit uopSplitType: BitPat = UopSplitType.X, 9757a10886SXuan Hu xWen: Boolean = false, 9857a10886SXuan Hu fWen: Boolean = false, 9957a10886SXuan Hu vWen: Boolean = false, 10057a10886SXuan Hu mWen: Boolean = false, 10157a10886SXuan Hu xsTrap: Boolean = false, 10257a10886SXuan Hu noSpec: Boolean = false, 10357a10886SXuan Hu blockBack: Boolean = false, 10457a10886SXuan Hu flushPipe: Boolean = false, 10589cc69c1STang Haojin canRobCompress: Boolean = false, 10657a10886SXuan Hu) extends XSDecodeBase { 10757a10886SXuan Hu def generate() : List[BitPat] = { 10889cc69c1STang 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) 10957a10886SXuan Hu } 11057a10886SXuan Hu} 11157a10886SXuan Hu 11257a10886SXuan Hucase class FDecode( 11357a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 114239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X, 11517ec87f2SXuan Hu uopSplitType: BitPat = UopSplitType.X, 11657a10886SXuan Hu xWen: Boolean = false, 11757a10886SXuan Hu fWen: Boolean = false, 11857a10886SXuan Hu vWen: Boolean = false, 11957a10886SXuan Hu mWen: Boolean = false, 12057a10886SXuan Hu xsTrap: Boolean = false, 12157a10886SXuan Hu noSpec: Boolean = false, 12257a10886SXuan Hu blockBack: Boolean = false, 12357a10886SXuan Hu flushPipe: Boolean = false, 12489cc69c1STang Haojin canRobCompress: Boolean = false, 12557a10886SXuan Hu) extends XSDecodeBase { 12657a10886SXuan Hu def generate() : List[BitPat] = { 12789cc69c1STang Haojin XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate() 12857a10886SXuan Hu } 12957a10886SXuan Hu} 13057a10886SXuan Hu 131be25371aSYikeZhou/** 132be25371aSYikeZhou * Overall Decode constants 133be25371aSYikeZhou */ 134be25371aSYikeZhouobject XDecode extends DecodeConstants { 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 211fa16cf81Slewislzh CSRRW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 212fa16cf81Slewislzh CSRRS -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 213fa16cf81Slewislzh CSRRC -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2144d24c305SYikeZhou 21557a10886SXuan Hu CSRRWI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21657a10886SXuan Hu CSRRSI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21757a10886SXuan Hu CSRRCI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2184d24c305SYikeZhou 21957a10886SXuan Hu EBREAK -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22057a10886SXuan Hu ECALL -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22157a10886SXuan Hu SRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22257a10886SXuan Hu MRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22357a10886SXuan Hu DRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22457a10886SXuan Hu WFI -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X , xWen = T, noSpec = T, blockBack = T), 2254d24c305SYikeZhou 22657a10886SXuan Hu SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22757a10886SXuan Hu FENCE_I -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22857a10886SXuan Hu FENCE -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 2294d24c305SYikeZhou 230768f5f91SYangyu Chen // RV64A 23157a10886SXuan Hu AMOADD_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23257a10886SXuan Hu AMOXOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23357a10886SXuan Hu AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23457a10886SXuan Hu AMOAND_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23557a10886SXuan Hu AMOOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23657a10886SXuan Hu AMOMIN_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23757a10886SXuan Hu AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23857a10886SXuan Hu AMOMAX_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23957a10886SXuan Hu AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2404d24c305SYikeZhou 24157a10886SXuan Hu AMOADD_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24257a10886SXuan Hu AMOXOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24357a10886SXuan Hu AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24457a10886SXuan Hu AMOAND_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24557a10886SXuan Hu AMOOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24657a10886SXuan Hu AMOMIN_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24757a10886SXuan Hu AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24857a10886SXuan Hu AMOMAX_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24957a10886SXuan Hu AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2504d24c305SYikeZhou 25157a10886SXuan Hu LR_W -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25257a10886SXuan Hu LR_D -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25357a10886SXuan Hu SC_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25457a10886SXuan Hu SC_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 255768f5f91SYangyu Chen ) 256768f5f91SYangyu Chen} 257ee8ff153Szfw 258768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{ 259768f5f91SYangyu Chen /* 260768f5f91SYangyu Chen Note: Some Bitmanip instruction may have different OP code between rv32 and rv64. 261768f5f91SYangyu Chen Including pseudo instruction like zext.h, and different funct12 like rev8. 262768f5f91SYangyu Chen If some day we need to support change XLEN via CSR, we should care about this. 263768f5f91SYangyu Chen */ 264768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 265768f5f91SYangyu Chen // Zba 266768f5f91SYangyu Chen ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T, canRobCompress = T), 267768f5f91SYangyu Chen SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T, canRobCompress = T), 268768f5f91SYangyu Chen SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T, canRobCompress = T), 269768f5f91SYangyu Chen SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T, canRobCompress = T), 270768f5f91SYangyu Chen SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T, canRobCompress = T), 271768f5f91SYangyu Chen SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T, canRobCompress = T), 272768f5f91SYangyu Chen SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T, canRobCompress = T), 273768f5f91SYangyu Chen SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T, canRobCompress = T), 274768f5f91SYangyu Chen 275768f5f91SYangyu Chen // Zbb 27689cc69c1STang Haojin ANDN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn , SelImm.X , xWen = T, canRobCompress = T), 27789cc69c1STang Haojin ORN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X , xWen = T, canRobCompress = T), 27889cc69c1STang Haojin XNOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor , SelImm.X , xWen = T, canRobCompress = T), 279ee8ff153Szfw 280768f5f91SYangyu Chen CLZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz , SelImm.X , xWen = T, canRobCompress = T), 281768f5f91SYangyu Chen CLZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw , SelImm.X , xWen = T, canRobCompress = T), 282768f5f91SYangyu Chen CTZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz , SelImm.X , xWen = T, canRobCompress = T), 283768f5f91SYangyu Chen CTZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw , SelImm.X , xWen = T, canRobCompress = T), 284768f5f91SYangyu Chen 285768f5f91SYangyu Chen CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop , SelImm.X , xWen = T, canRobCompress = T), 286768f5f91SYangyu Chen CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw , SelImm.X , xWen = T, canRobCompress = T), 287768f5f91SYangyu Chen 28889cc69c1STang Haojin MAX -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X , xWen = T, canRobCompress = T), 28989cc69c1STang Haojin MAXU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu , SelImm.X , xWen = T, canRobCompress = T), 290768f5f91SYangyu Chen MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X , xWen = T, canRobCompress = T), 291768f5f91SYangyu Chen MINU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu , SelImm.X , xWen = T, canRobCompress = T), 292ee8ff153Szfw 29389cc69c1STang Haojin SEXT_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sextb , SelImm.X , xWen = T, canRobCompress = T), 29489cc69c1STang Haojin SEXT_H -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sexth , SelImm.X , xWen = T, canRobCompress = T), 295768f5f91SYangyu Chen // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0. 296768f5f91SYangyu Chen // If we configured to have no Zbkb, we should add zext.h here. 297ee8ff153Szfw 298768f5f91SYangyu Chen ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol , SelImm.X , xWen = T, canRobCompress = T), 299768f5f91SYangyu Chen ROLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw , SelImm.X , xWen = T, canRobCompress = T), 30089cc69c1STang Haojin ROR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.X , xWen = T, canRobCompress = T), 30189cc69c1STang Haojin RORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.IMM_I, xWen = T, canRobCompress = T), 302768f5f91SYangyu Chen RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.IMM_I, xWen = T, canRobCompress = T), 303768f5f91SYangyu Chen RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.X , xWen = T, canRobCompress = T), 304ee8ff153Szfw 305768f5f91SYangyu Chen ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb , SelImm.X , xWen = T, canRobCompress = T), 306768f5f91SYangyu Chen 307768f5f91SYangyu Chen REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X , xWen = T, canRobCompress = T), 308768f5f91SYangyu Chen 309768f5f91SYangyu Chen // Zbc 310768f5f91SYangyu Chen CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul , SelImm.X , xWen = T, canRobCompress = T), 311768f5f91SYangyu Chen CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh , SelImm.X , xWen = T, canRobCompress = T), 312768f5f91SYangyu Chen CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr , SelImm.X , xWen = T, canRobCompress = T), 313768f5f91SYangyu Chen 314768f5f91SYangyu Chen // Zbs 315768f5f91SYangyu Chen BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.X , xWen = T, canRobCompress = T), 316768f5f91SYangyu Chen BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.IMM_I, xWen = T, canRobCompress = T), 317768f5f91SYangyu Chen BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.X , xWen = T, canRobCompress = T), 318768f5f91SYangyu Chen BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.IMM_I, xWen = T, canRobCompress = T), 319768f5f91SYangyu Chen BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.X , xWen = T, canRobCompress = T), 320768f5f91SYangyu Chen BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.IMM_I, xWen = T, canRobCompress = T), 321768f5f91SYangyu Chen BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.X , xWen = T, canRobCompress = T), 322768f5f91SYangyu Chen BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.IMM_I, xWen = T, canRobCompress = T), 323768f5f91SYangyu Chen 324768f5f91SYangyu Chen // Zbkb 325768f5f91SYangyu Chen // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb 326768f5f91SYangyu Chen PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X , xWen = T, canRobCompress = T), 327768f5f91SYangyu Chen PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh , SelImm.X , xWen = T, canRobCompress = T), 328768f5f91SYangyu Chen PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw , SelImm.X , xWen = T, canRobCompress = T), 329768f5f91SYangyu Chen BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X , xWen = T, canRobCompress = T), 330768f5f91SYangyu Chen // If configured to RV32, we should add zip and unzip. 331768f5f91SYangyu Chen 332768f5f91SYangyu Chen // Zbkc 333768f5f91SYangyu Chen // clmul, clmulh is in Zbc 334768f5f91SYangyu Chen 335768f5f91SYangyu Chen // Zbkx 336768f5f91SYangyu Chen XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn , SelImm.X , xWen = T, canRobCompress = T), 337768f5f91SYangyu Chen XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb , SelImm.X , xWen = T, canRobCompress = T), 338768f5f91SYangyu Chen ) 339768f5f91SYangyu Chen} 340768f5f91SYangyu Chen 341768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants { 342768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 343768f5f91SYangyu Chen // Zknd: NIST Suite: AES Decryption 344768f5f91SYangyu Chen AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds , SelImm.X , xWen = T, canRobCompress = T), 345768f5f91SYangyu Chen AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm , SelImm.X , xWen = T, canRobCompress = T), 346768f5f91SYangyu Chen AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im , SelImm.X , xWen = T, canRobCompress = T), 347768f5f91SYangyu Chen AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T), 348768f5f91SYangyu Chen AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2 , SelImm.X , xWen = T, canRobCompress = T), 349768f5f91SYangyu Chen 350768f5f91SYangyu Chen // Zkne: NIST Suite: AES Encryption 351768f5f91SYangyu Chen // aes64ks1i, aes64ks2 is in Zknd 352768f5f91SYangyu Chen AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es , SelImm.X , xWen = T, canRobCompress = T), 353768f5f91SYangyu Chen AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm , SelImm.X , xWen = T, canRobCompress = T), 354768f5f91SYangyu Chen 355768f5f91SYangyu Chen // Zknh: NIST Suite: Hash Function Instructions 356768f5f91SYangyu Chen SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T, canRobCompress = T), 357768f5f91SYangyu Chen SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T, canRobCompress = T), 358768f5f91SYangyu Chen SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T, canRobCompress = T), 359768f5f91SYangyu Chen SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T, canRobCompress = T), 360768f5f91SYangyu Chen SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T, canRobCompress = T), 361768f5f91SYangyu Chen SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T, canRobCompress = T), 362768f5f91SYangyu Chen SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T, canRobCompress = T), 363768f5f91SYangyu Chen SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T, canRobCompress = T), 364768f5f91SYangyu Chen 365768f5f91SYangyu Chen // Zksed: ShangMi Suite: SM4 Block Cipher Instructions 366768f5f91SYangyu Chen SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0 , SelImm.X , xWen = T, canRobCompress = T), 367768f5f91SYangyu Chen SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1 , SelImm.X , xWen = T, canRobCompress = T), 368768f5f91SYangyu Chen SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2 , SelImm.X , xWen = T, canRobCompress = T), 369768f5f91SYangyu Chen SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3 , SelImm.X , xWen = T, canRobCompress = T), 370768f5f91SYangyu Chen SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0 , SelImm.X , xWen = T, canRobCompress = T), 371768f5f91SYangyu Chen SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1 , SelImm.X , xWen = T, canRobCompress = T), 372768f5f91SYangyu Chen SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2 , SelImm.X , xWen = T, canRobCompress = T), 373768f5f91SYangyu Chen SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3 , SelImm.X , xWen = T, canRobCompress = T), 374768f5f91SYangyu Chen 375768f5f91SYangyu Chen // Zksh: ShangMi Suite: SM3 Hash Function Instructions 376768f5f91SYangyu Chen SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0 , SelImm.X , xWen = T, canRobCompress = T), 377768f5f91SYangyu Chen SM3P1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p1 , SelImm.X , xWen = T, canRobCompress = T), 3784d24c305SYikeZhou ) 379be25371aSYikeZhou} 380be25371aSYikeZhou 381be25371aSYikeZhou/** 382be25371aSYikeZhou * FP Decode constants 383be25371aSYikeZhou */ 38457a10886SXuan Huobject FpDecode extends DecodeConstants{ 38557a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 386b189aafaSzmx FLH -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T), 38757a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 38857a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 389b189aafaSzmx FSH -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S ), 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), 395b189aafaSzmx FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T), 396c2a8ae00SYikeZhou 3974d24c305SYikeZhou // Int to FP 39889cc69c1STang Haojin FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39989cc69c1STang Haojin FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40089cc69c1STang Haojin FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40189cc69c1STang Haojin FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4024d24c305SYikeZhou 40389cc69c1STang Haojin FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40489cc69c1STang Haojin FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40589cc69c1STang Haojin FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40689cc69c1STang Haojin FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4074d24c305SYikeZhou 4084d24c305SYikeZhou ) 409be25371aSYikeZhou} 410be25371aSYikeZhou 411be25371aSYikeZhou/** 412be25371aSYikeZhou * FP Divide SquareRoot Constants 413be25371aSYikeZhou */ 414be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 41557a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 41689cc69c1STang Haojin FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41789cc69c1STang Haojin FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41889cc69c1STang Haojin FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41989cc69c1STang Haojin FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 4204d24c305SYikeZhou ) 421be25371aSYikeZhou} 422be25371aSYikeZhou 4234d24c305SYikeZhou/** 424af2f7849Shappy-lx * Svinval extension Constants 425af2f7849Shappy-lx */ 426af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 42757a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 428af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 429af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 430af2f7849Shappy-lx */ 43157a10886SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X), 432af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 433af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 434af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 435af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 436af2f7849Shappy-lx */ 43757a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 438af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 439af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 440af2f7849Shappy-lx * then dispatch and issue this instrucion 441af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 442af2f7849Shappy-lx */ 44357a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 444af2f7849Shappy-lx /* what is Svinval extension ? 445af2f7849Shappy-lx * -----> sfecne.w.inval 446af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 447af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 448af2f7849Shappy-lx * -----> sfecne.inval.ir 449af2f7849Shappy-lx * 450af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 451af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 452af2f7849Shappy-lx */ 453af2f7849Shappy-lx ) 454af2f7849Shappy-lx} 45557a10886SXuan Hu 456af2f7849Shappy-lx/* 457ca18a0b4SWilliam Wang * CBO decode 458ca18a0b4SWilliam Wang */ 459ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 46057a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 46157a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 46257a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 46357a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 46457a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 465ca18a0b4SWilliam Wang ) 466ca18a0b4SWilliam Wang} 467ca18a0b4SWilliam Wang 468d0de7e4aSpeixiaokun/* 469d0de7e4aSpeixiaokun * Hypervisor decode 470d0de7e4aSpeixiaokun */ 471d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants { 472e25e4d90SXuan Hu override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 473e25e4d90SXuan Hu HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 474e25e4d90SXuan Hu HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 475e25e4d90SXuan Hu HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X), 476e25e4d90SXuan Hu HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X), 477e25e4d90SXuan Hu HLV_B -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvb, SelImm.X, xWen = T), 478e25e4d90SXuan Hu HLV_BU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvbu, SelImm.X, xWen = T), 479e25e4d90SXuan Hu HLV_D -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvd, SelImm.X, xWen = T), 480e25e4d90SXuan Hu HLV_H -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvh, SelImm.X, xWen = T), 481e25e4d90SXuan Hu HLV_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvhu, SelImm.X, xWen = T), 482e25e4d90SXuan Hu HLV_W -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvw, SelImm.X, xWen = T), 483e25e4d90SXuan Hu HLV_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvwu, SelImm.X, xWen = T), 484e25e4d90SXuan Hu HLVX_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxhu, SelImm.X, xWen = T), 485e25e4d90SXuan Hu HLVX_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxwu, SelImm.X, xWen = T), 486e25e4d90SXuan Hu HSV_B -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvb, SelImm.X), 487e25e4d90SXuan Hu HSV_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvd, SelImm.X), 488e25e4d90SXuan Hu HSV_H -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvh, SelImm.X), 489e25e4d90SXuan Hu HSV_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvw, SelImm.X), 490d0de7e4aSpeixiaokun ) 491d0de7e4aSpeixiaokun} 492d0de7e4aSpeixiaokun 493545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants { 494545d7be0SYangyu Chen override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 495545d7be0SYangyu Chen CZERO_EQZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T), 496545d7be0SYangyu Chen CZERO_NEZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T), 497545d7be0SYangyu Chen ) 498545d7be0SYangyu Chen} 499545d7be0SYangyu Chen 500ca18a0b4SWilliam Wang/** 501499d2763SZiyue Zhang * "Zimop" Extension for May-Be-Operations 502499d2763SZiyue Zhang */ 503499d2763SZiyue Zhangobject ZimopDecode extends DecodeConstants { 504499d2763SZiyue Zhang override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 505499d2763SZiyue Zhang // temp use addi to decode MOP_R and MOP_RR 506499d2763SZiyue Zhang MOP_R -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T), 507499d2763SZiyue Zhang MOP_RR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T), 508499d2763SZiyue Zhang ) 509499d2763SZiyue Zhang} 510499d2763SZiyue Zhang 511*20b2b626SsinceforYyobject ZfaDecode extends DecodeConstants { 512*20b2b626SsinceforYy override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 513*20b2b626SsinceforYy FLI_H -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T), 514*20b2b626SsinceforYy FLI_S -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T), 515*20b2b626SsinceforYy FLI_D -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T), 516*20b2b626SsinceforYy FMINM_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T), 517*20b2b626SsinceforYy FMINM_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T), 518*20b2b626SsinceforYy FMINM_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T), 519*20b2b626SsinceforYy FMAXM_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T), 520*20b2b626SsinceforYy FMAXM_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T), 521*20b2b626SsinceforYy FMAXM_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T), 522*20b2b626SsinceforYy FROUND_H -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fround, fWen = T, canRobCompress = T), 523*20b2b626SsinceforYy FROUND_S -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fround, fWen = T, canRobCompress = T), 524*20b2b626SsinceforYy FROUND_D -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fround, fWen = T, canRobCompress = T), 525*20b2b626SsinceforYy FROUNDNX_H -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T), 526*20b2b626SsinceforYy FROUNDNX_S -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T), 527*20b2b626SsinceforYy FROUNDNX_D -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T), 528*20b2b626SsinceforYy FCVTMOD_W_D -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvtmod_w_d, xWen = T, canRobCompress = T), 529*20b2b626SsinceforYy FLEQ_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T), 530*20b2b626SsinceforYy FLEQ_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T), 531*20b2b626SsinceforYy FLEQ_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T), 532*20b2b626SsinceforYy FLTQ_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T), 533*20b2b626SsinceforYy FLTQ_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T), 534*20b2b626SsinceforYy FLTQ_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T), 535*20b2b626SsinceforYy ) 536*20b2b626SsinceforYy} 537*20b2b626SsinceforYy 538499d2763SZiyue Zhang/** 5394d24c305SYikeZhou * XiangShan Trap Decode constants 5404d24c305SYikeZhou */ 5414d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 542361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 54357a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 54457a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 5454d24c305SYikeZhou ) 5464d24c305SYikeZhou} 547be25371aSYikeZhou 54849f433deSXuan Huabstract class Imm(val len: Int) { 549b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 550b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 551b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 552b0ae3ac4SLinJiawei} 553b0ae3ac4SLinJiawei 554b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 555fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 556b0ae3ac4SLinJiawei 557b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 558b0ae3ac4SLinJiawei Cat(instr(31, 20)) 559b0ae3ac4SLinJiawei} 560b0ae3ac4SLinJiawei 561b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 562b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 563b0ae3ac4SLinJiawei 564b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 565b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 566b0ae3ac4SLinJiawei} 567b0ae3ac4SLinJiawei 568b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 569b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 570b0ae3ac4SLinJiawei 571b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 572b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 573b0ae3ac4SLinJiawei} 574b0ae3ac4SLinJiawei 575b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 576fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 577b0ae3ac4SLinJiawei 578b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 579b0ae3ac4SLinJiawei instr(31, 12) 580c2a8ae00SYikeZhou } 581c2a8ae00SYikeZhou} 582c2a8ae00SYikeZhou 583b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 584b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 585b0ae3ac4SLinJiawei 586b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 587b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 588b0ae3ac4SLinJiawei } 589b0ae3ac4SLinJiawei} 590b0ae3ac4SLinJiawei 591fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){ 592b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 593b0ae3ac4SLinJiawei 594b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 595fa16cf81Slewislzh Cat(instr(11, 7), instr(19, 15), instr(31, 20)) 596b0ae3ac4SLinJiawei } 59792c61038SXuan Hu 59892c61038SXuan Hu def getCSRAddr(imm: UInt): UInt = { 59992c61038SXuan Hu require(imm.getWidth == this.len) 60092c61038SXuan Hu imm(11, 0) 60192c61038SXuan Hu } 60292c61038SXuan Hu 60392c61038SXuan Hu def getRS1(imm: UInt): UInt = { 60492c61038SXuan Hu require(imm.getWidth == this.len) 60592c61038SXuan Hu imm(16, 12) 60692c61038SXuan Hu } 60792c61038SXuan Hu 60892c61038SXuan Hu def getRD(imm: UInt): UInt = { 60992c61038SXuan Hu require(imm.getWidth == this.len) 61092c61038SXuan Hu imm(21, 17) 61192c61038SXuan Hu } 61292c61038SXuan Hu 61392c61038SXuan Hu def getImm5(imm: UInt): UInt = { 61492c61038SXuan Hu require(imm.getWidth == this.len) 61592c61038SXuan Hu imm(16, 12) 61692c61038SXuan Hu } 617b0ae3ac4SLinJiawei} 618b0ae3ac4SLinJiawei 619ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 620ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 621ee8ff153Szfw 622ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 623ee8ff153Szfw instr(25, 20) 624ee8ff153Szfw } 625ee8ff153Szfw} 626ee8ff153Szfw 62758c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 62858c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 62958c35d23Shuxuan0307 63058c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 63158c35d23Shuxuan0307 instr(19, 15) 63258c35d23Shuxuan0307 } 63358c35d23Shuxuan0307} 634b52d4755SXuan Hu 63558c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 63658c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 63758c35d23Shuxuan0307 63858c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 63958c35d23Shuxuan0307 instr(19, 15) 64058c35d23Shuxuan0307 } 64158c35d23Shuxuan0307} 642b52d4755SXuan Hu 6434aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 6444aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6454aa9ed34Sfdy 6464aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6474aa9ed34Sfdy instr(30, 20) 6484aa9ed34Sfdy } 649e6ac7fe1SZiyue Zhang /** 650e6ac7fe1SZiyue Zhang * get VType from extended imm 651e6ac7fe1SZiyue Zhang * @param extedImm 652e6ac7fe1SZiyue Zhang * @return VType 653e6ac7fe1SZiyue Zhang */ 654e6ac7fe1SZiyue Zhang def getVType(extedImm: UInt): InstVType = { 655e6ac7fe1SZiyue Zhang val vtype = Wire(new InstVType) 656e6ac7fe1SZiyue Zhang vtype := extedImm(10, 0).asTypeOf(new InstVType) 657e6ac7fe1SZiyue Zhang vtype 658e6ac7fe1SZiyue Zhang } 6594aa9ed34Sfdy} 660b52d4755SXuan Hu 661e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){ 6624aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6634aa9ed34Sfdy 6644aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6655c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 666b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 667e6ac7fe1SZiyue Zhang val vtype8 = rvInst.ZIMM_VSETIVLI 668b52d4755SXuan Hu Cat(uimm5, vtype8) 669b52d4755SXuan Hu } 670b52d4755SXuan Hu /** 671b52d4755SXuan Hu * get VType from extended imm 672b52d4755SXuan Hu * @param extedImm 673b52d4755SXuan Hu * @return VType 674b52d4755SXuan Hu */ 675b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 676b52d4755SXuan Hu val vtype = Wire(new InstVType) 677e6ac7fe1SZiyue Zhang vtype := extedImm(9, 0).asTypeOf(new InstVType) 678b52d4755SXuan Hu vtype 679b52d4755SXuan Hu } 680b52d4755SXuan Hu 681b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 682e6ac7fe1SZiyue Zhang extedImm(14, 10) 6834aa9ed34Sfdy } 6844aa9ed34Sfdy} 685fe528fd6Ssinsanction 686fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){ 687fe528fd6Ssinsanction override def do_toImm32(minBits: UInt): UInt = minBits(31, 0) 688fe528fd6Ssinsanction 689fe528fd6Ssinsanction override def minBitsFromInstr(instr: UInt): UInt = { 690fe528fd6Ssinsanction instr(31, 0) 691fe528fd6Ssinsanction } 692fe528fd6Ssinsanction} 693fe528fd6Ssinsanction 6947e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){ 6957e30d16cSZhaoyang You override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 6967e30d16cSZhaoyang You 6977e30d16cSZhaoyang You override def minBitsFromInstr(instr: UInt): UInt = { 6987e30d16cSZhaoyang You Cat(instr(26), instr(19, 15)) 6997e30d16cSZhaoyang You } 7007e30d16cSZhaoyang You} 7017e30d16cSZhaoyang You 702b0ae3ac4SLinJiaweiobject ImmUnion { 703b0ae3ac4SLinJiawei val I = Imm_I() 704b0ae3ac4SLinJiawei val S = Imm_S() 705b0ae3ac4SLinJiawei val B = Imm_B() 706b0ae3ac4SLinJiawei val U = Imm_U() 707b0ae3ac4SLinJiawei val J = Imm_J() 708b0ae3ac4SLinJiawei val Z = Imm_Z() 709ee8ff153Szfw val B6 = Imm_B6() 71058c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 71158c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 7124aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 7134aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 714fe528fd6Ssinsanction val LUI32 = Imm_LUI32() 7157e30d16cSZhaoyang You val VRORVI = Imm_VRORVI() 7164aa9ed34Sfdy 717520f7dacSsinsanction // do not add special type lui32 to this, keep ImmUnion max len being 20. 7187e30d16cSZhaoyang You val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI) 719b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 720b0ae3ac4SLinJiawei val immSelMap = Seq( 721b0ae3ac4SLinJiawei SelImm.IMM_I, 722b0ae3ac4SLinJiawei SelImm.IMM_S, 723b0ae3ac4SLinJiawei SelImm.IMM_SB, 724b0ae3ac4SLinJiawei SelImm.IMM_U, 725b0ae3ac4SLinJiawei SelImm.IMM_UJ, 726ee8ff153Szfw SelImm.IMM_Z, 72758c35d23Shuxuan0307 SelImm.IMM_B6, 72858c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 7294aa9ed34Sfdy SelImm.IMM_OPIVIU, 7304aa9ed34Sfdy SelImm.IMM_VSETVLI, 731fe528fd6Ssinsanction SelImm.IMM_VSETIVLI, 7327e30d16cSZhaoyang You SelImm.IMM_VRORVI, 733b0ae3ac4SLinJiawei ).zip(imms) 734b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 735b0ae3ac4SLinJiawei} 736b0ae3ac4SLinJiawei 737fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 738fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 739fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 740765e58c6Ssinsanction Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm) 741fd7603d9SYinan Xu } 7423b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 743fd7603d9SYinan Xu val loadImmLen = Imm_I().len 7443b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 745f4dcd9fcSsinsanction Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0)) 746fd7603d9SYinan Xu } 747fd7603d9SYinan Xu} 748b0ae3ac4SLinJiawei 749be25371aSYikeZhou/** 750be25371aSYikeZhou * IO bundle for the Decode unit 751be25371aSYikeZhou */ 752aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle { 753aaa08c5aSxiaofeibao-xjtu val decodedInst = Output(new DecodedInst) 754aaa08c5aSxiaofeibao-xjtu val isComplex = Output(Bool()) 755aaa08c5aSxiaofeibao-xjtu val uopInfo = Output(new UopInfo) 756aaa08c5aSxiaofeibao-xjtu} 7572225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 7583b739f49SXuan Hu val enq = new Bundle { 7593b739f49SXuan Hu val ctrlFlow = Input(new StaticInst) 760d91483a6Sfdy val vtype = Input(new VType) 7615110577fSZiyue Zhang val vstart = Input(Vl()) 7624aa9ed34Sfdy } 7633b739f49SXuan Hu// val vconfig = Input(UInt(XLEN.W)) 764aaa08c5aSxiaofeibao-xjtu val deq = new DecodeUnitDeqIO 765af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 76615ed99a7SXuan Hu val fromCSR = Input(new CSRToDecode) 767be25371aSYikeZhou} 768be25371aSYikeZhou 769be25371aSYikeZhou/** 770be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 771be25371aSYikeZhou */ 7722225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 773be25371aSYikeZhou val io = IO(new DecodeUnitIO) 774be25371aSYikeZhou 7753b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 776be25371aSYikeZhou 77775e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 77875e2c883SXuan Hu 77957a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 78057a10886SXuan Hu FpDecode.table ++ 781bdda74fdSxiaofeibao-xjtu// FDivSqrtDecode.table ++ 782768f5f91SYangyu Chen BitmanipDecode.table ++ 783768f5f91SYangyu Chen ScalarCryptoDecode.table ++ 784a19215ddSYinan Xu XSTrapDecode.table ++ 785a19215ddSYinan Xu CBODecode.table ++ 786b65b9ebaSXuan Hu SvinvalDecode.table ++ 787e25e4d90SXuan Hu HypervisorDecode.table ++ 788545d7be0SYangyu Chen VecDecoder.table ++ 789499d2763SZiyue Zhang ZicondDecode.table ++ 790*20b2b626SsinceforYy ZimopDecode.table ++ 791*20b2b626SsinceforYy ZfaDecode.table 792b65b9ebaSXuan Hu 79389cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 794a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 795239413e5SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue 796a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 797a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 798be25371aSYikeZhou 7994d24c305SYikeZhou // output 8003b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 801be25371aSYikeZhou 8022ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 8037ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 8043b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 805ec427417Slinzhida decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags 8061a1319cbSLinJiawei 8073b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 8083b739f49SXuan Hu 809a8db15d8Sfdy decodedInst.uopIdx := 0.U 810d91483a6Sfdy decodedInst.firstUop := true.B 811d91483a6Sfdy decodedInst.lastUop := true.B 812f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 8133235a9d8SZiyue-Zhang decodedInst.numWB := 1.U 814deb6421eSHaojin Tang 815499d2763SZiyue Zhang val isZimop = (BitPat("b1?00??0111??_?????_100_?????_1110011") === ctrl_flow.instr) || 816499d2763SZiyue Zhang (BitPat("b1?00??1?????_?????_100_?????_1110011") === ctrl_flow.instr) 817499d2763SZiyue Zhang 81873c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 819499d2763SZiyue Zhang // temp decode zimop as move 820499d2763SZiyue Zhang decodedInst.isMove := (isMove || isZimop) && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep 82173c4359eSYikeZhou 82249a2cda2SXuan Hu // fmadd - b1000011 82349a2cda2SXuan Hu // fmsub - b1000111 82449a2cda2SXuan Hu // fnmsub- b1001011 82549a2cda2SXuan Hu // fnmadd- b1001111 82649a2cda2SXuan Hu private val isFMA = inst.OPCODE === BitPat("b100??11") 827e8b68a8eSgood-circle private val isVppu = FuType.isVppu(decodedInst.fuType) 828e8b68a8eSgood-circle private val isVecOPF = FuType.isVecOPF(decodedInst.fuType) 82949a2cda2SXuan Hu 830178dd38cSYikeZhou // read src1~3 location 83198cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 83298cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 83349a2cda2SXuan Hu // src(2) of fma is fs3, src(2) of vector inst is old vd 83449a2cda2SXuan Hu decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD) 8359c5a1080Sxiaofeibao decodedInst.lsrc(3) := V0_IDX.U 8369c5a1080Sxiaofeibao decodedInst.lsrc(4) := Vl_IDX.U 837b6b11f60SXuan Hu 838178dd38cSYikeZhou // read dest location 83998cfe81bSxgkiri decodedInst.ldest := inst.RD 8404d24c305SYikeZhou 841e4e68f86Sxiaofeibao // init v0Wen vlWen 842e4e68f86Sxiaofeibao decodedInst.v0Wen := false.B 843e4e68f86Sxiaofeibao decodedInst.vlWen := false.B 844e4e68f86Sxiaofeibao 845c2a8ae00SYikeZhou // fill in exception vector 846567f0269Ssinsanction val vecException = Module(new VecExceptionGen) 847567f0269Ssinsanction vecException.io.inst := io.enq.ctrlFlow.instr 848567f0269Ssinsanction vecException.io.decodedInst := decodedInst 849bdda74fdSxiaofeibao-xjtu vecException.io.vtype := decodedInst.vpu.vtype 8505110577fSZiyue Zhang vecException.io.vstart := decodedInst.vpu.vstart 8514d24c305SYikeZhou 85215ed99a7SXuan Hu private val exceptionII = 85315ed99a7SXuan Hu decodedInst.selImm === SelImm.INVALID_INSTR || 85415ed99a7SXuan Hu vecException.io.illegalInst || 85515ed99a7SXuan Hu io.fromCSR.illegalInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 85615ed99a7SXuan Hu io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 85715ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g || 85815ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v || 85915ed99a7SXuan Hu io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 8608b7dc6f5SsinceforYy io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 8618b7dc6f5SsinceforYy io.fromCSR.illegalInst.fsIsOff && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) || 8628b7dc6f5SsinceforYy (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) || 863d60bfe5aSsinceforYy FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) || 864d60bfe5aSsinceforYy isVecOPF) || 865b50a88ecSXuan Hu io.fromCSR.illegalInst.vsIsOff && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) || 866689f6b88SsinceforYy io.fromCSR.illegalInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) || 867689f6b88SsinceforYy (decodedInst.needFrm.scalaNeedFrm || FuType.isScalaNeedFrm(decodedInst.fuType)) && (((decodedInst.fpu.rm === 5.U) || (decodedInst.fpu.rm === 6.U)) || ((decodedInst.fpu.rm === 7.U) && io.fromCSR.illegalInst.frm)) || 868689f6b88SsinceforYy (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm 86915ed99a7SXuan Hu 87015ed99a7SXuan Hu private val exceptionVI = 87115ed99a7SXuan Hu io.fromCSR.virtualInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 87215ed99a7SXuan Hu io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 87315ed99a7SXuan Hu io.fromCSR.virtualInst.hfence && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) || 87415ed99a7SXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 875b50a88ecSXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 876b50a88ecSXuan Hu io.fromCSR.virtualInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) 87715ed99a7SXuan Hu 8785a9dd560SXuan Hu decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II) 87915ed99a7SXuan Hu decodedInst.exceptionVec(virtualInstr) := exceptionVI 880d0de7e4aSpeixiaokun 8817e0f64b0SGuanghui Cheng //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry. 8827e0f64b0SGuanghui Cheng decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger) 8837e0f64b0SGuanghui Cheng 8843b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 885b0ae3ac4SLinJiawei x => { 8867ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 887b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 888b0ae3ac4SLinJiawei x._1 -> minBits 889b0ae3ac4SLinJiawei } 890b0ae3ac4SLinJiawei )) 891aac4464eSYinan Xu 8927531c765SXuan Hu private val isLs = FuType.isLoadStore(decodedInst.fuType) 8937531c765SXuan Hu private val isVls = FuType.isVls(decodedInst.fuType) 8947531c765SXuan Hu private val isStore = FuType.isStore(decodedInst.fuType) 8957531c765SXuan Hu private val isAMO = FuType.isAMO(decodedInst.fuType) 8967531c765SXuan Hu private val isVStore = FuType.isVStore(decodedInst.fuType) 8977531c765SXuan Hu private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType) 8987531c765SXuan Hu 8997531c765SXuan Hu decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch) 90075e2c883SXuan Hu 90175e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 902be25371aSYikeZhou 9030bca6cb3SZiyue Zhang private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S) 90439c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 90539c388b5SXuan Hu private val narrowInsts = Seq( 90639c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 90739c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 90839c388b5SXuan Hu ) 90939c388b5SXuan Hu private val maskDstInsts = Seq( 91039c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 91139c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 91239c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 9139eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 9149eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 9159eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 9169eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 917f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 91839c388b5SXuan Hu ) 91930fcc710SZiyue Zhang private val maskOpInsts = Seq( 92030fcc710SZiyue Zhang VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 92130fcc710SZiyue Zhang ) 92294e6af68SZiyue-Zhang private val vmaInsts = Seq( 92394e6af68SZiyue-Zhang VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX, 92494e6af68SZiyue-Zhang VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX, 92594e6af68SZiyue-Zhang ) 926bdda74fdSxiaofeibao-xjtu private val wfflagsInsts = Seq( 927bdda74fdSxiaofeibao-xjtu // opfff 928bdda74fdSxiaofeibao-xjtu FADD_S, FSUB_S, FADD_D, FSUB_D, 929bdda74fdSxiaofeibao-xjtu FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, 930bdda74fdSxiaofeibao-xjtu FMIN_S, FMAX_S, FMIN_D, FMAX_D, 931bdda74fdSxiaofeibao-xjtu FMUL_S, FMUL_D, 932bdda74fdSxiaofeibao-xjtu FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, 933bdda74fdSxiaofeibao-xjtu FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, 934bdda74fdSxiaofeibao-xjtu FSGNJ_S, FSGNJN_S, FSGNJX_S, 935bdda74fdSxiaofeibao-xjtu // opfvv 936bdda74fdSxiaofeibao-xjtu VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV, 937bdda74fdSxiaofeibao-xjtu VFMUL_VV, VFDIV_VV, VFWMUL_VV, 938bdda74fdSxiaofeibao-xjtu VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV, 939bdda74fdSxiaofeibao-xjtu VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV, 940bdda74fdSxiaofeibao-xjtu VFSQRT_V, 941bdda74fdSxiaofeibao-xjtu VFMIN_VV, VFMAX_VV, 942bdda74fdSxiaofeibao-xjtu VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV, 943bdda74fdSxiaofeibao-xjtu VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV, 944bdda74fdSxiaofeibao-xjtu // opfvf 945bdda74fdSxiaofeibao-xjtu VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF, 946bdda74fdSxiaofeibao-xjtu VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF, 947bdda74fdSxiaofeibao-xjtu VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF, 948bdda74fdSxiaofeibao-xjtu VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF, 949bdda74fdSxiaofeibao-xjtu VFMIN_VF, VFMAX_VF, 950bdda74fdSxiaofeibao-xjtu VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF, 951bdda74fdSxiaofeibao-xjtu VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF, 952aab8ef9cSxiaofeibao-xjtu // vfred 953aab8ef9cSxiaofeibao-xjtu VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS, 954bdda74fdSxiaofeibao-xjtu // fcvt & vfcvt 955bdda74fdSxiaofeibao-xjtu FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU, 956bdda74fdSxiaofeibao-xjtu FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 957bdda74fdSxiaofeibao-xjtu FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU, 958bdda74fdSxiaofeibao-xjtu FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 959b189aafaSzmx FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H, 960ba899681Schengguanghui 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, 961ba899681Schengguanghui 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, 962ba899681Schengguanghui 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, 963ba899681Schengguanghui VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V, 964*20b2b626SsinceforYy // zfa 965*20b2b626SsinceforYy FLEQ_H, FLEQ_S, FLEQ_D, FLTQ_H, FLTQ_S, FLTQ_D, 966*20b2b626SsinceforYy FMINM_H, FMINM_S, FMINM_D, FMAXM_H, FMAXM_S, FMAXM_D, 967*20b2b626SsinceforYy FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D, 968*20b2b626SsinceforYy FCVTMOD_W_D, 969bdda74fdSxiaofeibao-xjtu ) 970689f6b88SsinceforYy 971689f6b88SsinceforYy private val scalaNeedFrmInsts = Seq( 972689f6b88SsinceforYy FADD_S, FSUB_S, FADD_D, FSUB_D, 973689f6b88SsinceforYy FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 974689f6b88SsinceforYy FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 975*20b2b626SsinceforYy FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D, 976689f6b88SsinceforYy ) 977689f6b88SsinceforYy 978689f6b88SsinceforYy private val vectorNeedFrmInsts = Seq ( 979689f6b88SsinceforYy VFSLIDE1UP_VF, VFSLIDE1DOWN_VF, 980689f6b88SsinceforYy ) 981689f6b88SsinceforYy 982bdda74fdSxiaofeibao-xjtu decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _) 983689f6b88SsinceforYy decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 984689f6b88SsinceforYy decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 985bdda74fdSxiaofeibao-xjtu val fpToVecDecoder = Module(new FPToVecDecoder()) 986bdda74fdSxiaofeibao-xjtu fpToVecDecoder.io.instr := inst.asUInt 987bdda74fdSxiaofeibao-xjtu val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst 9883b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 989bdda74fdSxiaofeibao-xjtu when(isFpToVecInst){ 990bdda74fdSxiaofeibao-xjtu decodedInst.vpu := fpToVecDecoder.io.vpuCtrl 991bdda74fdSxiaofeibao-xjtu }.otherwise{ 99275e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 99375e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 99475e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 99575e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 99675e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 99775e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 99875e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 999d9355d3aSZiyue-Zhang decodedInst.vpu.veew := inst.WIDTH 100094e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 100139c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 1002b6279fc6SZiyue Zhang val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _) 1003b6279fc6SZiyue Zhang val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 1004b6279fc6SZiyue Zhang val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _) 1005b6279fc6SZiyue Zhang val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe 1006dab1ad8cSsinsanction val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse 1007dab1ad8cSsinsanction val isVlm = decodedInst.fuOpType === VlduType.vlm 1008d8ceb649SZiyue Zhang val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV 100994e6af68SZiyue-Zhang val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _) 1010dab1ad8cSsinsanction val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew 1011b6279fc6SZiyue Zhang decodedInst.vpu.isNarrow := isNarrow 1012b6279fc6SZiyue Zhang decodedInst.vpu.isDstMask := isDstMask 1013b6279fc6SZiyue Zhang decodedInst.vpu.isOpMask := isOpMask 101494e6af68SZiyue-Zhang decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma 1015dab1ad8cSsinsanction decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac 10165110577fSZiyue Zhang decodedInst.vpu.vstart := io.enq.vstart 1017bdda74fdSxiaofeibao-xjtu } 101806f0a37aSZiyue Zhang decodedInst.vpu.specVill := io.enq.vtype.illegal 101906f0a37aSZiyue Zhang decodedInst.vpu.specVma := io.enq.vtype.vma 102006f0a37aSZiyue Zhang decodedInst.vpu.specVta := io.enq.vtype.vta 102106f0a37aSZiyue Zhang decodedInst.vpu.specVsew := io.enq.vtype.vsew 102206f0a37aSZiyue Zhang decodedInst.vpu.specVlmul := io.enq.vtype.vlmul 102375e2c883SXuan Hu 102431c51290Szhanglinjuan decodedInst.vlsInstr := isVls 102531c51290Szhanglinjuan 10266d56ac16Ssinsanction decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src 10276d56ac16Ssinsanction decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig 10286d56ac16Ssinsanction 10297f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 103087dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 103187dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 103206cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 103387dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 10340a34fc22SZiyue Zhang uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0) 1035c4501a6fSZiyue-Zhang uopInfoGen.io.in.preInfo.nf := inst.NF 103606cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr 1037c90e3eacSZiyue Zhang uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm 10387f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 1039ddc88dadSxiaofeibao // numOfUop should be 1 when vector instruction is illegalInst 1040ddc88dadSxiaofeibao io.deq.uopInfo.numOfUop := Mux(vecException.io.illegalInst, 1.U, uopInfoGen.io.out.uopInfo.numOfUop) 10413235a9d8SZiyue-Zhang io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB 10427f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 10437f9f0a79SzhanglyGit 1044cc1eb70dSXuan Hu val isCSR = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U 1045cc1eb70dSXuan Hu val isCSRR = isCSR && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U 1046cc1eb70dSXuan Hu val isCSRW = isCSR && inst.FUNCT3 === BitPat("b?10") && inst.RD === 0.U 1047cc1eb70dSXuan Hu dontTouch(isCSRR) 1048cc1eb70dSXuan Hu dontTouch(isCSRW) 1049cc1eb70dSXuan Hu 105087c5d21dSZiyue Zhang // for csrr vl instruction, convert to vsetvl 1051cc1eb70dSXuan Hu val isCsrrVlenb = isCSRR && inst.CSRIDX === CSRs.vlenb.U 1052cc1eb70dSXuan Hu val isCsrrVl = isCSRR && inst.CSRIDX === CSRs.vl.U 1053cc1eb70dSXuan Hu 1054ac17908cSHuijin Li // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i) 1055ac17908cSHuijin Li val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U 1056ac17908cSHuijin Li val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W) 1057ac17908cSHuijin Li val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W) 1058ac17908cSHuijin Li val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W) 1059ac17908cSHuijin Li 1060*20b2b626SsinceforYy // for fli.s|fli.d instruction 1061*20b2b626SsinceforYy val isFLI = inst.FUNCT7 === BitPat("b11110??") && inst.RS2 === 1.U && inst.RM === 0.U && inst.OPCODE5Bit === OPCODE5Bit.OP_FP 1062*20b2b626SsinceforYy 106387c5d21dSZiyue Zhang when (isCsrrVl) { 106463cb3754SZiyue Zhang // convert to vsetvl instruction 106587c5d21dSZiyue Zhang decodedInst.srcType(0) := SrcType.no 106687c5d21dSZiyue Zhang decodedInst.srcType(1) := SrcType.no 106787c5d21dSZiyue Zhang decodedInst.srcType(2) := SrcType.no 106887c5d21dSZiyue Zhang decodedInst.srcType(3) := SrcType.no 106987c5d21dSZiyue Zhang decodedInst.srcType(4) := SrcType.vp 107087c5d21dSZiyue Zhang decodedInst.lsrc(4) := Vl_IDX.U 107163cb3754SZiyue Zhang decodedInst.waitForward := false.B 107287c5d21dSZiyue Zhang decodedInst.blockBackward := false.B 10738c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 107463cb3754SZiyue Zhang }.elsewhen (isCsrrVlenb) { 107563cb3754SZiyue Zhang // convert to addi instruction 1076828a8a48SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 1077828a8a48SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 107863cb3754SZiyue Zhang decodedInst.srcType(2) := SrcType.no 107963cb3754SZiyue Zhang decodedInst.srcType(3) := SrcType.no 108063cb3754SZiyue Zhang decodedInst.srcType(4) := SrcType.no 108163cb3754SZiyue Zhang decodedInst.selImm := SelImm.IMM_I 108263cb3754SZiyue Zhang decodedInst.waitForward := false.B 108363cb3754SZiyue Zhang decodedInst.blockBackward := false.B 108463cb3754SZiyue Zhang decodedInst.canRobCompress := true.B 10858c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 1086ac17908cSHuijin Li }.elsewhen (isPreW || isPreR || isPreI) { 1087ac17908cSHuijin Li decodedInst.selImm := SelImm.IMM_S 1088ac17908cSHuijin Li decodedInst.fuType := FuType.ldu.U 1089ac17908cSHuijin Li decodedInst.canRobCompress := false.B 1090ac17908cSHuijin Li decodedInst.fuOpType := Mux1H(Seq( 1091ac17908cSHuijin Li isPreW -> LSUOpType.prefetch_w, 1092ac17908cSHuijin Li isPreR -> LSUOpType.prefetch_r, 1093ac17908cSHuijin Li isPreI -> LSUOpType.prefetch_i, 1094ac17908cSHuijin Li )) 1095499d2763SZiyue Zhang }.elsewhen (isZimop) { 1096499d2763SZiyue Zhang // set srcType for zimop 1097499d2763SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 1098499d2763SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 1099499d2763SZiyue Zhang // use x0 as src1 1100499d2763SZiyue Zhang decodedInst.lsrc(0) := 0.U 110187c5d21dSZiyue Zhang } 110287c5d21dSZiyue Zhang 110375e2c883SXuan Hu io.deq.decodedInst := decodedInst 11049faa51afSxiaofeibao-xjtu io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen 1105985804e6SXuan Hu io.deq.decodedInst.fuType := Mux1H(Seq( 1106cc1eb70dSXuan Hu // keep condition 1107cc1eb70dSXuan Hu (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType, 110887c5d21dSZiyue Zhang (isCsrrVl) -> FuType.vsetfwf.U, 110963cb3754SZiyue Zhang (isCsrrVlenb) -> FuType.alu.U, 1110cc1eb70dSXuan Hu 1111cc1eb70dSXuan Hu // change vlsu to vseglsu when NF =/= 0.U 1112f94f6503SXuan 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, 1113f94f6503SXuan Hu // MOP === b00 && SUMOP === b01000: unit-stride whole register store 1114f94f6503SXuan Hu // MOP =/= b00 : strided and indexed store 1115f94f6503SXuan 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, 1116f94f6503SXuan Hu // MOP === b00 && LUMOP === b01000: unit-stride whole register load 1117f94f6503SXuan Hu // MOP =/= b00 : strided and indexed load 1118f94f6503SXuan 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, 1119985804e6SXuan Hu )) 1120499d2763SZiyue Zhang io.deq.decodedInst.imm := MuxCase(decodedInst.imm, Seq( 1121499d2763SZiyue Zhang isCsrrVlenb -> (VLEN / 8).U, 1122499d2763SZiyue Zhang isZimop -> 0.U, 1123499d2763SZiyue Zhang )) 1124cc1eb70dSXuan Hu 11254fe0a83eSXuan Hu io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq( 1126cc1eb70dSXuan Hu isCsrrVl -> VSETOpType.csrrvl, 1127cc1eb70dSXuan Hu isCsrrVlenb -> ALUOpType.add, 1128*20b2b626SsinceforYy isFLI -> Cat(1.U, inst.FMT, inst.RS1), 11294fe0a83eSXuan Hu )) 11304fe0a83eSXuan Hu 11314fe0a83eSXuan Hu io.deq.decodedInst.blockBackward := MuxCase(decodedInst.blockBackward, Seq( 11324fe0a83eSXuan Hu isCSRR -> false.B, 1133cc1eb70dSXuan Hu )) 1134be25371aSYikeZhou //------------------------------------------------------------- 1135be25371aSYikeZhou // Debug Info 11363b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 11373b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 11383b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 11393b739f49SXuan 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", 11403b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 11413b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 11423b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 11433b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 11443b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 11453b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 11463b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 11473b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 1148be25371aSYikeZhou} 1149