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 */ 42*f7fe02a8Sjunxiong-jitrait 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), 231211d620bSlewislzh PAUSE -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 2324d24c305SYikeZhou 233768f5f91SYangyu Chen // RV64A 23457a10886SXuan Hu AMOADD_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23557a10886SXuan Hu AMOXOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23657a10886SXuan Hu AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23757a10886SXuan Hu AMOAND_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23857a10886SXuan Hu AMOOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23957a10886SXuan Hu AMOMIN_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24057a10886SXuan Hu AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24157a10886SXuan Hu AMOMAX_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24257a10886SXuan Hu AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24312861ac7Slinzhida AMOCAS_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amocas_w, SelImm.X, uopSplitType = UopSplitType.AMO_CAS_W, xWen = T, noSpec = T, blockBack = T), 2444d24c305SYikeZhou 24557a10886SXuan Hu AMOADD_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24657a10886SXuan Hu AMOXOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24757a10886SXuan Hu AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24857a10886SXuan Hu AMOAND_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24957a10886SXuan Hu AMOOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 25057a10886SXuan Hu AMOMIN_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 25157a10886SXuan Hu AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25257a10886SXuan Hu AMOMAX_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 25357a10886SXuan Hu AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25412861ac7Slinzhida AMOCAS_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amocas_d, SelImm.X, uopSplitType = UopSplitType.AMO_CAS_D, xWen = T, noSpec = T, blockBack = T), 25512861ac7Slinzhida 25612861ac7Slinzhida AMOCAS_Q -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amocas_q, SelImm.X, uopSplitType = UopSplitType.AMO_CAS_Q, xWen = T, noSpec = T, blockBack = T), 2574d24c305SYikeZhou 25857a10886SXuan Hu LR_W -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25957a10886SXuan Hu LR_D -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 26057a10886SXuan Hu SC_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 26157a10886SXuan Hu SC_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 262768f5f91SYangyu Chen ) 263768f5f91SYangyu Chen} 264ee8ff153Szfw 265768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{ 266768f5f91SYangyu Chen /* 267768f5f91SYangyu Chen Note: Some Bitmanip instruction may have different OP code between rv32 and rv64. 268768f5f91SYangyu Chen Including pseudo instruction like zext.h, and different funct12 like rev8. 269768f5f91SYangyu Chen If some day we need to support change XLEN via CSR, we should care about this. 270768f5f91SYangyu Chen */ 271768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 272768f5f91SYangyu Chen // Zba 273768f5f91SYangyu Chen ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T, canRobCompress = T), 274768f5f91SYangyu Chen SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T, canRobCompress = T), 275768f5f91SYangyu Chen SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T, canRobCompress = T), 276768f5f91SYangyu Chen SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T, canRobCompress = T), 277768f5f91SYangyu Chen SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T, canRobCompress = T), 278768f5f91SYangyu Chen SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T, canRobCompress = T), 279768f5f91SYangyu Chen SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T, canRobCompress = T), 280768f5f91SYangyu Chen SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T, canRobCompress = T), 281768f5f91SYangyu Chen 282768f5f91SYangyu Chen // Zbb 28389cc69c1STang Haojin ANDN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn , SelImm.X , xWen = T, canRobCompress = T), 28489cc69c1STang Haojin ORN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X , xWen = T, canRobCompress = T), 28589cc69c1STang Haojin XNOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor , SelImm.X , xWen = T, canRobCompress = T), 286ee8ff153Szfw 287768f5f91SYangyu Chen CLZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz , SelImm.X , xWen = T, canRobCompress = T), 288768f5f91SYangyu Chen CLZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw , SelImm.X , xWen = T, canRobCompress = T), 289768f5f91SYangyu Chen CTZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz , SelImm.X , xWen = T, canRobCompress = T), 290768f5f91SYangyu Chen CTZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw , SelImm.X , xWen = T, canRobCompress = T), 291768f5f91SYangyu Chen 292768f5f91SYangyu Chen CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop , SelImm.X , xWen = T, canRobCompress = T), 293768f5f91SYangyu Chen CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw , SelImm.X , xWen = T, canRobCompress = T), 294768f5f91SYangyu Chen 29589cc69c1STang Haojin MAX -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X , xWen = T, canRobCompress = T), 29689cc69c1STang Haojin MAXU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu , SelImm.X , xWen = T, canRobCompress = T), 297768f5f91SYangyu Chen MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X , xWen = T, canRobCompress = T), 298768f5f91SYangyu Chen MINU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu , SelImm.X , xWen = T, canRobCompress = T), 299ee8ff153Szfw 30089cc69c1STang Haojin SEXT_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sextb , SelImm.X , xWen = T, canRobCompress = T), 30189cc69c1STang Haojin SEXT_H -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sexth , SelImm.X , xWen = T, canRobCompress = T), 302768f5f91SYangyu Chen // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0. 303768f5f91SYangyu Chen // If we configured to have no Zbkb, we should add zext.h here. 304ee8ff153Szfw 305768f5f91SYangyu Chen ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol , SelImm.X , xWen = T, canRobCompress = T), 306768f5f91SYangyu Chen ROLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw , SelImm.X , xWen = T, canRobCompress = T), 30789cc69c1STang Haojin ROR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.X , xWen = T, canRobCompress = T), 30889cc69c1STang Haojin RORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.IMM_I, xWen = T, canRobCompress = T), 309768f5f91SYangyu Chen RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.IMM_I, xWen = T, canRobCompress = T), 310768f5f91SYangyu Chen RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.X , xWen = T, canRobCompress = T), 311ee8ff153Szfw 312768f5f91SYangyu Chen ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb , SelImm.X , xWen = T, canRobCompress = T), 313768f5f91SYangyu Chen 314768f5f91SYangyu Chen REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X , xWen = T, canRobCompress = T), 315768f5f91SYangyu Chen 316768f5f91SYangyu Chen // Zbc 317768f5f91SYangyu Chen CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul , SelImm.X , xWen = T, canRobCompress = T), 318768f5f91SYangyu Chen CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh , SelImm.X , xWen = T, canRobCompress = T), 319768f5f91SYangyu Chen CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr , SelImm.X , xWen = T, canRobCompress = T), 320768f5f91SYangyu Chen 321768f5f91SYangyu Chen // Zbs 322768f5f91SYangyu Chen BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.X , xWen = T, canRobCompress = T), 323768f5f91SYangyu Chen BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.IMM_I, xWen = T, canRobCompress = T), 324768f5f91SYangyu Chen BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.X , xWen = T, canRobCompress = T), 325768f5f91SYangyu Chen BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.IMM_I, xWen = T, canRobCompress = T), 326768f5f91SYangyu Chen BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.X , xWen = T, canRobCompress = T), 327768f5f91SYangyu Chen BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.IMM_I, xWen = T, canRobCompress = T), 328768f5f91SYangyu Chen BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.X , xWen = T, canRobCompress = T), 329768f5f91SYangyu Chen BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.IMM_I, xWen = T, canRobCompress = T), 330768f5f91SYangyu Chen 331768f5f91SYangyu Chen // Zbkb 332768f5f91SYangyu Chen // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb 333768f5f91SYangyu Chen PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X , xWen = T, canRobCompress = T), 334768f5f91SYangyu Chen PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh , SelImm.X , xWen = T, canRobCompress = T), 335768f5f91SYangyu Chen PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw , SelImm.X , xWen = T, canRobCompress = T), 336768f5f91SYangyu Chen BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X , xWen = T, canRobCompress = T), 337768f5f91SYangyu Chen // If configured to RV32, we should add zip and unzip. 338768f5f91SYangyu Chen 339768f5f91SYangyu Chen // Zbkc 340768f5f91SYangyu Chen // clmul, clmulh is in Zbc 341768f5f91SYangyu Chen 342768f5f91SYangyu Chen // Zbkx 343768f5f91SYangyu Chen XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn , SelImm.X , xWen = T, canRobCompress = T), 344768f5f91SYangyu Chen XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb , SelImm.X , xWen = T, canRobCompress = T), 345768f5f91SYangyu Chen ) 346768f5f91SYangyu Chen} 347768f5f91SYangyu Chen 348768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants { 349768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 350768f5f91SYangyu Chen // Zknd: NIST Suite: AES Decryption 351768f5f91SYangyu Chen AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds , SelImm.X , xWen = T, canRobCompress = T), 352768f5f91SYangyu Chen AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm , SelImm.X , xWen = T, canRobCompress = T), 353768f5f91SYangyu Chen AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im , SelImm.X , xWen = T, canRobCompress = T), 354768f5f91SYangyu Chen AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T), 355768f5f91SYangyu Chen AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2 , SelImm.X , xWen = T, canRobCompress = T), 356768f5f91SYangyu Chen 357768f5f91SYangyu Chen // Zkne: NIST Suite: AES Encryption 358768f5f91SYangyu Chen // aes64ks1i, aes64ks2 is in Zknd 359768f5f91SYangyu Chen AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es , SelImm.X , xWen = T, canRobCompress = T), 360768f5f91SYangyu Chen AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm , SelImm.X , xWen = T, canRobCompress = T), 361768f5f91SYangyu Chen 362768f5f91SYangyu Chen // Zknh: NIST Suite: Hash Function Instructions 363768f5f91SYangyu Chen SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T, canRobCompress = T), 364768f5f91SYangyu Chen SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T, canRobCompress = T), 365768f5f91SYangyu Chen SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T, canRobCompress = T), 366768f5f91SYangyu Chen SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T, canRobCompress = T), 367768f5f91SYangyu Chen SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T, canRobCompress = T), 368768f5f91SYangyu Chen SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T, canRobCompress = T), 369768f5f91SYangyu Chen SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T, canRobCompress = T), 370768f5f91SYangyu Chen SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T, canRobCompress = T), 371768f5f91SYangyu Chen 372768f5f91SYangyu Chen // Zksed: ShangMi Suite: SM4 Block Cipher Instructions 373768f5f91SYangyu Chen SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0 , SelImm.X , xWen = T, canRobCompress = T), 374768f5f91SYangyu Chen SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1 , SelImm.X , xWen = T, canRobCompress = T), 375768f5f91SYangyu Chen SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2 , SelImm.X , xWen = T, canRobCompress = T), 376768f5f91SYangyu Chen SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3 , SelImm.X , xWen = T, canRobCompress = T), 377768f5f91SYangyu Chen SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0 , SelImm.X , xWen = T, canRobCompress = T), 378768f5f91SYangyu Chen SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1 , SelImm.X , xWen = T, canRobCompress = T), 379768f5f91SYangyu Chen SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2 , SelImm.X , xWen = T, canRobCompress = T), 380768f5f91SYangyu Chen SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3 , SelImm.X , xWen = T, canRobCompress = T), 381768f5f91SYangyu Chen 382768f5f91SYangyu Chen // Zksh: ShangMi Suite: SM3 Hash Function Instructions 383768f5f91SYangyu Chen SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0 , SelImm.X , xWen = T, canRobCompress = T), 384768f5f91SYangyu Chen SM3P1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p1 , SelImm.X , xWen = T, canRobCompress = T), 3854d24c305SYikeZhou ) 386be25371aSYikeZhou} 387be25371aSYikeZhou 388be25371aSYikeZhou/** 389be25371aSYikeZhou * FP Decode constants 390be25371aSYikeZhou */ 39157a10886SXuan Huobject FpDecode extends DecodeConstants{ 39257a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 393b189aafaSzmx FLH -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh, selImm = SelImm.IMM_I, fWen = T), 39457a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 39557a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 396b189aafaSzmx FSH -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sh, selImm = SelImm.IMM_S ), 39757a10886SXuan Hu FSW -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S ), 39857a10886SXuan Hu FSD -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S ), 3994d24c305SYikeZhou 400964d9a87SZiyue Zhang FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T), 401964d9a87SZiyue Zhang FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T), 402b189aafaSzmx FMV_H_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_H_X, fWen = T, canRobCompress = T), 403c2a8ae00SYikeZhou 4044d24c305SYikeZhou // Int to FP 40589cc69c1STang Haojin FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40689cc69c1STang Haojin FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40789cc69c1STang Haojin FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 40889cc69c1STang Haojin FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4094d24c305SYikeZhou 41089cc69c1STang Haojin FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 41189cc69c1STang Haojin FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 41289cc69c1STang Haojin FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 41389cc69c1STang Haojin FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4144d24c305SYikeZhou 415614d2bc6SHeiHuDie FCVT_H_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 416614d2bc6SHeiHuDie FCVT_H_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 417614d2bc6SHeiHuDie FCVT_H_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 418614d2bc6SHeiHuDie FCVT_H_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 4194d24c305SYikeZhou ) 420be25371aSYikeZhou} 421be25371aSYikeZhou 422be25371aSYikeZhou/** 423be25371aSYikeZhou * FP Divide SquareRoot Constants 424be25371aSYikeZhou */ 425be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 42657a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 42789cc69c1STang Haojin FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 42889cc69c1STang Haojin FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 42989cc69c1STang Haojin FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 43089cc69c1STang Haojin FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 4314d24c305SYikeZhou ) 432be25371aSYikeZhou} 433be25371aSYikeZhou 4344d24c305SYikeZhou/** 435af2f7849Shappy-lx * Svinval extension Constants 436af2f7849Shappy-lx */ 437af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 43857a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 439af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 440af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 441ecdd9295SXuan Hu * Since software cannot promiss all sinval.vma between sfence.w.inval and sfence.inval.ir, we make sinval.vma wait 442ecdd9295SXuan Hu * forward. 443af2f7849Shappy-lx */ 444ecdd9295SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T), 445af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 446af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 447af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 448af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 449af2f7849Shappy-lx */ 45057a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 451af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 452af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 453af2f7849Shappy-lx * then dispatch and issue this instrucion 454af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 455af2f7849Shappy-lx */ 45657a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 457af2f7849Shappy-lx /* what is Svinval extension ? 458af2f7849Shappy-lx * -----> sfecne.w.inval 459af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 460af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 461af2f7849Shappy-lx * -----> sfecne.inval.ir 462af2f7849Shappy-lx * 463af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 464af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 465af2f7849Shappy-lx */ 466af2f7849Shappy-lx ) 467af2f7849Shappy-lx} 46857a10886SXuan Hu 469af2f7849Shappy-lx/* 470ca18a0b4SWilliam Wang * CBO decode 471ca18a0b4SWilliam Wang */ 472ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 47357a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 47457a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 47557a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 47657a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 47757a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 478ca18a0b4SWilliam Wang ) 479ca18a0b4SWilliam Wang} 480ca18a0b4SWilliam Wang 481d0de7e4aSpeixiaokun/* 482d0de7e4aSpeixiaokun * Hypervisor decode 483d0de7e4aSpeixiaokun */ 484d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants { 485e25e4d90SXuan Hu override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 486e25e4d90SXuan Hu HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 487e25e4d90SXuan Hu HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 488ecdd9295SXuan Hu 489ecdd9295SXuan Hu /** 490ecdd9295SXuan Hu * Since software cannot promiss all sinval.vma between sfence.w.inval and sfence.inval.ir, we make sinval.vma wait 491ecdd9295SXuan Hu * forward. 492ecdd9295SXuan Hu */ 493ecdd9295SXuan Hu HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T), 494ecdd9295SXuan Hu HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T), 495e25e4d90SXuan Hu HLV_B -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvb, SelImm.X, xWen = T), 496e25e4d90SXuan Hu HLV_BU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvbu, SelImm.X, xWen = T), 497e25e4d90SXuan Hu HLV_D -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvd, SelImm.X, xWen = T), 498e25e4d90SXuan Hu HLV_H -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvh, SelImm.X, xWen = T), 499e25e4d90SXuan Hu HLV_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvhu, SelImm.X, xWen = T), 500e25e4d90SXuan Hu HLV_W -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvw, SelImm.X, xWen = T), 501e25e4d90SXuan Hu HLV_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvwu, SelImm.X, xWen = T), 502e25e4d90SXuan Hu HLVX_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxhu, SelImm.X, xWen = T), 503e25e4d90SXuan Hu HLVX_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxwu, SelImm.X, xWen = T), 504e25e4d90SXuan Hu HSV_B -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvb, SelImm.X), 505e25e4d90SXuan Hu HSV_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvd, SelImm.X), 506e25e4d90SXuan Hu HSV_H -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvh, SelImm.X), 507e25e4d90SXuan Hu HSV_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvw, SelImm.X), 508d0de7e4aSpeixiaokun ) 509d0de7e4aSpeixiaokun} 510d0de7e4aSpeixiaokun 511545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants { 512545d7be0SYangyu Chen override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 513545d7be0SYangyu Chen CZERO_EQZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T), 514545d7be0SYangyu Chen CZERO_NEZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T), 515545d7be0SYangyu Chen ) 516545d7be0SYangyu Chen} 517545d7be0SYangyu Chen 518ca18a0b4SWilliam Wang/** 519499d2763SZiyue Zhang * "Zimop" Extension for May-Be-Operations 520499d2763SZiyue Zhang */ 521499d2763SZiyue Zhangobject ZimopDecode extends DecodeConstants { 522499d2763SZiyue Zhang override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 523499d2763SZiyue Zhang // temp use addi to decode MOP_R and MOP_RR 524499d2763SZiyue Zhang MOP_R -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T), 525499d2763SZiyue Zhang MOP_RR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, canRobCompress = T), 526499d2763SZiyue Zhang ) 527499d2763SZiyue Zhang} 528499d2763SZiyue Zhang 52920b2b626SsinceforYyobject ZfaDecode extends DecodeConstants { 53020b2b626SsinceforYy override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 53120b2b626SsinceforYy FLI_H -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T), 53220b2b626SsinceforYy FLI_S -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T), 53320b2b626SsinceforYy FLI_D -> FDecode(SrcType.no, SrcType.X, SrcType.X, FuType.f2v, FuOpType.X, fWen = T, canRobCompress = T), 53420b2b626SsinceforYy FMINM_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T), 53520b2b626SsinceforYy FMINM_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T), 53620b2b626SsinceforYy FMINM_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fminm, fWen = T, canRobCompress = T), 53720b2b626SsinceforYy FMAXM_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T), 53820b2b626SsinceforYy FMAXM_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T), 53920b2b626SsinceforYy FMAXM_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fmaxm, fWen = T, canRobCompress = T), 54020b2b626SsinceforYy FROUND_H -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fround, fWen = T, canRobCompress = T), 54120b2b626SsinceforYy FROUND_S -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fround, fWen = T, canRobCompress = T), 54220b2b626SsinceforYy FROUND_D -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fround, fWen = T, canRobCompress = T), 54320b2b626SsinceforYy FROUNDNX_H -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T), 54420b2b626SsinceforYy FROUNDNX_S -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T), 54520b2b626SsinceforYy FROUNDNX_D -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.froundnx, fWen = T, canRobCompress = T), 54620b2b626SsinceforYy FCVTMOD_W_D -> FDecode(SrcType.fp, SrcType.X, SrcType.X, FuType.fcvt, VfcvtType.fcvtmod_w_d, xWen = T, canRobCompress = T), 54720b2b626SsinceforYy FLEQ_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T), 54820b2b626SsinceforYy FLEQ_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T), 54920b2b626SsinceforYy FLEQ_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fleq, xWen = T, canRobCompress = T), 55020b2b626SsinceforYy FLTQ_H -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T), 55120b2b626SsinceforYy FLTQ_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T), 55220b2b626SsinceforYy FLTQ_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.falu, VfaluType.fltq, xWen = T, canRobCompress = T), 55320b2b626SsinceforYy ) 55420b2b626SsinceforYy} 55520b2b626SsinceforYy 556499d2763SZiyue Zhang/** 5574d24c305SYikeZhou * XiangShan Trap Decode constants 5584d24c305SYikeZhou */ 5594d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 560361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 56157a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 56257a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 5634d24c305SYikeZhou ) 5644d24c305SYikeZhou} 565be25371aSYikeZhou 56649f433deSXuan Huabstract class Imm(val len: Int) { 567b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 568b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 569b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 570b0ae3ac4SLinJiawei} 571b0ae3ac4SLinJiawei 572b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 573fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 574b0ae3ac4SLinJiawei 575b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 576b0ae3ac4SLinJiawei Cat(instr(31, 20)) 577b0ae3ac4SLinJiawei} 578b0ae3ac4SLinJiawei 579b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 580b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 581b0ae3ac4SLinJiawei 582b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 583b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 584b0ae3ac4SLinJiawei} 585b0ae3ac4SLinJiawei 586b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 587b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 588b0ae3ac4SLinJiawei 589b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 590b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 591b0ae3ac4SLinJiawei} 592b0ae3ac4SLinJiawei 593b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 594fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 595b0ae3ac4SLinJiawei 596b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 597b0ae3ac4SLinJiawei instr(31, 12) 598c2a8ae00SYikeZhou } 599c2a8ae00SYikeZhou} 600c2a8ae00SYikeZhou 601b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 602b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 603b0ae3ac4SLinJiawei 604b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 605b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 606b0ae3ac4SLinJiawei } 607b0ae3ac4SLinJiawei} 608b0ae3ac4SLinJiawei 609fa16cf81Slewislzhcase class Imm_Z() extends Imm(12 + 5 + 5){ 610b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 611b0ae3ac4SLinJiawei 612b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 613fa16cf81Slewislzh Cat(instr(11, 7), instr(19, 15), instr(31, 20)) 614b0ae3ac4SLinJiawei } 61592c61038SXuan Hu 61692c61038SXuan Hu def getCSRAddr(imm: UInt): UInt = { 61792c61038SXuan Hu require(imm.getWidth == this.len) 61892c61038SXuan Hu imm(11, 0) 61992c61038SXuan Hu } 62092c61038SXuan Hu 62192c61038SXuan Hu def getRS1(imm: UInt): UInt = { 62292c61038SXuan Hu require(imm.getWidth == this.len) 62392c61038SXuan Hu imm(16, 12) 62492c61038SXuan Hu } 62592c61038SXuan Hu 62692c61038SXuan Hu def getRD(imm: UInt): UInt = { 62792c61038SXuan Hu require(imm.getWidth == this.len) 62892c61038SXuan Hu imm(21, 17) 62992c61038SXuan Hu } 63092c61038SXuan Hu 63192c61038SXuan Hu def getImm5(imm: UInt): UInt = { 63292c61038SXuan Hu require(imm.getWidth == this.len) 63392c61038SXuan Hu imm(16, 12) 63492c61038SXuan Hu } 635b0ae3ac4SLinJiawei} 636b0ae3ac4SLinJiawei 637ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 638ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 639ee8ff153Szfw 640ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 641ee8ff153Szfw instr(25, 20) 642ee8ff153Szfw } 643ee8ff153Szfw} 644ee8ff153Szfw 64558c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 64658c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 64758c35d23Shuxuan0307 64858c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 64958c35d23Shuxuan0307 instr(19, 15) 65058c35d23Shuxuan0307 } 65158c35d23Shuxuan0307} 652b52d4755SXuan Hu 65358c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 65458c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 65558c35d23Shuxuan0307 65658c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 65758c35d23Shuxuan0307 instr(19, 15) 65858c35d23Shuxuan0307 } 65958c35d23Shuxuan0307} 660b52d4755SXuan Hu 6614aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 6624aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6634aa9ed34Sfdy 6644aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6654aa9ed34Sfdy instr(30, 20) 6664aa9ed34Sfdy } 667e6ac7fe1SZiyue Zhang /** 668e6ac7fe1SZiyue Zhang * get VType from extended imm 669e6ac7fe1SZiyue Zhang * @param extedImm 670e6ac7fe1SZiyue Zhang * @return VType 671e6ac7fe1SZiyue Zhang */ 672e6ac7fe1SZiyue Zhang def getVType(extedImm: UInt): InstVType = { 673e6ac7fe1SZiyue Zhang val vtype = Wire(new InstVType) 674e6ac7fe1SZiyue Zhang vtype := extedImm(10, 0).asTypeOf(new InstVType) 675e6ac7fe1SZiyue Zhang vtype 676e6ac7fe1SZiyue Zhang } 6774aa9ed34Sfdy} 678b52d4755SXuan Hu 679e6ac7fe1SZiyue Zhangcase class Imm_VSETIVLI() extends Imm(15){ 6804aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 6814aa9ed34Sfdy 6824aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 6835c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 684b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 685e6ac7fe1SZiyue Zhang val vtype8 = rvInst.ZIMM_VSETIVLI 686b52d4755SXuan Hu Cat(uimm5, vtype8) 687b52d4755SXuan Hu } 688b52d4755SXuan Hu /** 689b52d4755SXuan Hu * get VType from extended imm 690b52d4755SXuan Hu * @param extedImm 691b52d4755SXuan Hu * @return VType 692b52d4755SXuan Hu */ 693b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 694b52d4755SXuan Hu val vtype = Wire(new InstVType) 695e6ac7fe1SZiyue Zhang vtype := extedImm(9, 0).asTypeOf(new InstVType) 696b52d4755SXuan Hu vtype 697b52d4755SXuan Hu } 698b52d4755SXuan Hu 699b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 700e6ac7fe1SZiyue Zhang extedImm(14, 10) 7014aa9ed34Sfdy } 7024aa9ed34Sfdy} 703fe528fd6Ssinsanction 704fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){ 705fe528fd6Ssinsanction override def do_toImm32(minBits: UInt): UInt = minBits(31, 0) 706fe528fd6Ssinsanction 707fe528fd6Ssinsanction override def minBitsFromInstr(instr: UInt): UInt = { 708fe528fd6Ssinsanction instr(31, 0) 709fe528fd6Ssinsanction } 710fe528fd6Ssinsanction} 711fe528fd6Ssinsanction 7127e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){ 7137e30d16cSZhaoyang You override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 7147e30d16cSZhaoyang You 7157e30d16cSZhaoyang You override def minBitsFromInstr(instr: UInt): UInt = { 7167e30d16cSZhaoyang You Cat(instr(26), instr(19, 15)) 7177e30d16cSZhaoyang You } 7187e30d16cSZhaoyang You} 7197e30d16cSZhaoyang You 720b0ae3ac4SLinJiaweiobject ImmUnion { 721b0ae3ac4SLinJiawei val I = Imm_I() 722b0ae3ac4SLinJiawei val S = Imm_S() 723b0ae3ac4SLinJiawei val B = Imm_B() 724b0ae3ac4SLinJiawei val U = Imm_U() 725b0ae3ac4SLinJiawei val J = Imm_J() 726b0ae3ac4SLinJiawei val Z = Imm_Z() 727ee8ff153Szfw val B6 = Imm_B6() 72858c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 72958c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 7304aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 7314aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 732fe528fd6Ssinsanction val LUI32 = Imm_LUI32() 7337e30d16cSZhaoyang You val VRORVI = Imm_VRORVI() 7344aa9ed34Sfdy 735520f7dacSsinsanction // do not add special type lui32 to this, keep ImmUnion max len being 20. 7367e30d16cSZhaoyang You val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI) 737b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 738b0ae3ac4SLinJiawei val immSelMap = Seq( 739b0ae3ac4SLinJiawei SelImm.IMM_I, 740b0ae3ac4SLinJiawei SelImm.IMM_S, 741b0ae3ac4SLinJiawei SelImm.IMM_SB, 742b0ae3ac4SLinJiawei SelImm.IMM_U, 743b0ae3ac4SLinJiawei SelImm.IMM_UJ, 744ee8ff153Szfw SelImm.IMM_Z, 74558c35d23Shuxuan0307 SelImm.IMM_B6, 74658c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 7474aa9ed34Sfdy SelImm.IMM_OPIVIU, 7484aa9ed34Sfdy SelImm.IMM_VSETVLI, 749fe528fd6Ssinsanction SelImm.IMM_VSETIVLI, 7507e30d16cSZhaoyang You SelImm.IMM_VRORVI, 751b0ae3ac4SLinJiawei ).zip(imms) 752b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 753b0ae3ac4SLinJiawei} 754b0ae3ac4SLinJiawei 755fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 756fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 757fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 758765e58c6Ssinsanction Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm) 759fd7603d9SYinan Xu } 7603b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 761fd7603d9SYinan Xu val loadImmLen = Imm_I().len 7623b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 763f4dcd9fcSsinsanction Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0)) 764fd7603d9SYinan Xu } 765fd7603d9SYinan Xu} 766b0ae3ac4SLinJiawei 767be25371aSYikeZhou/** 768be25371aSYikeZhou * IO bundle for the Decode unit 769be25371aSYikeZhou */ 770*f7fe02a8Sjunxiong-ji 771*f7fe02a8Sjunxiong-jiclass DecodeUnitEnqIO(implicit p: Parameters) extends XSBundle { 772*f7fe02a8Sjunxiong-ji val ctrlFlow = Input(new StaticInst) 773*f7fe02a8Sjunxiong-ji val vtype = Input(new VType) 774*f7fe02a8Sjunxiong-ji val vstart = Input(Vl()) 775*f7fe02a8Sjunxiong-ji} 776*f7fe02a8Sjunxiong-ji 777aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle { 778aaa08c5aSxiaofeibao-xjtu val decodedInst = Output(new DecodedInst) 779aaa08c5aSxiaofeibao-xjtu val isComplex = Output(Bool()) 780aaa08c5aSxiaofeibao-xjtu val uopInfo = Output(new UopInfo) 781aaa08c5aSxiaofeibao-xjtu} 782*f7fe02a8Sjunxiong-ji 7832225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 784*f7fe02a8Sjunxiong-ji val enq = new DecodeUnitEnqIO 7853b739f49SXuan Hu // val vconfig = Input(UInt(XLEN.W)) 786aaa08c5aSxiaofeibao-xjtu val deq = new DecodeUnitDeqIO 787af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 78815ed99a7SXuan Hu val fromCSR = Input(new CSRToDecode) 789be25371aSYikeZhou} 790be25371aSYikeZhou 791be25371aSYikeZhou/** 792be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 793be25371aSYikeZhou */ 7942225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 795be25371aSYikeZhou val io = IO(new DecodeUnitIO) 796be25371aSYikeZhou 7973b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 798be25371aSYikeZhou 79975e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 80075e2c883SXuan Hu 80157a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 80257a10886SXuan Hu FpDecode.table ++ 803bdda74fdSxiaofeibao-xjtu// FDivSqrtDecode.table ++ 804768f5f91SYangyu Chen BitmanipDecode.table ++ 805768f5f91SYangyu Chen ScalarCryptoDecode.table ++ 806a19215ddSYinan Xu XSTrapDecode.table ++ 807a19215ddSYinan Xu CBODecode.table ++ 808b65b9ebaSXuan Hu SvinvalDecode.table ++ 809e25e4d90SXuan Hu HypervisorDecode.table ++ 810545d7be0SYangyu Chen VecDecoder.table ++ 811499d2763SZiyue Zhang ZicondDecode.table ++ 81220b2b626SsinceforYy ZimopDecode.table ++ 81320b2b626SsinceforYy ZfaDecode.table 814b65b9ebaSXuan Hu 81589cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 816a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 817239413e5SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue 818a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 819a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 820be25371aSYikeZhou 8214d24c305SYikeZhou // output 8223b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 823be25371aSYikeZhou 8242ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 8257ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 8263b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 827ec427417Slinzhida decodedInst.fpu.wflags := fpDecoder.io.fpCtrl.wflags || decodedInst.wfflags 8281a1319cbSLinJiawei 8293b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 8303b739f49SXuan Hu 831a8db15d8Sfdy decodedInst.uopIdx := 0.U 832d91483a6Sfdy decodedInst.firstUop := true.B 833d91483a6Sfdy decodedInst.lastUop := true.B 834f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 8353235a9d8SZiyue-Zhang decodedInst.numWB := 1.U 836deb6421eSHaojin Tang 837499d2763SZiyue Zhang val isZimop = (BitPat("b1?00??0111??_?????_100_?????_1110011") === ctrl_flow.instr) || 838499d2763SZiyue Zhang (BitPat("b1?00??1?????_?????_100_?????_1110011") === ctrl_flow.instr) 839499d2763SZiyue Zhang 84073c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 841499d2763SZiyue Zhang // temp decode zimop as move 842499d2763SZiyue Zhang decodedInst.isMove := (isMove || isZimop) && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep 84373c4359eSYikeZhou 84449a2cda2SXuan Hu // fmadd - b1000011 84549a2cda2SXuan Hu // fmsub - b1000111 84649a2cda2SXuan Hu // fnmsub- b1001011 84749a2cda2SXuan Hu // fnmadd- b1001111 84849a2cda2SXuan Hu private val isFMA = inst.OPCODE === BitPat("b100??11") 849e8b68a8eSgood-circle private val isVppu = FuType.isVppu(decodedInst.fuType) 850e8b68a8eSgood-circle private val isVecOPF = FuType.isVecOPF(decodedInst.fuType) 85149a2cda2SXuan Hu 852178dd38cSYikeZhou // read src1~3 location 85398cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 85498cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 85549a2cda2SXuan Hu // src(2) of fma is fs3, src(2) of vector inst is old vd 85649a2cda2SXuan Hu decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD) 8579c5a1080Sxiaofeibao decodedInst.lsrc(3) := V0_IDX.U 8589c5a1080Sxiaofeibao decodedInst.lsrc(4) := Vl_IDX.U 859b6b11f60SXuan Hu 860178dd38cSYikeZhou // read dest location 86198cfe81bSxgkiri decodedInst.ldest := inst.RD 8624d24c305SYikeZhou 863e4e68f86Sxiaofeibao // init v0Wen vlWen 864e4e68f86Sxiaofeibao decodedInst.v0Wen := false.B 865e4e68f86Sxiaofeibao decodedInst.vlWen := false.B 866e4e68f86Sxiaofeibao 867e9f7c490SXuan Hu private val isCboClean = CBO_CLEAN === io.enq.ctrlFlow.instr 868e9f7c490SXuan Hu private val isCboFlush = CBO_FLUSH === io.enq.ctrlFlow.instr 869e9f7c490SXuan Hu private val isCboInval = CBO_INVAL === io.enq.ctrlFlow.instr 870e9f7c490SXuan Hu private val isCboZero = CBO_ZERO === io.enq.ctrlFlow.instr 871e9f7c490SXuan Hu 8729c13e962Slin zhida // Note that rnum of aes64ks1i must be in the range 0x0..0xA. The values 0xB..0xF are reserved. 8739c13e962Slin zhida private val isAes64ks1iIllegal = 8749c13e962Slin zhida FuType.FuTypeOrR(decodedInst.fuType, FuType.bku) && (decodedInst.fuOpType === BKUOpType.aes64ks1i) && inst.isRnumIllegal 8759c13e962Slin zhida 87612861ac7Slinzhida private val isAmocasQ = FuType.FuTypeOrR(decodedInst.fuType, FuType.mou) && decodedInst.fuOpType === LSUOpType.amocas_q 87712861ac7Slinzhida private val isAmocasQIllegal = isAmocasQ && (inst.RD(0) === 1.U || inst.RS2(0) === 1.U) 87812861ac7Slinzhida 87915ed99a7SXuan Hu private val exceptionII = 88015ed99a7SXuan Hu decodedInst.selImm === SelImm.INVALID_INSTR || 88115ed99a7SXuan Hu io.fromCSR.illegalInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 88215ed99a7SXuan Hu io.fromCSR.illegalInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 88315ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceGVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_g || 88415ed99a7SXuan Hu io.fromCSR.illegalInst.hfenceVVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.hfence_v || 88515ed99a7SXuan Hu io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 8868b7dc6f5SsinceforYy io.fromCSR.illegalInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 88700cefdffSXuan Hu io.fromCSR.illegalInst.fsIsOff && ( 88800cefdffSXuan Hu FuType.FuTypeOrR(decodedInst.fuType, FuType.fpOP ++ Seq(FuType.f2v)) || 88913168c60Slinzhida (FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (decodedInst.fuOpType === LSUOpType.lh || decodedInst.fuOpType === LSUOpType.lw || decodedInst.fuOpType === LSUOpType.ld) || 89013168c60Slinzhida FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && (decodedInst.fuOpType === LSUOpType.sh || decodedInst.fuOpType === LSUOpType.sw || decodedInst.fuOpType === LSUOpType.sd)) && decodedInst.instr(2) || 89100cefdffSXuan Hu inst.isOPFVF || inst.isOPFVV 89200cefdffSXuan Hu ) || 893b50a88ecSXuan Hu io.fromCSR.illegalInst.vsIsOff && FuType.FuTypeOrR(decodedInst.fuType, FuType.vecAll) || 894689f6b88SsinceforYy io.fromCSR.illegalInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) || 895689f6b88SsinceforYy (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)) || 896e9f7c490SXuan Hu (decodedInst.needFrm.vectorNeedFrm || FuType.isVectorNeedFrm(decodedInst.fuType)) && io.fromCSR.illegalInst.frm || 897e9f7c490SXuan Hu io.fromCSR.illegalInst.cboZ && isCboZero || 898e9f7c490SXuan Hu io.fromCSR.illegalInst.cboCF && (isCboClean || isCboFlush) || 8999c13e962Slin zhida io.fromCSR.illegalInst.cboI && isCboInval || 90012861ac7Slinzhida isAes64ks1iIllegal || 90112861ac7Slinzhida isAmocasQIllegal 90215ed99a7SXuan Hu 90315ed99a7SXuan Hu private val exceptionVI = 90415ed99a7SXuan Hu io.fromCSR.virtualInst.sfenceVMA && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.sfence || 90515ed99a7SXuan Hu io.fromCSR.virtualInst.sfencePart && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && decodedInst.fuOpType === FenceOpType.nofence || 90615ed99a7SXuan Hu io.fromCSR.virtualInst.hfence && FuType.FuTypeOrR(decodedInst.fuType, FuType.fence) && (decodedInst.fuOpType === FenceOpType.hfence_g || decodedInst.fuOpType === FenceOpType.hfence_v) || 90715ed99a7SXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.ldu) && (LSUOpType.isHlv(decodedInst.fuOpType) || LSUOpType.isHlvx(decodedInst.fuOpType)) || 908b50a88ecSXuan Hu io.fromCSR.virtualInst.hlsv && FuType.FuTypeOrR(decodedInst.fuType, FuType.stu) && LSUOpType.isHsv(decodedInst.fuOpType) || 909e9f7c490SXuan Hu io.fromCSR.virtualInst.wfi && FuType.FuTypeOrR(decodedInst.fuType, FuType.csr) && CSROpType.isWfi(decodedInst.fuOpType) || 910e9f7c490SXuan Hu io.fromCSR.virtualInst.cboZ && isCboZero || 911e9f7c490SXuan Hu io.fromCSR.virtualInst.cboCF && (isCboClean || isCboFlush) || 912e9f7c490SXuan Hu io.fromCSR.virtualInst.cboI && isCboInval 913e9f7c490SXuan Hu 91415ed99a7SXuan Hu 9155a9dd560SXuan Hu decodedInst.exceptionVec(illegalInstr) := exceptionII || io.enq.ctrlFlow.exceptionVec(EX_II) 91615ed99a7SXuan Hu decodedInst.exceptionVec(virtualInstr) := exceptionVI 917d0de7e4aSpeixiaokun 9187e0f64b0SGuanghui Cheng //update exceptionVec: from frontend trigger's breakpoint exception. To reduce 1 bit of overhead in ibuffer entry. 9197e0f64b0SGuanghui Cheng decodedInst.exceptionVec(breakPoint) := TriggerAction.isExp(ctrl_flow.trigger) 9207e0f64b0SGuanghui Cheng 9213b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 922b0ae3ac4SLinJiawei x => { 9237ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 924b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 925b0ae3ac4SLinJiawei x._1 -> minBits 926b0ae3ac4SLinJiawei } 927b0ae3ac4SLinJiawei )) 928aac4464eSYinan Xu 9297531c765SXuan Hu private val isLs = FuType.isLoadStore(decodedInst.fuType) 93099f369f9Sxiaofeibao-xjtu private val isVls = inst.isVecStore || inst.isVecLoad 9317531c765SXuan Hu private val isStore = FuType.isStore(decodedInst.fuType) 9327531c765SXuan Hu private val isAMO = FuType.isAMO(decodedInst.fuType) 9337531c765SXuan Hu private val isVStore = FuType.isVStore(decodedInst.fuType) 9347531c765SXuan Hu private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType) 9357531c765SXuan Hu 9367531c765SXuan Hu decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch) 93775e2c883SXuan Hu 93875e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 939be25371aSYikeZhou 9400bca6cb3SZiyue Zhang private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S) 94139c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 94239c388b5SXuan Hu private val narrowInsts = Seq( 94339c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 94439c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 94539c388b5SXuan Hu ) 94639c388b5SXuan Hu private val maskDstInsts = Seq( 94739c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 94839c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 94939c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 9509eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 9519eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 9529eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 9539eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 954f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 95539c388b5SXuan Hu ) 95630fcc710SZiyue Zhang private val maskOpInsts = Seq( 95730fcc710SZiyue Zhang VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 95830fcc710SZiyue Zhang ) 95994e6af68SZiyue-Zhang private val vmaInsts = Seq( 96094e6af68SZiyue-Zhang VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX, 96194e6af68SZiyue-Zhang VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX, 96294e6af68SZiyue-Zhang ) 963bdda74fdSxiaofeibao-xjtu private val wfflagsInsts = Seq( 964bdda74fdSxiaofeibao-xjtu // opfff 965614d2bc6SHeiHuDie FADD_S, FSUB_S, FADD_D, FSUB_D, FADD_H, FSUB_H, 966614d2bc6SHeiHuDie FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, FEQ_H, FLT_H, FLE_H, 967614d2bc6SHeiHuDie FMIN_S, FMAX_S, FMIN_D, FMAX_D, FMIN_H, FMAX_H, 968614d2bc6SHeiHuDie FMUL_S, FMUL_D, FMUL_H, 969614d2bc6SHeiHuDie FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, FDIV_H, FSQRT_H, 970614d2bc6SHeiHuDie FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, FMADD_H, FMSUB_H, FNMADD_H, FNMSUB_H, 971614d2bc6SHeiHuDie FSGNJ_S, FSGNJN_S, FSGNJX_S, FSGNJ_H, FSGNJN_H, FSGNJX_H, 972bdda74fdSxiaofeibao-xjtu // opfvv 973bdda74fdSxiaofeibao-xjtu VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV, 974bdda74fdSxiaofeibao-xjtu VFMUL_VV, VFDIV_VV, VFWMUL_VV, 975bdda74fdSxiaofeibao-xjtu VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV, 976bdda74fdSxiaofeibao-xjtu VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV, 977bdda74fdSxiaofeibao-xjtu VFSQRT_V, 978bdda74fdSxiaofeibao-xjtu VFMIN_VV, VFMAX_VV, 979bdda74fdSxiaofeibao-xjtu VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV, 980bdda74fdSxiaofeibao-xjtu VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV, 981bdda74fdSxiaofeibao-xjtu // opfvf 982bdda74fdSxiaofeibao-xjtu VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF, 983bdda74fdSxiaofeibao-xjtu VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF, 984bdda74fdSxiaofeibao-xjtu VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF, 985bdda74fdSxiaofeibao-xjtu VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF, 986bdda74fdSxiaofeibao-xjtu VFMIN_VF, VFMAX_VF, 987bdda74fdSxiaofeibao-xjtu VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF, 988bdda74fdSxiaofeibao-xjtu VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF, 989aab8ef9cSxiaofeibao-xjtu // vfred 990aab8ef9cSxiaofeibao-xjtu VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS, 991bdda74fdSxiaofeibao-xjtu // fcvt & vfcvt 992bdda74fdSxiaofeibao-xjtu FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU, 993bdda74fdSxiaofeibao-xjtu FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 994bdda74fdSxiaofeibao-xjtu FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU, 995bdda74fdSxiaofeibao-xjtu FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 996b189aafaSzmx FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H, 997614d2bc6SHeiHuDie FCVT_H_W, FCVT_H_WU, FCVT_H_L, FCVT_H_LU, 998614d2bc6SHeiHuDie FCVT_W_H, FCVT_WU_H, FCVT_L_H, FCVT_LU_H, 999ba899681Schengguanghui 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, 1000ba899681Schengguanghui 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, 1001ba899681Schengguanghui 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, 1002ba899681Schengguanghui VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V, 100320b2b626SsinceforYy // zfa 100420b2b626SsinceforYy FLEQ_H, FLEQ_S, FLEQ_D, FLTQ_H, FLTQ_S, FLTQ_D, 100520b2b626SsinceforYy FMINM_H, FMINM_S, FMINM_D, FMAXM_H, FMAXM_S, FMAXM_D, 100620b2b626SsinceforYy FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D, 100720b2b626SsinceforYy FCVTMOD_W_D, 1008bdda74fdSxiaofeibao-xjtu ) 1009689f6b88SsinceforYy 1010689f6b88SsinceforYy private val scalaNeedFrmInsts = Seq( 1011614d2bc6SHeiHuDie FADD_S, FSUB_S, FADD_D, FSUB_D, FADD_H, FSUB_H, 1012689f6b88SsinceforYy FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 1013689f6b88SsinceforYy FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 1014614d2bc6SHeiHuDie FCVT_W_H, FCVT_WU_H, FCVT_L_H, FCVT_LU_H, 1015614d2bc6SHeiHuDie FCVT_S_H, FCVT_H_S, FCVT_H_D, FCVT_D_H, 101620b2b626SsinceforYy FROUND_H, FROUND_S, FROUND_D, FROUNDNX_H, FROUNDNX_S, FROUNDNX_D, 1017689f6b88SsinceforYy ) 1018689f6b88SsinceforYy 1019689f6b88SsinceforYy private val vectorNeedFrmInsts = Seq ( 1020689f6b88SsinceforYy VFSLIDE1UP_VF, VFSLIDE1DOWN_VF, 1021689f6b88SsinceforYy ) 1022689f6b88SsinceforYy 1023bdda74fdSxiaofeibao-xjtu decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _) 1024689f6b88SsinceforYy decodedInst.needFrm.scalaNeedFrm := scalaNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 1025689f6b88SsinceforYy decodedInst.needFrm.vectorNeedFrm := vectorNeedFrmInsts.map(_ === inst.ALL).reduce(_ || _) 10263b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 102775e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 102875e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 102975e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 103075e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 103175e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 103275e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 103375e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 1034d9355d3aSZiyue-Zhang decodedInst.vpu.veew := inst.WIDTH 103594e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 103639c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 1037b6279fc6SZiyue Zhang val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _) 1038b6279fc6SZiyue Zhang val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 1039b6279fc6SZiyue Zhang val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _) 104072090f4cSZiyue Zhang val isVload = FuType.isVLoad(decodedInst.fuType) 104172090f4cSZiyue Zhang val isVlx = isVload && (decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe) 104272090f4cSZiyue Zhang val isVle = isVload && (decodedInst.fuOpType === VlduType.vle || decodedInst.fuOpType === VlduType.vleff || decodedInst.fuOpType === VlduType.vlse) 104372090f4cSZiyue Zhang val isVlm = isVload && (decodedInst.fuOpType === VlduType.vlm) 104472090f4cSZiyue Zhang val isFof = isVload && (decodedInst.fuOpType === VlduType.vleff) 104581229133SZiyue Zhang val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV || decodedInst.uopSplitType === UopSplitType.VEC_VWW 104694e6af68SZiyue-Zhang val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _) 1047dab1ad8cSsinsanction val emulIsFrac = Cat(~decodedInst.vpu.vlmul(2), decodedInst.vpu.vlmul(1, 0)) +& decodedInst.vpu.veew < 4.U +& decodedInst.vpu.vsew 104872090f4cSZiyue Zhang val vstartIsNotZero = io.enq.vstart =/= 0.U 1049b6279fc6SZiyue Zhang decodedInst.vpu.isNarrow := isNarrow 1050b6279fc6SZiyue Zhang decodedInst.vpu.isDstMask := isDstMask 1051b6279fc6SZiyue Zhang decodedInst.vpu.isOpMask := isOpMask 105272090f4cSZiyue Zhang decodedInst.vpu.isDependOldVd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma || isFof || vstartIsNotZero 1053dab1ad8cSsinsanction decodedInst.vpu.isWritePartVd := isWritePartVd || isVlm || isVle && emulIsFrac 10545110577fSZiyue Zhang decodedInst.vpu.vstart := io.enq.vstart 105572090f4cSZiyue Zhang decodedInst.vpu.isVleff := isFof && inst.NF === 0.U 105606f0a37aSZiyue Zhang decodedInst.vpu.specVill := io.enq.vtype.illegal 105706f0a37aSZiyue Zhang decodedInst.vpu.specVma := io.enq.vtype.vma 105806f0a37aSZiyue Zhang decodedInst.vpu.specVta := io.enq.vtype.vta 105906f0a37aSZiyue Zhang decodedInst.vpu.specVsew := io.enq.vtype.vsew 106006f0a37aSZiyue Zhang decodedInst.vpu.specVlmul := io.enq.vtype.vlmul 106175e2c883SXuan Hu 106231c51290Szhanglinjuan decodedInst.vlsInstr := isVls 106331c51290Szhanglinjuan 10641d72fb53Sxiaofeibao decodedInst.srcType(3) := Mux(inst.VM === 0.U, SrcType.vp, SrcType.DC) // mask src 10651d72fb53Sxiaofeibao decodedInst.srcType(4) := SrcType.vp // vconfig 10666d56ac16Ssinsanction 10677f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 106899f369f9Sxiaofeibao-xjtu uopInfoGen.io.in.preInfo.isVecArith := inst.isVecArith 106999f369f9Sxiaofeibao-xjtu uopInfoGen.io.in.preInfo.isVecMem := inst.isVecStore || inst.isVecLoad 107099f369f9Sxiaofeibao-xjtu uopInfoGen.io.in.preInfo.isAmoCAS := inst.isAMOCAS 107199f369f9Sxiaofeibao-xjtu 107287dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 107387dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 107406cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 107587dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 10760a34fc22SZiyue Zhang uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0) 1077c4501a6fSZiyue-Zhang uopInfoGen.io.in.preInfo.nf := inst.NF 107806cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr 1079c90e3eacSZiyue Zhang uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm 10807f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 10819fabe323SZiyue Zhang io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop 10823235a9d8SZiyue-Zhang io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB 10837f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 10847f9f0a79SzhanglyGit 1085a9becb0dSJunxiong Ji val isCsr = inst.OPCODE5Bit === OPCODE5Bit.SYSTEM && inst.FUNCT3(1, 0) =/= 0.U 1086a9becb0dSJunxiong Ji val isCsrr = isCsr && inst.FUNCT3 === BitPat("b?1?") && inst.RS1 === 0.U 1087a9becb0dSJunxiong Ji val isCsrw = isCsr && inst.FUNCT3 === BitPat("b?01") && inst.RD === 0.U 1088a9becb0dSJunxiong Ji dontTouch(isCsrr) 1089a9becb0dSJunxiong Ji dontTouch(isCsrw) 1090cc1eb70dSXuan Hu 109187c5d21dSZiyue Zhang // for csrr vl instruction, convert to vsetvl 1092a9becb0dSJunxiong Ji val isCsrrVlenb = isCsrr && inst.CSRIDX === CSRs.vlenb.U 1093a9becb0dSJunxiong Ji val isCsrrVl = isCsrr && inst.CSRIDX === CSRs.vl.U 1094cc1eb70dSXuan Hu 1095ac17908cSHuijin Li // decode for SoftPrefetch instructions (prefetch.w / prefetch.r / prefetch.i) 1096ac17908cSHuijin Li val isSoftPrefetch = inst.OPCODE === BitPat("b0010011") && inst.FUNCT3 === BitPat("b110") && inst.RD === 0.U 1097ac17908cSHuijin Li val isPreW = isSoftPrefetch && inst.RS2 === 3.U(5.W) 1098ac17908cSHuijin Li val isPreR = isSoftPrefetch && inst.RS2 === 1.U(5.W) 1099ac17908cSHuijin Li val isPreI = isSoftPrefetch && inst.RS2 === 0.U(5.W) 1100ac17908cSHuijin Li 110120b2b626SsinceforYy // for fli.s|fli.d instruction 110220b2b626SsinceforYy val isFLI = inst.FUNCT7 === BitPat("b11110??") && inst.RS2 === 1.U && inst.RM === 0.U && inst.OPCODE5Bit === OPCODE5Bit.OP_FP 110320b2b626SsinceforYy 110487c5d21dSZiyue Zhang when (isCsrrVl) { 110563cb3754SZiyue Zhang // convert to vsetvl instruction 110687c5d21dSZiyue Zhang decodedInst.srcType(0) := SrcType.no 110787c5d21dSZiyue Zhang decodedInst.srcType(1) := SrcType.no 110887c5d21dSZiyue Zhang decodedInst.srcType(2) := SrcType.no 110987c5d21dSZiyue Zhang decodedInst.srcType(3) := SrcType.no 111087c5d21dSZiyue Zhang decodedInst.srcType(4) := SrcType.vp 111187c5d21dSZiyue Zhang decodedInst.lsrc(4) := Vl_IDX.U 111263cb3754SZiyue Zhang decodedInst.waitForward := false.B 111387c5d21dSZiyue Zhang decodedInst.blockBackward := false.B 11148c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 111563cb3754SZiyue Zhang }.elsewhen (isCsrrVlenb) { 111663cb3754SZiyue Zhang // convert to addi instruction 1117828a8a48SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 1118828a8a48SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 111963cb3754SZiyue Zhang decodedInst.srcType(2) := SrcType.no 112063cb3754SZiyue Zhang decodedInst.srcType(3) := SrcType.no 112163cb3754SZiyue Zhang decodedInst.srcType(4) := SrcType.no 112263cb3754SZiyue Zhang decodedInst.selImm := SelImm.IMM_I 112363cb3754SZiyue Zhang decodedInst.waitForward := false.B 112463cb3754SZiyue Zhang decodedInst.blockBackward := false.B 112563cb3754SZiyue Zhang decodedInst.canRobCompress := true.B 11268c5acf73SsinceforYy decodedInst.exceptionVec(illegalInstr) := io.fromCSR.illegalInst.vsIsOff 1127ac17908cSHuijin Li }.elsewhen (isPreW || isPreR || isPreI) { 1128ac17908cSHuijin Li decodedInst.selImm := SelImm.IMM_S 1129ac17908cSHuijin Li decodedInst.fuType := FuType.ldu.U 1130ac17908cSHuijin Li decodedInst.canRobCompress := false.B 1131499d2763SZiyue Zhang }.elsewhen (isZimop) { 1132499d2763SZiyue Zhang // set srcType for zimop 1133499d2763SZiyue Zhang decodedInst.srcType(0) := SrcType.reg 1134499d2763SZiyue Zhang decodedInst.srcType(1) := SrcType.imm 1135499d2763SZiyue Zhang // use x0 as src1 1136499d2763SZiyue Zhang decodedInst.lsrc(0) := 0.U 113787c5d21dSZiyue Zhang } 113887c5d21dSZiyue Zhang 113975e2c883SXuan Hu io.deq.decodedInst := decodedInst 11409faa51afSxiaofeibao-xjtu io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen 1141985804e6SXuan Hu io.deq.decodedInst.fuType := Mux1H(Seq( 1142cc1eb70dSXuan Hu // keep condition 1143cc1eb70dSXuan Hu (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) && !isCsrrVl && !isCsrrVlenb) -> decodedInst.fuType, 114487c5d21dSZiyue Zhang (isCsrrVl) -> FuType.vsetfwf.U, 114563cb3754SZiyue Zhang (isCsrrVlenb) -> FuType.alu.U, 1146cc1eb70dSXuan Hu 1147cc1eb70dSXuan Hu // change vlsu to vseglsu when NF =/= 0.U 1148f94f6503SXuan 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, 1149f94f6503SXuan Hu // MOP === b00 && SUMOP === b01000: unit-stride whole register store 1150f94f6503SXuan Hu // MOP =/= b00 : strided and indexed store 1151f94f6503SXuan 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, 1152f94f6503SXuan Hu // MOP === b00 && LUMOP === b01000: unit-stride whole register load 1153f94f6503SXuan Hu // MOP =/= b00 : strided and indexed load 1154f94f6503SXuan 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, 1155985804e6SXuan Hu )) 1156499d2763SZiyue Zhang io.deq.decodedInst.imm := MuxCase(decodedInst.imm, Seq( 1157499d2763SZiyue Zhang isCsrrVlenb -> (VLEN / 8).U, 1158499d2763SZiyue Zhang isZimop -> 0.U, 1159499d2763SZiyue Zhang )) 1160cc1eb70dSXuan Hu 11614fe0a83eSXuan Hu io.deq.decodedInst.fuOpType := MuxCase(decodedInst.fuOpType, Seq( 1162cc1eb70dSXuan Hu isCsrrVl -> VSETOpType.csrrvl, 1163cc1eb70dSXuan Hu isCsrrVlenb -> ALUOpType.add, 116420b2b626SsinceforYy isFLI -> Cat(1.U, inst.FMT, inst.RS1), 1165e9f7c490SXuan Hu (isPreW || isPreR || isPreI) -> Mux1H(Seq( 1166e9f7c490SXuan Hu isPreW -> LSUOpType.prefetch_w, 1167e9f7c490SXuan Hu isPreR -> LSUOpType.prefetch_r, 1168e9f7c490SXuan Hu isPreI -> LSUOpType.prefetch_i, 1169e9f7c490SXuan Hu )), 1170e9f7c490SXuan Hu (isCboInval && io.fromCSR.special.cboI2F) -> LSUOpType.cbo_flush, 11714fe0a83eSXuan Hu )) 11724fe0a83eSXuan Hu 11732a4ac712SEaston Man // Don't compress in the same Rob entry when crossing Ftq entry boundary 11742a4ac712SEaston Man io.deq.decodedInst.canRobCompress := decodedInst.canRobCompress && !io.enq.ctrlFlow.isLastInFtqEntry 11752a4ac712SEaston Man 1176be25371aSYikeZhou //------------------------------------------------------------- 1177be25371aSYikeZhou // Debug Info 11783b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 11793b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 11803b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 11813b739f49SXuan 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", 11823b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 11833b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 11843b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 11853b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 11863b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 11873b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 11883b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 11893b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 1190be25371aSYikeZhou} 1191