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._ 24c2a2229dSlewislzhimport freechips.rocketchip.rocket.CustomInstructions._ 256ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat 263c02ee8fSwakafaimport utility._ 273b739f49SXuan Huimport utils._ 285a9dd560SXuan Huimport xiangshan.ExceptionNO.{EX_II, breakPoint, illegalInstr, virtualInstr} 296ab6918fSYinan Xuimport xiangshan._ 30730cfbc0SXuan Huimport xiangshan.backend.fu.FuType 31730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst} 321be7b39aSXuan Huimport xiangshan.backend.decode.isa.PseudoInstructions 33cc1eb70dSXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, OPCODE5Bit, XSInstBitFields} 345110577fSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.{VType, Vl} 3515ed99a7SXuan Huimport xiangshan.backend.fu.wrapper.CSRToDecode 36499d2763SZiyue Zhangimport xiangshan.backend.decode.Zimop._ 3720b2b626SsinceforYyimport yunsuan.{VfaluType, VfcvtType} 38be25371aSYikeZhou 39be25371aSYikeZhou/** 40be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/ 41be25371aSYikeZhou */ 42be25371aSYikeZhouabstract trait DecodeConstants { 43361e6d51SJiuyang Liu // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt. 4457a10886SXuan Hu def X = BitPat("b0") 454d24c305SYikeZhou def N = BitPat("b0") 464d24c305SYikeZhou def Y = BitPat("b1") 4757a10886SXuan Hu def T = true 4857a10886SXuan Hu def F = false 494d24c305SYikeZhou 50c2a8ae00SYikeZhou def decodeDefault: List[BitPat] = // illegal instruction 5120e31bd1SYinan Xu // srcType(0) srcType(1) srcType(2) fuType fuOpType rfWen 524d24c305SYikeZhou // | | | | | | fpWen 5357a10886SXuan Hu // | | | | | | | vecWen 5457a10886SXuan Hu // | | | | | | | | isXSTrap 5557a10886SXuan Hu // | | | | | | | | | noSpecExec 5657a10886SXuan Hu // | | | | | | | | | | blockBackward 5757a10886SXuan Hu // | | | | | | | | | | | flushPipe 5889cc69c1STang Haojin // | | | | | | | | | | | | canRobCompress 5989cc69c1STang Haojin // | | | | | | | | | | | | | uopSplitType 6089cc69c1STang Haojin // | | | | | | | | | | | | | | selImm 6189cc69c1STang 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 624d24c305SYikeZhou 6357a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] 6457a10886SXuan Hu final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate())) 65be25371aSYikeZhou} 66be25371aSYikeZhou 67c2a8ae00SYikeZhoutrait DecodeUnitConstants 684d24c305SYikeZhou{ 694d24c305SYikeZhou // abstract out instruction decode magic numbers 704d24c305SYikeZhou val RD_MSB = 11 714d24c305SYikeZhou val RD_LSB = 7 724d24c305SYikeZhou val RS1_MSB = 19 734d24c305SYikeZhou val RS1_LSB = 15 744d24c305SYikeZhou val RS2_MSB = 24 754d24c305SYikeZhou val RS2_LSB = 20 764d24c305SYikeZhou val RS3_MSB = 31 774d24c305SYikeZhou val RS3_LSB = 27 784d24c305SYikeZhou} 794d24c305SYikeZhou 80be25371aSYikeZhou/** 81be25371aSYikeZhou * Decoded control signals 824d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala 83be25371aSYikeZhou */ 84c2a8ae00SYikeZhou 8557a10886SXuan Huabstract class XSDecodeBase { 8657a10886SXuan Hu def X = BitPat("b?") 8757a10886SXuan Hu def N = BitPat("b0") 8857a10886SXuan Hu def Y = BitPat("b1") 8957a10886SXuan Hu def T = true 9057a10886SXuan Hu def F = false 9157a10886SXuan Hu def generate() : List[BitPat] 9257a10886SXuan Hu} 9357a10886SXuan Hu 9457a10886SXuan Hucase class XSDecode( 9557a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 96239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat, 97e2695e90SzhanglyGit uopSplitType: BitPat = UopSplitType.X, 9857a10886SXuan Hu xWen: Boolean = false, 9957a10886SXuan Hu fWen: Boolean = false, 10057a10886SXuan Hu vWen: Boolean = false, 10157a10886SXuan Hu mWen: Boolean = false, 10257a10886SXuan Hu xsTrap: Boolean = false, 10357a10886SXuan Hu noSpec: Boolean = false, 10457a10886SXuan Hu blockBack: Boolean = false, 10557a10886SXuan Hu flushPipe: Boolean = false, 10689cc69c1STang Haojin canRobCompress: Boolean = false, 10757a10886SXuan Hu) extends XSDecodeBase { 10857a10886SXuan Hu def generate() : List[BitPat] = { 10989cc69c1STang 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) 11057a10886SXuan Hu } 11157a10886SXuan Hu} 11257a10886SXuan Hu 11357a10886SXuan Hucase class FDecode( 11457a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 115239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X, 11617ec87f2SXuan Hu uopSplitType: BitPat = UopSplitType.X, 11757a10886SXuan Hu xWen: Boolean = false, 11857a10886SXuan Hu fWen: Boolean = false, 11957a10886SXuan Hu vWen: Boolean = false, 12057a10886SXuan Hu mWen: Boolean = false, 12157a10886SXuan Hu xsTrap: Boolean = false, 12257a10886SXuan Hu noSpec: Boolean = false, 12357a10886SXuan Hu blockBack: Boolean = false, 12457a10886SXuan Hu flushPipe: Boolean = false, 12589cc69c1STang Haojin canRobCompress: Boolean = false, 12657a10886SXuan Hu) extends XSDecodeBase { 12757a10886SXuan Hu def generate() : List[BitPat] = { 12889cc69c1STang Haojin XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate() 12957a10886SXuan Hu } 13057a10886SXuan Hu} 13157a10886SXuan Hu 132be25371aSYikeZhou/** 133be25371aSYikeZhou * Overall Decode constants 134be25371aSYikeZhou */ 135be25371aSYikeZhouobject XDecode extends DecodeConstants { 13657a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 137768f5f91SYangyu Chen // RV32I 13857a10886SXuan Hu LW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw , SelImm.IMM_I, xWen = T), 13957a10886SXuan Hu LH -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh , SelImm.IMM_I, xWen = T), 14057a10886SXuan Hu LHU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T), 14157a10886SXuan Hu LB -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb , SelImm.IMM_I, xWen = T), 14257a10886SXuan Hu LBU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T), 14357a10886SXuan Hu SW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw , SelImm.IMM_S ), 14457a10886SXuan Hu SH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh , SelImm.IMM_S ), 14557a10886SXuan Hu SB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb , SelImm.IMM_S ), 14689cc69c1STang Haojin LUI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T), 14789cc69c1STang Haojin ADDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T), 14889cc69c1STang Haojin ANDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T), 14989cc69c1STang Haojin ORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or , SelImm.IMM_I, xWen = T, canRobCompress = T), 15089cc69c1STang Haojin XORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T), 15189cc69c1STang Haojin SLTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T), 15289cc69c1STang Haojin SLTIU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T), 15389cc69c1STang Haojin SLL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X , xWen = T, canRobCompress = T), 15489cc69c1STang Haojin ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X , xWen = T, canRobCompress = T), 15589cc69c1STang Haojin SUB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X , xWen = T, canRobCompress = T), 15689cc69c1STang Haojin SLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X , xWen = T, canRobCompress = T), 15789cc69c1STang Haojin SLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X , xWen = T, canRobCompress = T), 15889cc69c1STang Haojin AND -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X , xWen = T, canRobCompress = T), 15989cc69c1STang Haojin OR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or , SelImm.X , xWen = T, canRobCompress = T), 16089cc69c1STang Haojin XOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X , xWen = T, canRobCompress = T), 16189cc69c1STang Haojin SRA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X , xWen = T, canRobCompress = T), 16289cc69c1STang Haojin SRL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X , xWen = T, canRobCompress = T), 1634d24c305SYikeZhou 164768f5f91SYangyu Chen // RV64I (extend from RV32I) 165768f5f91SYangyu Chen LD -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld , SelImm.IMM_I, xWen = T), 166768f5f91SYangyu Chen LWU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T), 167768f5f91SYangyu Chen SD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd , SelImm.IMM_S ), 168768f5f91SYangyu Chen 169768f5f91SYangyu Chen SLLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T), 170768f5f91SYangyu Chen SRLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T), 171768f5f91SYangyu Chen SRAI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T), 172768f5f91SYangyu Chen 173768f5f91SYangyu Chen ADDIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T), 174768f5f91SYangyu Chen SLLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T), 175768f5f91SYangyu Chen SRAIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T), 176768f5f91SYangyu Chen SRLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T), 177768f5f91SYangyu Chen 178768f5f91SYangyu Chen ADDW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X , xWen = T, canRobCompress = T), 179768f5f91SYangyu Chen SUBW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X , xWen = T, canRobCompress = T), 180768f5f91SYangyu Chen SLLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X , xWen = T, canRobCompress = T), 181768f5f91SYangyu Chen SRAW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X , xWen = T, canRobCompress = T), 182768f5f91SYangyu Chen SRLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X , xWen = T, canRobCompress = T), 183768f5f91SYangyu Chen 184768f5f91SYangyu Chen // RV64M 18589cc69c1STang Haojin MUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul , SelImm.X, xWen = T, canRobCompress = T), 18689cc69c1STang Haojin MULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh , SelImm.X, xWen = T, canRobCompress = T), 18789cc69c1STang Haojin MULHU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T), 18889cc69c1STang Haojin MULHSU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T), 18989cc69c1STang Haojin MULW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw , SelImm.X, xWen = T, canRobCompress = T), 1904d24c305SYikeZhou 19189cc69c1STang Haojin DIV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div , SelImm.X, xWen = T, canRobCompress = T), 19289cc69c1STang Haojin DIVU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu , SelImm.X, xWen = T, canRobCompress = T), 19389cc69c1STang Haojin REM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem , SelImm.X, xWen = T, canRobCompress = T), 19489cc69c1STang Haojin REMU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu , SelImm.X, xWen = T, canRobCompress = T), 19589cc69c1STang Haojin DIVW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw , SelImm.X, xWen = T, canRobCompress = T), 19689cc69c1STang Haojin DIVUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T), 19789cc69c1STang Haojin REMW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw , SelImm.X, xWen = T, canRobCompress = T), 19889cc69c1STang Haojin REMUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T), 1994d24c305SYikeZhou 200f7af4c74Schengguanghui AUIPC -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T), 20157a10886SXuan Hu JAL -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal , SelImm.IMM_UJ, xWen = T), 2025110577fSZiyue Zhang JALR -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T), 2033b739f49SXuan Hu BEQ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq , SelImm.IMM_SB ), 2043b739f49SXuan Hu BNE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne , SelImm.IMM_SB ), 2053b739f49SXuan Hu BGE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge , SelImm.IMM_SB ), 2063b739f49SXuan Hu BGEU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu , SelImm.IMM_SB ), 2073b739f49SXuan Hu BLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt , SelImm.IMM_SB ), 2083b739f49SXuan Hu BLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu , SelImm.IMM_SB ), 2094d24c305SYikeZhou 210768f5f91SYangyu Chen // System, the immediate12 holds the CSR register. 21140ac5bb1SXuan Hu 212fa16cf81Slewislzh CSRRW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 213fa16cf81Slewislzh CSRRS -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 214fa16cf81Slewislzh CSRRC -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2154d24c305SYikeZhou 21657a10886SXuan Hu CSRRWI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21757a10886SXuan Hu CSRRSI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21857a10886SXuan Hu CSRRCI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2194d24c305SYikeZhou 22057a10886SXuan Hu EBREAK -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22157a10886SXuan Hu ECALL -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22257a10886SXuan Hu SRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22357a10886SXuan Hu MRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 224c2a2229dSlewislzh MNRET -> 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( 388b189aafaSzmx FLH -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T), 38957a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 39057a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 391b189aafaSzmx FSH -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S ), 39257a10886SXuan Hu FSW -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S ), 39357a10886SXuan Hu FSD -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S ), 3944d24c305SYikeZhou 395964d9a87SZiyue Zhang FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T), 396964d9a87SZiyue Zhang FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T), 397b189aafaSzmx FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T), 398c2a8ae00SYikeZhou 3994d24c305SYikeZhou // Int to FP 40089cc69c1STang Haojin FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40189cc69c1STang Haojin FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40289cc69c1STang Haojin FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40389cc69c1STang Haojin FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4044d24c305SYikeZhou 40589cc69c1STang Haojin FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40689cc69c1STang Haojin FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40789cc69c1STang Haojin FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40889cc69c1STang Haojin FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4094d24c305SYikeZhou 4104d24c305SYikeZhou ) 411be25371aSYikeZhou} 412be25371aSYikeZhou 413be25371aSYikeZhou/** 414be25371aSYikeZhou * FP Divide SquareRoot Constants 415be25371aSYikeZhou */ 416be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 41757a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 41889cc69c1STang Haojin FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41989cc69c1STang Haojin FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 42089cc69c1STang Haojin FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 42189cc69c1STang Haojin FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 4224d24c305SYikeZhou ) 423be25371aSYikeZhou} 424be25371aSYikeZhou 4254d24c305SYikeZhou/** 426af2f7849Shappy-lx * Svinval extension Constants 427af2f7849Shappy-lx */ 428af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 42957a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 430af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 431af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 432af2f7849Shappy-lx */ 43357a10886SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X), 434af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 435af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 436af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 437af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 438af2f7849Shappy-lx */ 43957a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 440af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 441af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 442af2f7849Shappy-lx * then dispatch and issue this instrucion 443af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 444af2f7849Shappy-lx */ 44557a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 446af2f7849Shappy-lx /* what is Svinval extension ? 447af2f7849Shappy-lx * -----> sfecne.w.inval 448af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 449af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 450af2f7849Shappy-lx * -----> sfecne.inval.ir 451af2f7849Shappy-lx * 452af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 453af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 454af2f7849Shappy-lx */ 455af2f7849Shappy-lx ) 456af2f7849Shappy-lx} 45757a10886SXuan Hu 458af2f7849Shappy-lx/* 459ca18a0b4SWilliam Wang * CBO decode 460ca18a0b4SWilliam Wang */ 461ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 46257a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 46357a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 46457a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 46557a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 46657a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 467ca18a0b4SWilliam Wang ) 468ca18a0b4SWilliam Wang} 469ca18a0b4SWilliam Wang 470d0de7e4aSpeixiaokun/* 471d0de7e4aSpeixiaokun * Hypervisor decode 472d0de7e4aSpeixiaokun */ 473d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants { 474e25e4d90SXuan Hu override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 475e25e4d90SXuan Hu HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 476e25e4d90SXuan Hu HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 477e25e4d90SXuan Hu HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X), 478e25e4d90SXuan Hu HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X), 479e25e4d90SXuan Hu HLV_B -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvb, SelImm.X, xWen = T), 480e25e4d90SXuan Hu HLV_BU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvbu, SelImm.X, xWen = T), 481e25e4d90SXuan Hu HLV_D -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvd, SelImm.X, xWen = T), 482e25e4d90SXuan Hu HLV_H -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvh, SelImm.X, xWen = T), 483e25e4d90SXuan Hu HLV_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvhu, SelImm.X, xWen = T), 484e25e4d90SXuan Hu HLV_W -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvw, SelImm.X, xWen = T), 485e25e4d90SXuan Hu HLV_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvwu, SelImm.X, xWen = T), 486e25e4d90SXuan Hu HLVX_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxhu, SelImm.X, xWen = T), 487e25e4d90SXuan Hu HLVX_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxwu, SelImm.X, xWen = T), 488e25e4d90SXuan Hu HSV_B -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvb, SelImm.X), 489e25e4d90SXuan Hu HSV_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvd, SelImm.X), 490e25e4d90SXuan Hu HSV_H -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvh, SelImm.X), 491e25e4d90SXuan Hu HSV_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvw, SelImm.X), 492d0de7e4aSpeixiaokun ) 493d0de7e4aSpeixiaokun} 494d0de7e4aSpeixiaokun 495545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants { 496545d7be0SYangyu Chen override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 497545d7be0SYangyu Chen CZERO_EQZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T), 498545d7be0SYangyu Chen CZERO_NEZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T), 499545d7be0SYangyu Chen ) 500545d7be0SYangyu Chen} 501545d7be0SYangyu Chen 502ca18a0b4SWilliam Wang/** 503499d2763SZiyue Zhang * "Zimop" Extension for May-Be-Operations 504499d2763SZiyue Zhang */ 505499d2763SZiyue Zhangobject ZimopDecode extends DecodeConstants { 506499d2763SZiyue Zhang override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 507499d2763SZiyue Zhang // temp use addi to decode MOP_R and MOP_RR 508499d2763SZiyue Zhang MOP_R -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T), 509499d2763SZiyue Zhang MOP_RR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T), 510499d2763SZiyue Zhang ) 511499d2763SZiyue Zhang} 512499d2763SZiyue Zhang 51320b2b626SsinceforYyobject ZfaDecode extends DecodeConstants { 51420b2b626SsinceforYy override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 51520b2b626SsinceforYy FLI_H -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T), 51620b2b626SsinceforYy FLI_S -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T), 51720b2b626SsinceforYy FLI_D -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T), 51820b2b626SsinceforYy FMINM_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T), 51920b2b626SsinceforYy FMINM_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T), 52020b2b626SsinceforYy FMINM_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T), 52120b2b626SsinceforYy FMAXM_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T), 52220b2b626SsinceforYy FMAXM_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T), 52320b2b626SsinceforYy FMAXM_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T), 52420b2b626SsinceforYy FROUND_H -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fround, fWen = T, canRobCompress = T), 52520b2b626SsinceforYy FROUND_S -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fround, fWen = T, canRobCompress = T), 52620b2b626SsinceforYy FROUND_D -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fround, fWen = T, canRobCompress = T), 52720b2b626SsinceforYy FROUNDNX_H -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T), 52820b2b626SsinceforYy FROUNDNX_S -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T), 52920b2b626SsinceforYy FROUNDNX_D -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T), 53020b2b626SsinceforYy FCVTMOD_W_D -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvtmod_w_d, xWen = T, canRobCompress = T), 53120b2b626SsinceforYy FLEQ_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T), 53220b2b626SsinceforYy FLEQ_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T), 53320b2b626SsinceforYy FLEQ_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T), 53420b2b626SsinceforYy FLTQ_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T), 53520b2b626SsinceforYy FLTQ_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T), 53620b2b626SsinceforYy FLTQ_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T), 53720b2b626SsinceforYy ) 53820b2b626SsinceforYy} 53920b2b626SsinceforYy 540499d2763SZiyue Zhang/** 5414d24c305SYikeZhou * XiangShan Trap Decode constants 5424d24c305SYikeZhou */ 5434d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 544361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 54557a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 54657a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 5474d24c305SYikeZhou ) 5484d24c305SYikeZhou} 549be25371aSYikeZhou 55049f433deSXuan Huabstract class Imm(val len: Int) { 551b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 552b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 553b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 554b0ae3ac4SLinJiawei} 555b0ae3ac4SLinJiawei 556b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 557fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 558b0ae3ac4SLinJiawei 559b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 560b0ae3ac4SLinJiawei Cat(instr(31, 20)) 561b0ae3ac4SLinJiawei} 562b0ae3ac4SLinJiawei 563b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 564b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 565b0ae3ac4SLinJiawei 566b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 567b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 568b0ae3ac4SLinJiawei} 569b0ae3ac4SLinJiawei 570b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 571b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 572b0ae3ac4SLinJiawei 573b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 574b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 575b0ae3ac4SLinJiawei} 576b0ae3ac4SLinJiawei 577b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 578fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 579b0ae3ac4SLinJiawei 580b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 581b0ae3ac4SLinJiawei instr(31, 12) 582c2a8ae00SYikeZhou } 583c2a8ae00SYikeZhou} 584c2a8ae00SYikeZhou 585b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 586b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 587b0ae3ac4SLinJiawei 588b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 589b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 590b0ae3ac4SLinJiawei } 591b0ae3ac4SLinJiawei} 592b0ae3ac4SLinJiawei 593fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){ 594b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 595b0ae3ac4SLinJiawei 596b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 597fa16cf81Slewislzh Cat(instr(11, 7), instr(19, 15), instr(31, 20)) 598b0ae3ac4SLinJiawei } 59992c61038SXuan Hu 60092c61038SXuan Hu def getCSRAddr(imm: UInt): UInt = { 60192c61038SXuan Hu require(imm.getWidth == this.len) 60292c61038SXuan Hu imm(11, 0) 60392c61038SXuan Hu } 60492c61038SXuan Hu 60592c61038SXuan Hu def getRS1(imm: UInt): UInt = { 60692c61038SXuan Hu require(imm.getWidth == this.len) 60792c61038SXuan Hu imm(16, 12) 60892c61038SXuan Hu } 60992c61038SXuan Hu 61092c61038SXuan Hu def getRD(imm: UInt): UInt = { 61192c61038SXuan Hu require(imm.getWidth == this.len) 61292c61038SXuan Hu imm(21, 17) 61392c61038SXuan Hu } 61492c61038SXuan Hu 61592c61038SXuan Hu def getImm5(imm: UInt): UInt = { 61692c61038SXuan Hu require(imm.getWidth == this.len) 61792c61038SXuan Hu imm(16, 12) 61892c61038SXuan Hu } 619b0ae3ac4SLinJiawei} 620b0ae3ac4SLinJiawei 621ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 622ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 623ee8ff153Szfw 624ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 625ee8ff153Szfw instr(25, 20) 626ee8ff153Szfw } 627ee8ff153Szfw} 628ee8ff153Szfw 62958c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 63058c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 63158c35d23Shuxuan0307 63258c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 63358c35d23Shuxuan0307 instr(19, 15) 63458c35d23Shuxuan0307 } 63558c35d23Shuxuan0307} 636b52d4755SXuan Hu 63758c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 63858c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 63958c35d23Shuxuan0307 64058c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 64158c35d23Shuxuan0307 instr(19, 15) 64258c35d23Shuxuan0307 } 64358c35d23Shuxuan0307} 644b52d4755SXuan Hu 6454aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 6464aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6474aa9ed34Sfdy 6484aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6494aa9ed34Sfdy instr(30, 20) 6504aa9ed34Sfdy } 651e6ac7fe1SZiyue Zhang /** 652e6ac7fe1SZiyue Zhang * get VType from extended imm 653e6ac7fe1SZiyue Zhang * @param extedImm 654e6ac7fe1SZiyue Zhang * @return VType 655e6ac7fe1SZiyue Zhang */ 656e6ac7fe1SZiyue Zhang def getVType(extedImm: UInt): InstVType = { 657e6ac7fe1SZiyue Zhang val vtype = Wire(new InstVType) 658e6ac7fe1SZiyue Zhang vtype := extedImm(10, 0).asTypeOf(new InstVType) 659e6ac7fe1SZiyue Zhang vtype 660e6ac7fe1SZiyue Zhang } 6614aa9ed34Sfdy} 662b52d4755SXuan Hu 663e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){ 6644aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6654aa9ed34Sfdy 6664aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6675c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 668b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 669e6ac7fe1SZiyue Zhang val vtype8 = rvInst.ZIMM_VSETIVLI 670b52d4755SXuan Hu Cat(uimm5, vtype8) 671b52d4755SXuan Hu } 672b52d4755SXuan Hu /** 673b52d4755SXuan Hu * get VType from extended imm 674b52d4755SXuan Hu * @param extedImm 675b52d4755SXuan Hu * @return VType 676b52d4755SXuan Hu */ 677b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 678b52d4755SXuan Hu val vtype = Wire(new InstVType) 679e6ac7fe1SZiyue Zhang vtype := extedImm(9, 0).asTypeOf(new InstVType) 680b52d4755SXuan Hu vtype 681b52d4755SXuan Hu } 682b52d4755SXuan Hu 683b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 684e6ac7fe1SZiyue Zhang extedImm(14, 10) 6854aa9ed34Sfdy } 6864aa9ed34Sfdy} 687fe528fd6Ssinsanction 688fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){ 689fe528fd6Ssinsanction override def do_toImm32(minBits: UInt): UInt = minBits(31, 0) 690fe528fd6Ssinsanction 691fe528fd6Ssinsanction override def minBitsFromInstr(instr: UInt): UInt = { 692fe528fd6Ssinsanction instr(31, 0) 693fe528fd6Ssinsanction } 694fe528fd6Ssinsanction} 695fe528fd6Ssinsanction 6967e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){ 6977e30d16cSZhaoyang You override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 6987e30d16cSZhaoyang You 6997e30d16cSZhaoyang You override def minBitsFromInstr(instr: UInt): UInt = { 7007e30d16cSZhaoyang You Cat(instr(26), instr(19, 15)) 7017e30d16cSZhaoyang You } 7027e30d16cSZhaoyang You} 7037e30d16cSZhaoyang You 704b0ae3ac4SLinJiaweiobject ImmUnion { 705b0ae3ac4SLinJiawei val I = Imm_I() 706b0ae3ac4SLinJiawei val S = Imm_S() 707b0ae3ac4SLinJiawei val B = Imm_B() 708b0ae3ac4SLinJiawei val U = Imm_U() 709b0ae3ac4SLinJiawei val J = Imm_J() 710b0ae3ac4SLinJiawei val Z = Imm_Z() 711ee8ff153Szfw val B6 = Imm_B6() 71258c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 71358c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 7144aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 7154aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 716fe528fd6Ssinsanction val LUI32 = Imm_LUI32() 7177e30d16cSZhaoyang You val VRORVI = Imm_VRORVI() 7184aa9ed34Sfdy 719520f7dacSsinsanction // do not add special type lui32 to this, keep ImmUnion max len being 20. 7207e30d16cSZhaoyang You val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI) 721b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 722b0ae3ac4SLinJiawei val immSelMap = Seq( 723b0ae3ac4SLinJiawei SelImm.IMM_I, 724b0ae3ac4SLinJiawei SelImm.IMM_S, 725b0ae3ac4SLinJiawei SelImm.IMM_SB, 726b0ae3ac4SLinJiawei SelImm.IMM_U, 727b0ae3ac4SLinJiawei SelImm.IMM_UJ, 728ee8ff153Szfw SelImm.IMM_Z, 72958c35d23Shuxuan0307 SelImm.IMM_B6, 73058c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 7314aa9ed34Sfdy SelImm.IMM_OPIVIU, 7324aa9ed34Sfdy SelImm.IMM_VSETVLI, 733fe528fd6Ssinsanction SelImm.IMM_VSETIVLI, 7347e30d16cSZhaoyang You SelImm.IMM_VRORVI, 735b0ae3ac4SLinJiawei ).zip(imms) 736b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 737b0ae3ac4SLinJiawei} 738b0ae3ac4SLinJiawei 739fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 740fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 741fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 742765e58c6Ssinsanction Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm) 743fd7603d9SYinan Xu } 7443b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 745fd7603d9SYinan Xu val loadImmLen = Imm_I().len 7463b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 747f4dcd9fcSsinsanction Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0)) 748fd7603d9SYinan Xu } 749fd7603d9SYinan Xu} 750b0ae3ac4SLinJiawei 751be25371aSYikeZhou/** 752be25371aSYikeZhou * IO bundle for the Decode unit 753be25371aSYikeZhou */ 754aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle { 755aaa08c5aSxiaofeibao-xjtu val decodedInst = Output(new DecodedInst) 756aaa08c5aSxiaofeibao-xjtu val isComplex = Output(Bool()) 757aaa08c5aSxiaofeibao-xjtu val uopInfo = Output(new UopInfo) 758aaa08c5aSxiaofeibao-xjtu} 7592225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 7603b739f49SXuan Hu val enq = new Bundle { 7613b739f49SXuan Hu val ctrlFlow = Input(new StaticInst) 762d91483a6Sfdy val vtype = Input(new VType) 7635110577fSZiyue Zhang val vstart = Input(Vl()) 7644aa9ed34Sfdy } 7653b739f49SXuan Hu// val vconfig = Input(UInt(XLEN.W)) 766aaa08c5aSxiaofeibao-xjtu val deq = new DecodeUnitDeqIO 767af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 76815ed99a7SXuan Hu val fromCSR = Input(new CSRToDecode) 769be25371aSYikeZhou} 770be25371aSYikeZhou 771be25371aSYikeZhou/** 772be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 773be25371aSYikeZhou */ 7742225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 775be25371aSYikeZhou val io = IO(new DecodeUnitIO) 776be25371aSYikeZhou 7773b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 778be25371aSYikeZhou 77975e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 78075e2c883SXuan Hu 78157a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 78257a10886SXuan Hu FpDecode.table ++ 783bdda74fdSxiaofeibao-xjtu// FDivSqrtDecode.table ++ 784768f5f91SYangyu Chen BitmanipDecode.table ++ 785768f5f91SYangyu Chen ScalarCryptoDecode.table ++ 786a19215ddSYinan Xu XSTrapDecode.table ++ 787a19215ddSYinan Xu CBODecode.table ++ 788b65b9ebaSXuan Hu SvinvalDecode.table ++ 789e25e4d90SXuan Hu HypervisorDecode.table ++ 790545d7be0SYangyu Chen VecDecoder.table ++ 791499d2763SZiyue Zhang ZicondDecode.table ++ 79220b2b626SsinceforYy ZimopDecode.table ++ 79320b2b626SsinceforYy ZfaDecode.table 794b65b9ebaSXuan Hu 79589cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 796a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 797239413e5SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue 798a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 799a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 800be25371aSYikeZhou 8014d24c305SYikeZhou // output 8023b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 803be25371aSYikeZhou 8042ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 8057ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 8063b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 807ec427417Slinzhida decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags 8081a1319cbSLinJiawei 8093b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 8103b739f49SXuan Hu 811a8db15d8Sfdy decodedInst.uopIdx := 0.U 812d91483a6Sfdy decodedInst.firstUop := true.B 813d91483a6Sfdy decodedInst.lastUop := true.B 814f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 8153235a9d8SZiyue-Zhang decodedInst.numWB := 1.U 816deb6421eSHaojin Tang 817499d2763SZiyue Zhang val isZimop = (BitPat("b1?00??0111??_?????_100_?????_1110011") === ctrl_flow.instr) || 818499d2763SZiyue Zhang (BitPat("b1?00??1?????_?????_100_?????_1110011") === ctrl_flow.instr) 819499d2763SZiyue Zhang 82073c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 821499d2763SZiyue Zhang // temp decode zimop as move 822499d2763SZiyue Zhang decodedInst.isMove := (isMove || isZimop) && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep 82373c4359eSYikeZhou 82449a2cda2SXuan Hu // fmadd - b1000011 82549a2cda2SXuan Hu // fmsub - b1000111 82649a2cda2SXuan Hu // fnmsub- b1001011 82749a2cda2SXuan Hu // fnmadd- b1001111 82849a2cda2SXuan Hu private val isFMA = inst.OPCODE === BitPat("b100??11") 829e8b68a8eSgood-circle private val isVppu = FuType.isVppu(decodedInst.fuType) 830e8b68a8eSgood-circle private val isVecOPF = FuType.isVecOPF(decodedInst.fuType) 83149a2cda2SXuan Hu 832178dd38cSYikeZhou // read src1~3 location 83398cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 83498cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 83549a2cda2SXuan Hu // src(2) of fma is fs3, src(2) of vector inst is old vd 83649a2cda2SXuan Hu decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD) 8379c5a1080Sxiaofeibao decodedInst.lsrc(3) := V0_IDX.U 8389c5a1080Sxiaofeibao decodedInst.lsrc(4) := Vl_IDX.U 839b6b11f60SXuan Hu 840178dd38cSYikeZhou // read dest location 84198cfe81bSxgkiri decodedInst.ldest := inst.RD 8424d24c305SYikeZhou 843e4e68f86Sxiaofeibao // init v0Wen vlWen 844e4e68f86Sxiaofeibao decodedInst.v0Wen := false.B 845e4e68f86Sxiaofeibao decodedInst.vlWen := false.B 846e4e68f86Sxiaofeibao 847c2a8ae00SYikeZhou // fill in exception vector 848567f0269Ssinsanction val vecException = Module(new VecExceptionGen) 849567f0269Ssinsanction vecException.io.inst := io.enq.ctrlFlow.instr 850567f0269Ssinsanction vecException.io.decodedInst := decodedInst 851bdda74fdSxiaofeibao-xjtu vecException.io.vtype := decodedInst.vpu.vtype 8525110577fSZiyue Zhang vecException.io.vstart := decodedInst.vpu.vstart 8534d24c305SYikeZhou 85415ed99a7SXuan Hu private val exceptionII = 85515ed99a7SXuan Hu decodedInst.selImm === SelImm.INVALID_INSTR || 85615ed99a7SXuan Hu vecException.io.illegalInst || 85715ed99a7SXuan Hu io.fromCSR.illegalInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 85815ed99a7SXuan Hu io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 85915ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g || 86015ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v || 86115ed99a7SXuan Hu io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 8628b7dc6f5SsinceforYy io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 8638b7dc6f5SsinceforYy io.fromCSR.illegalInst.fsIsOff && (FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) || 8648b7dc6f5SsinceforYy (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) || 865d60bfe5aSsinceforYy FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) || 866d60bfe5aSsinceforYy isVecOPF) || 867b50a88ecSXuan Hu io.fromCSR.illegalInst.vsIsOff && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) || 868689f6b88SsinceforYy io.fromCSR.illegalInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) || 869689f6b88SsinceforYy (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)) || 870689f6b88SsinceforYy (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm 87115ed99a7SXuan Hu 87215ed99a7SXuan Hu private val exceptionVI = 87315ed99a7SXuan Hu io.fromCSR.virtualInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 87415ed99a7SXuan Hu io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 87515ed99a7SXuan Hu io.fromCSR.virtualInst.hfence && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) || 87615ed99a7SXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 877b50a88ecSXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 878b50a88ecSXuan Hu io.fromCSR.virtualInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) 87915ed99a7SXuan Hu 8805a9dd560SXuan Hu decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II) 88115ed99a7SXuan Hu decodedInst.exceptionVec(virtualInstr) := exceptionVI 882d0de7e4aSpeixiaokun 8837e0f64b0SGuanghui Cheng //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry. 8847e0f64b0SGuanghui Cheng decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger) 8857e0f64b0SGuanghui Cheng 8863b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 887b0ae3ac4SLinJiawei x => { 8887ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 889b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 890b0ae3ac4SLinJiawei x._1 -> minBits 891b0ae3ac4SLinJiawei } 892b0ae3ac4SLinJiawei )) 893aac4464eSYinan Xu 8947531c765SXuan Hu private val isLs = FuType.isLoadStore(decodedInst.fuType) 8957531c765SXuan Hu private val isVls = FuType.isVls(decodedInst.fuType) 8967531c765SXuan Hu private val isStore = FuType.isStore(decodedInst.fuType) 8977531c765SXuan Hu private val isAMO = FuType.isAMO(decodedInst.fuType) 8987531c765SXuan Hu private val isVStore = FuType.isVStore(decodedInst.fuType) 8997531c765SXuan Hu private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType) 9007531c765SXuan Hu 9017531c765SXuan Hu decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch) 90275e2c883SXuan Hu 90375e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 904be25371aSYikeZhou 9050bca6cb3SZiyue Zhang private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S) 90639c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 90739c388b5SXuan Hu private val narrowInsts = Seq( 90839c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 90939c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 91039c388b5SXuan Hu ) 91139c388b5SXuan Hu private val maskDstInsts = Seq( 91239c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 91339c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 91439c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 9159eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 9169eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 9179eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 9189eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 919f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 92039c388b5SXuan Hu ) 92130fcc710SZiyue Zhang private val maskOpInsts = Seq( 92230fcc710SZiyue Zhang VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 92330fcc710SZiyue Zhang ) 92494e6af68SZiyue-Zhang private val vmaInsts = Seq( 92594e6af68SZiyue-Zhang VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX, 92694e6af68SZiyue-Zhang VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX, 92794e6af68SZiyue-Zhang ) 928bdda74fdSxiaofeibao-xjtu private val wfflagsInsts = Seq( 929bdda74fdSxiaofeibao-xjtu // opfff 930bdda74fdSxiaofeibao-xjtu FADD_S, FSUB_S, FADD_D, FSUB_D, 931bdda74fdSxiaofeibao-xjtu FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, 932bdda74fdSxiaofeibao-xjtu FMIN_S, FMAX_S, FMIN_D, FMAX_D, 933bdda74fdSxiaofeibao-xjtu FMUL_S, FMUL_D, 934bdda74fdSxiaofeibao-xjtu FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, 935bdda74fdSxiaofeibao-xjtu FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, 936bdda74fdSxiaofeibao-xjtu FSGNJ_S, FSGNJN_S, FSGNJX_S, 937bdda74fdSxiaofeibao-xjtu // opfvv 938bdda74fdSxiaofeibao-xjtu VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV, 939bdda74fdSxiaofeibao-xjtu VFMUL_VV, VFDIV_VV, VFWMUL_VV, 940bdda74fdSxiaofeibao-xjtu VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV, 941bdda74fdSxiaofeibao-xjtu VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV, 942bdda74fdSxiaofeibao-xjtu VFSQRT_V, 943bdda74fdSxiaofeibao-xjtu VFMIN_VV, VFMAX_VV, 944bdda74fdSxiaofeibao-xjtu VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV, 945bdda74fdSxiaofeibao-xjtu VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV, 946bdda74fdSxiaofeibao-xjtu // opfvf 947bdda74fdSxiaofeibao-xjtu VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF, 948bdda74fdSxiaofeibao-xjtu VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF, 949bdda74fdSxiaofeibao-xjtu VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF, 950bdda74fdSxiaofeibao-xjtu VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF, 951bdda74fdSxiaofeibao-xjtu VFMIN_VF, VFMAX_VF, 952bdda74fdSxiaofeibao-xjtu VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF, 953bdda74fdSxiaofeibao-xjtu VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF, 954aab8ef9cSxiaofeibao-xjtu // vfred 955aab8ef9cSxiaofeibao-xjtu VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS, 956bdda74fdSxiaofeibao-xjtu // fcvt & vfcvt 957bdda74fdSxiaofeibao-xjtu FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU, 958bdda74fdSxiaofeibao-xjtu FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 959bdda74fdSxiaofeibao-xjtu FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU, 960bdda74fdSxiaofeibao-xjtu FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 961b189aafaSzmx FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H, 962ba899681Schengguanghui 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, 963ba899681Schengguanghui 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, 964ba899681Schengguanghui 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, 965ba899681Schengguanghui VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V, 96620b2b626SsinceforYy // zfa 96720b2b626SsinceforYy FLEQ_H, FLEQ_S, FLEQ_D, FLTQ_H, FLTQ_S, FLTQ_D, 96820b2b626SsinceforYy FMINM_H, FMINM_S, FMINM_D, FMAXM_H, FMAXM_S, FMAXM_D, 96920b2b626SsinceforYy FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D, 97020b2b626SsinceforYy FCVTMOD_W_D, 971bdda74fdSxiaofeibao-xjtu ) 972689f6b88SsinceforYy 973689f6b88SsinceforYy private val scalaNeedFrmInsts = Seq( 974689f6b88SsinceforYy FADD_S, FSUB_S, FADD_D, FSUB_D, 975689f6b88SsinceforYy FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 976689f6b88SsinceforYy FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 97720b2b626SsinceforYy FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D, 978689f6b88SsinceforYy ) 979689f6b88SsinceforYy 980689f6b88SsinceforYy private val vectorNeedFrmInsts = Seq ( 981689f6b88SsinceforYy VFSLIDE1UP_VF, VFSLIDE1DOWN_VF, 982689f6b88SsinceforYy ) 983689f6b88SsinceforYy 984bdda74fdSxiaofeibao-xjtu decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _) 985689f6b88SsinceforYy decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 986689f6b88SsinceforYy decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 987bdda74fdSxiaofeibao-xjtu val fpToVecDecoder = Module(new FPToVecDecoder()) 988bdda74fdSxiaofeibao-xjtu fpToVecDecoder.io.instr := inst.asUInt 989bdda74fdSxiaofeibao-xjtu val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst 9903b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 991bdda74fdSxiaofeibao-xjtu when(isFpToVecInst){ 992bdda74fdSxiaofeibao-xjtu decodedInst.vpu := fpToVecDecoder.io.vpuCtrl 993bdda74fdSxiaofeibao-xjtu }.otherwise{ 99475e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 99575e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 99675e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 99775e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 99875e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 99975e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 100075e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 1001d9355d3aSZiyue-Zhang decodedInst.vpu.veew := inst.WIDTH 100294e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 100339c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 1004b6279fc6SZiyue Zhang val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _) 1005b6279fc6SZiyue Zhang val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 1006b6279fc6SZiyue Zhang val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _) 1007b6279fc6SZiyue Zhang val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe 1008dab1ad8cSsinsanction val isVle = decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse 1009dab1ad8cSsinsanction val isVlm = decodedInst.fuOpType === VlduType.vlm 101081229133SZiyue Zhang val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV || decodedInst.uopSplitType === UopSplitType.VEC_VWW 101194e6af68SZiyue-Zhang val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _) 1012dab1ad8cSsinsanction val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew 1013b6279fc6SZiyue Zhang decodedInst.vpu.isNarrow := isNarrow 1014b6279fc6SZiyue Zhang decodedInst.vpu.isDstMask := isDstMask 1015b6279fc6SZiyue Zhang decodedInst.vpu.isOpMask := isOpMask 101694e6af68SZiyue-Zhang decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma 1017dab1ad8cSsinsanction decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac 10185110577fSZiyue Zhang decodedInst.vpu.vstart := io.enq.vstart 1019bdda74fdSxiaofeibao-xjtu } 102006f0a37aSZiyue Zhang decodedInst.vpu.specVill := io.enq.vtype.illegal 102106f0a37aSZiyue Zhang decodedInst.vpu.specVma := io.enq.vtype.vma 102206f0a37aSZiyue Zhang decodedInst.vpu.specVta := io.enq.vtype.vta 102306f0a37aSZiyue Zhang decodedInst.vpu.specVsew := io.enq.vtype.vsew 102406f0a37aSZiyue Zhang decodedInst.vpu.specVlmul := io.enq.vtype.vlmul 102575e2c883SXuan Hu 102631c51290Szhanglinjuan decodedInst.vlsInstr := isVls 102731c51290Szhanglinjuan 10286d56ac16Ssinsanction decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src 10296d56ac16Ssinsanction decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig 10306d56ac16Ssinsanction 10317f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 103287dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 103387dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 103406cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 103587dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 10360a34fc22SZiyue Zhang uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0) 1037c4501a6fSZiyue-Zhang uopInfoGen.io.in.preInfo.nf := inst.NF 103806cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr 1039c90e3eacSZiyue Zhang uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm 10407f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 1041ddc88dadSxiaofeibao // numOfUop should be 1 when vector instruction is illegalInst 1042ddc88dadSxiaofeibao io.deq.uopInfo.numOfUop := Mux(vecException.io.illegalInst, 1.U, uopInfoGen.io.out.uopInfo.numOfUop) 10433235a9d8SZiyue-Zhang io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB 10447f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 10457f9f0a79SzhanglyGit 1046*a9becb0dSJunxiong Ji val isCsr = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U 1047*a9becb0dSJunxiong Ji val isCsrr = isCsr && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U 1048*a9becb0dSJunxiong Ji val isCsrw = isCsr && inst.FUNCT3 === BitPat("b?01") && inst.RD === 0.U 1049*a9becb0dSJunxiong Ji dontTouch(isCsrr) 1050*a9becb0dSJunxiong Ji dontTouch(isCsrw) 1051cc1eb70dSXuan Hu 105287c5d21dSZiyue Zhang // for csrr vl instruction, convert to vsetvl 1053*a9becb0dSJunxiong Ji val isCsrrVlenb = isCsrr && inst.CSRIDX === CSRs.vlenb.U 1054*a9becb0dSJunxiong Ji val isCsrrVl = isCsrr && inst.CSRIDX === CSRs.vl.U 1055cc1eb70dSXuan Hu 1056ac17908cSHuijin Li // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i) 1057ac17908cSHuijin Li val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U 1058ac17908cSHuijin Li val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W) 1059ac17908cSHuijin Li val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W) 1060ac17908cSHuijin Li val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W) 1061ac17908cSHuijin Li 106220b2b626SsinceforYy // for fli.s|fli.d instruction 106320b2b626SsinceforYy val isFLI = inst.FUNCT7 === BitPat("b11110??") && inst.RS2 === 1.U && inst.RM === 0.U && inst.OPCODE5Bit === OPCODE5Bit.OP_FP 106420b2b626SsinceforYy 106587c5d21dSZiyue Zhang when (isCsrrVl) { 106663cb3754SZiyue Zhang // convert to vsetvl instruction 106787c5d21dSZiyue Zhang decodedInst.srcType(0) := SrcType.no 106887c5d21dSZiyue Zhang decodedInst.srcType(1) := SrcType.no 106987c5d21dSZiyue Zhang decodedInst.srcType(2) := SrcType.no 107087c5d21dSZiyue Zhang decodedInst.srcType(3) := SrcType.no 107187c5d21dSZiyue Zhang decodedInst.srcType(4) := SrcType.vp 107287c5d21dSZiyue Zhang decodedInst.lsrc(4) := Vl_IDX.U 107363cb3754SZiyue Zhang decodedInst.waitForward := false.B 107487c5d21dSZiyue Zhang decodedInst.blockBackward := false.B 10758c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 107663cb3754SZiyue Zhang }.elsewhen (isCsrrVlenb) { 107763cb3754SZiyue Zhang // convert to addi instruction 1078828a8a48SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 1079828a8a48SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 108063cb3754SZiyue Zhang decodedInst.srcType(2) := SrcType.no 108163cb3754SZiyue Zhang decodedInst.srcType(3) := SrcType.no 108263cb3754SZiyue Zhang decodedInst.srcType(4) := SrcType.no 108363cb3754SZiyue Zhang decodedInst.selImm := SelImm.IMM_I 108463cb3754SZiyue Zhang decodedInst.waitForward := false.B 108563cb3754SZiyue Zhang decodedInst.blockBackward := false.B 108663cb3754SZiyue Zhang decodedInst.canRobCompress := true.B 10878c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 1088ac17908cSHuijin Li }.elsewhen (isPreW || isPreR || isPreI) { 1089ac17908cSHuijin Li decodedInst.selImm := SelImm.IMM_S 1090ac17908cSHuijin Li decodedInst.fuType := FuType.ldu.U 1091ac17908cSHuijin Li decodedInst.canRobCompress := false.B 1092ac17908cSHuijin Li decodedInst.fuOpType := Mux1H(Seq( 1093ac17908cSHuijin Li isPreW -> LSUOpType.prefetch_w, 1094ac17908cSHuijin Li isPreR -> LSUOpType.prefetch_r, 1095ac17908cSHuijin Li isPreI -> LSUOpType.prefetch_i, 1096ac17908cSHuijin Li )) 1097499d2763SZiyue Zhang }.elsewhen (isZimop) { 1098499d2763SZiyue Zhang // set srcType for zimop 1099499d2763SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 1100499d2763SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 1101499d2763SZiyue Zhang // use x0 as src1 1102499d2763SZiyue Zhang decodedInst.lsrc(0) := 0.U 110387c5d21dSZiyue Zhang } 110487c5d21dSZiyue Zhang 110575e2c883SXuan Hu io.deq.decodedInst := decodedInst 11069faa51afSxiaofeibao-xjtu io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen 1107985804e6SXuan Hu io.deq.decodedInst.fuType := Mux1H(Seq( 1108cc1eb70dSXuan Hu // keep condition 1109cc1eb70dSXuan Hu (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType, 111087c5d21dSZiyue Zhang (isCsrrVl) -> FuType.vsetfwf.U, 111163cb3754SZiyue Zhang (isCsrrVlenb) -> FuType.alu.U, 1112cc1eb70dSXuan Hu 1113cc1eb70dSXuan Hu // change vlsu to vseglsu when NF =/= 0.U 1114f94f6503SXuan 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, 1115f94f6503SXuan Hu // MOP === b00 && SUMOP === b01000: unit-stride whole register store 1116f94f6503SXuan Hu // MOP =/= b00 : strided and indexed store 1117f94f6503SXuan 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, 1118f94f6503SXuan Hu // MOP === b00 && LUMOP === b01000: unit-stride whole register load 1119f94f6503SXuan Hu // MOP =/= b00 : strided and indexed load 1120f94f6503SXuan 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, 1121985804e6SXuan Hu )) 1122499d2763SZiyue Zhang io.deq.decodedInst.imm := MuxCase(decodedInst.imm, Seq( 1123499d2763SZiyue Zhang isCsrrVlenb -> (VLEN / 8).U, 1124499d2763SZiyue Zhang isZimop -> 0.U, 1125499d2763SZiyue Zhang )) 1126cc1eb70dSXuan Hu 11274fe0a83eSXuan Hu io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq( 1128cc1eb70dSXuan Hu isCsrrVl -> VSETOpType.csrrvl, 1129cc1eb70dSXuan Hu isCsrrVlenb -> ALUOpType.add, 113020b2b626SsinceforYy isFLI -> Cat(1.U, inst.FMT, inst.RS1), 11314fe0a83eSXuan Hu )) 11324fe0a83eSXuan Hu 1133*a9becb0dSJunxiong Ji // io.deq.decodedInst.blockBackward := MuxCase(decodedInst.blockBackward, Seq( 1134*a9becb0dSJunxiong Ji // isRoCsrr -> false.B, 1135*a9becb0dSJunxiong Ji // )) 1136be25371aSYikeZhou //------------------------------------------------------------- 1137be25371aSYikeZhou // Debug Info 11383b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 11393b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 11403b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 11413b739f49SXuan 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", 11423b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 11433b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 11443b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 11453b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 11463b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 11473b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 11483b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 11493b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 1150be25371aSYikeZhou} 1151