1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 17be25371aSYikeZhoupackage xiangshan.backend.decode 18be25371aSYikeZhou 198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters 20be25371aSYikeZhouimport chisel3._ 21be25371aSYikeZhouimport chisel3.util._ 223b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._ 236ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat 243c02ee8fSwakafaimport utility._ 253b739f49SXuan Huimport utils._ 26d0de7e4aSpeixiaokunimport xiangshan.ExceptionNO.{illegalInstr, virtualInstr} 276ab6918fSYinan Xuimport xiangshan._ 28730cfbc0SXuan Huimport xiangshan.backend.fu.FuType 29730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst} 305c1681d0SXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, XSInstBitFields} 31395c8649SZiyue-Zhangimport xiangshan.backend.fu.vector.Bundles.VType 32be25371aSYikeZhou 33be25371aSYikeZhou/** 34be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/ 35be25371aSYikeZhou */ 36be25371aSYikeZhouabstract trait DecodeConstants { 37361e6d51SJiuyang Liu // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt. 3857a10886SXuan Hu def X = BitPat("b0") 394d24c305SYikeZhou def N = BitPat("b0") 404d24c305SYikeZhou def Y = BitPat("b1") 4157a10886SXuan Hu def T = true 4257a10886SXuan Hu def F = false 434d24c305SYikeZhou 44c2a8ae00SYikeZhou def decodeDefault: List[BitPat] = // illegal instruction 4520e31bd1SYinan Xu // srcType(0) srcType(1) srcType(2) fuType fuOpType rfWen 464d24c305SYikeZhou // | | | | | | fpWen 4757a10886SXuan Hu // | | | | | | | vecWen 4857a10886SXuan Hu // | | | | | | | | isXSTrap 4957a10886SXuan Hu // | | | | | | | | | noSpecExec 5057a10886SXuan Hu // | | | | | | | | | | blockBackward 5157a10886SXuan Hu // | | | | | | | | | | | flushPipe 5289cc69c1STang Haojin // | | | | | | | | | | | | canRobCompress 5389cc69c1STang Haojin // | | | | | | | | | | | | | uopSplitType 5489cc69c1STang Haojin // | | | | | | | | | | | | | | selImm 5589cc69c1STang 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 564d24c305SYikeZhou 5757a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] 5857a10886SXuan Hu final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate())) 59be25371aSYikeZhou} 60be25371aSYikeZhou 61c2a8ae00SYikeZhoutrait DecodeUnitConstants 624d24c305SYikeZhou{ 634d24c305SYikeZhou // abstract out instruction decode magic numbers 644d24c305SYikeZhou val RD_MSB = 11 654d24c305SYikeZhou val RD_LSB = 7 664d24c305SYikeZhou val RS1_MSB = 19 674d24c305SYikeZhou val RS1_LSB = 15 684d24c305SYikeZhou val RS2_MSB = 24 694d24c305SYikeZhou val RS2_LSB = 20 704d24c305SYikeZhou val RS3_MSB = 31 714d24c305SYikeZhou val RS3_LSB = 27 724d24c305SYikeZhou} 734d24c305SYikeZhou 74be25371aSYikeZhou/** 75be25371aSYikeZhou * Decoded control signals 764d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala 77be25371aSYikeZhou */ 78c2a8ae00SYikeZhou 7957a10886SXuan Huabstract class XSDecodeBase { 8057a10886SXuan Hu def X = BitPat("b?") 8157a10886SXuan Hu def N = BitPat("b0") 8257a10886SXuan Hu def Y = BitPat("b1") 8357a10886SXuan Hu def T = true 8457a10886SXuan Hu def F = false 8557a10886SXuan Hu def generate() : List[BitPat] 8657a10886SXuan Hu} 8757a10886SXuan Hu 8857a10886SXuan Hucase class XSDecode( 8957a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 90239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat, 91e2695e90SzhanglyGit uopSplitType: BitPat = UopSplitType.X, 9257a10886SXuan Hu xWen: Boolean = false, 9357a10886SXuan Hu fWen: Boolean = false, 9457a10886SXuan Hu vWen: Boolean = false, 9557a10886SXuan Hu mWen: Boolean = false, 9657a10886SXuan Hu xsTrap: Boolean = false, 9757a10886SXuan Hu noSpec: Boolean = false, 9857a10886SXuan Hu blockBack: Boolean = false, 9957a10886SXuan Hu flushPipe: Boolean = false, 10089cc69c1STang Haojin canRobCompress: Boolean = false, 10157a10886SXuan Hu) extends XSDecodeBase { 10257a10886SXuan Hu def generate() : List[BitPat] = { 10389cc69c1STang 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) 10457a10886SXuan Hu } 10557a10886SXuan Hu} 10657a10886SXuan Hu 10757a10886SXuan Hucase class FDecode( 10857a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 109239413e5SXuan Hu fu: FuType.OHType, fuOp: BitPat, selImm: BitPat = SelImm.X, 11017ec87f2SXuan Hu uopSplitType: BitPat = UopSplitType.X, 11157a10886SXuan Hu xWen: Boolean = false, 11257a10886SXuan Hu fWen: Boolean = false, 11357a10886SXuan Hu vWen: Boolean = false, 11457a10886SXuan Hu mWen: Boolean = false, 11557a10886SXuan Hu xsTrap: Boolean = false, 11657a10886SXuan Hu noSpec: Boolean = false, 11757a10886SXuan Hu blockBack: Boolean = false, 11857a10886SXuan Hu flushPipe: Boolean = false, 11989cc69c1STang Haojin canRobCompress: Boolean = false, 12057a10886SXuan Hu) extends XSDecodeBase { 12157a10886SXuan Hu def generate() : List[BitPat] = { 12289cc69c1STang Haojin XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate() 12357a10886SXuan Hu } 12457a10886SXuan Hu} 12557a10886SXuan Hu 126be25371aSYikeZhou/** 127be25371aSYikeZhou * Overall Decode constants 128be25371aSYikeZhou */ 129be25371aSYikeZhouobject XDecode extends DecodeConstants { 13057a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 131*768f5f91SYangyu Chen // RV32I 13257a10886SXuan Hu LW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw , SelImm.IMM_I, xWen = T), 13357a10886SXuan Hu LH -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh , SelImm.IMM_I, xWen = T), 13457a10886SXuan Hu LHU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T), 13557a10886SXuan Hu LB -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb , SelImm.IMM_I, xWen = T), 13657a10886SXuan Hu LBU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T), 13757a10886SXuan Hu SW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw , SelImm.IMM_S ), 13857a10886SXuan Hu SH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh , SelImm.IMM_S ), 13957a10886SXuan Hu SB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb , SelImm.IMM_S ), 14089cc69c1STang Haojin LUI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T), 14189cc69c1STang Haojin ADDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T), 14289cc69c1STang Haojin ANDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T), 14389cc69c1STang Haojin ORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or , SelImm.IMM_I, xWen = T, canRobCompress = T), 14489cc69c1STang Haojin XORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T), 14589cc69c1STang Haojin SLTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T), 14689cc69c1STang Haojin SLTIU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T), 14789cc69c1STang Haojin SLL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X , xWen = T, canRobCompress = T), 14889cc69c1STang Haojin ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X , xWen = T, canRobCompress = T), 14989cc69c1STang Haojin SUB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X , xWen = T, canRobCompress = T), 15089cc69c1STang Haojin SLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X , xWen = T, canRobCompress = T), 15189cc69c1STang Haojin SLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X , xWen = T, canRobCompress = T), 15289cc69c1STang Haojin AND -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X , xWen = T, canRobCompress = T), 15389cc69c1STang Haojin OR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or , SelImm.X , xWen = T, canRobCompress = T), 15489cc69c1STang Haojin XOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X , xWen = T, canRobCompress = T), 15589cc69c1STang Haojin SRA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X , xWen = T, canRobCompress = T), 15689cc69c1STang Haojin SRL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X , xWen = T, canRobCompress = T), 1574d24c305SYikeZhou 158*768f5f91SYangyu Chen // RV64I (extend from RV32I) 159*768f5f91SYangyu Chen LD -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld , SelImm.IMM_I, xWen = T), 160*768f5f91SYangyu Chen LWU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T), 161*768f5f91SYangyu Chen SD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd , SelImm.IMM_S ), 162*768f5f91SYangyu Chen 163*768f5f91SYangyu Chen SLLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T), 164*768f5f91SYangyu Chen SRLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T), 165*768f5f91SYangyu Chen SRAI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T), 166*768f5f91SYangyu Chen 167*768f5f91SYangyu Chen ADDIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T), 168*768f5f91SYangyu Chen SLLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T), 169*768f5f91SYangyu Chen SRAIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T), 170*768f5f91SYangyu Chen SRLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T), 171*768f5f91SYangyu Chen 172*768f5f91SYangyu Chen ADDW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X , xWen = T, canRobCompress = T), 173*768f5f91SYangyu Chen SUBW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X , xWen = T, canRobCompress = T), 174*768f5f91SYangyu Chen SLLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X , xWen = T, canRobCompress = T), 175*768f5f91SYangyu Chen SRAW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X , xWen = T, canRobCompress = T), 176*768f5f91SYangyu Chen SRLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X , xWen = T, canRobCompress = T), 177*768f5f91SYangyu Chen 178*768f5f91SYangyu Chen // RV64M 17989cc69c1STang Haojin MUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul , SelImm.X, xWen = T, canRobCompress = T), 18089cc69c1STang Haojin MULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh , SelImm.X, xWen = T, canRobCompress = T), 18189cc69c1STang Haojin MULHU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T), 18289cc69c1STang Haojin MULHSU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T), 18389cc69c1STang Haojin MULW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw , SelImm.X, xWen = T, canRobCompress = T), 1844d24c305SYikeZhou 18589cc69c1STang Haojin DIV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div , SelImm.X, xWen = T, canRobCompress = T), 18689cc69c1STang Haojin DIVU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu , SelImm.X, xWen = T, canRobCompress = T), 18789cc69c1STang Haojin REM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem , SelImm.X, xWen = T, canRobCompress = T), 18889cc69c1STang Haojin REMU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu , SelImm.X, xWen = T, canRobCompress = T), 18989cc69c1STang Haojin DIVW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw , SelImm.X, xWen = T, canRobCompress = T), 19089cc69c1STang Haojin DIVUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T), 19189cc69c1STang Haojin REMW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw , SelImm.X, xWen = T, canRobCompress = T), 19289cc69c1STang Haojin REMUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T), 1934d24c305SYikeZhou 194f7af4c74Schengguanghui AUIPC -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T), 19557a10886SXuan Hu JAL -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal , SelImm.IMM_UJ, xWen = T), 196e2695e90SzhanglyGit JALR -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , uopSplitType = UopSplitType.SCA_SIM, xWen = T), 1973b739f49SXuan Hu BEQ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq , SelImm.IMM_SB ), 1983b739f49SXuan Hu BNE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne , SelImm.IMM_SB ), 1993b739f49SXuan Hu BGE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge , SelImm.IMM_SB ), 2003b739f49SXuan Hu BGEU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu , SelImm.IMM_SB ), 2013b739f49SXuan Hu BLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt , SelImm.IMM_SB ), 2023b739f49SXuan Hu BLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu , SelImm.IMM_SB ), 2034d24c305SYikeZhou 204*768f5f91SYangyu Chen // System, the immediate12 holds the CSR register. 20557a10886SXuan Hu CSRRW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 20657a10886SXuan Hu CSRRS -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 20757a10886SXuan Hu CSRRC -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 2084d24c305SYikeZhou 20957a10886SXuan Hu CSRRWI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21057a10886SXuan Hu CSRRSI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21157a10886SXuan Hu CSRRCI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2124d24c305SYikeZhou 21357a10886SXuan Hu EBREAK -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21457a10886SXuan Hu ECALL -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21557a10886SXuan Hu SRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21657a10886SXuan Hu MRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21757a10886SXuan Hu DRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21857a10886SXuan Hu WFI -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X , xWen = T, noSpec = T, blockBack = T), 2194d24c305SYikeZhou 22057a10886SXuan Hu SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22157a10886SXuan Hu FENCE_I -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22257a10886SXuan Hu FENCE -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 2234d24c305SYikeZhou 224*768f5f91SYangyu Chen // RV64A 22557a10886SXuan Hu AMOADD_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 22657a10886SXuan Hu AMOXOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 22757a10886SXuan Hu AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 22857a10886SXuan Hu AMOAND_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 22957a10886SXuan Hu AMOOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23057a10886SXuan Hu AMOMIN_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23157a10886SXuan Hu AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23257a10886SXuan Hu AMOMAX_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23357a10886SXuan Hu AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2344d24c305SYikeZhou 23557a10886SXuan Hu AMOADD_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23657a10886SXuan Hu AMOXOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23757a10886SXuan Hu AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23857a10886SXuan Hu AMOAND_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23957a10886SXuan Hu AMOOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24057a10886SXuan Hu AMOMIN_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24157a10886SXuan Hu AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24257a10886SXuan Hu AMOMAX_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24357a10886SXuan Hu AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2444d24c305SYikeZhou 24557a10886SXuan Hu LR_W -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24657a10886SXuan Hu LR_D -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24757a10886SXuan Hu SC_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24857a10886SXuan Hu SC_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 249*768f5f91SYangyu Chen ) 250*768f5f91SYangyu Chen} 251ee8ff153Szfw 252*768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{ 253*768f5f91SYangyu Chen /* 254*768f5f91SYangyu Chen Note: Some Bitmanip instruction may have different OP code between rv32 and rv64. 255*768f5f91SYangyu Chen Including pseudo instruction like zext.h, and different funct12 like rev8. 256*768f5f91SYangyu Chen If some day we need to support change XLEN via CSR, we should care about this. 257*768f5f91SYangyu Chen */ 258*768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 259*768f5f91SYangyu Chen // Zba 260*768f5f91SYangyu Chen ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T, canRobCompress = T), 261*768f5f91SYangyu Chen SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T, canRobCompress = T), 262*768f5f91SYangyu Chen SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T, canRobCompress = T), 263*768f5f91SYangyu Chen SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T, canRobCompress = T), 264*768f5f91SYangyu Chen SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T, canRobCompress = T), 265*768f5f91SYangyu Chen SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T, canRobCompress = T), 266*768f5f91SYangyu Chen SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T, canRobCompress = T), 267*768f5f91SYangyu Chen SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T, canRobCompress = T), 268*768f5f91SYangyu Chen 269*768f5f91SYangyu Chen // Zbb 27089cc69c1STang Haojin ANDN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn , SelImm.X , xWen = T, canRobCompress = T), 27189cc69c1STang Haojin ORN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X , xWen = T, canRobCompress = T), 27289cc69c1STang Haojin XNOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor , SelImm.X , xWen = T, canRobCompress = T), 273ee8ff153Szfw 274*768f5f91SYangyu Chen CLZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz , SelImm.X , xWen = T, canRobCompress = T), 275*768f5f91SYangyu Chen CLZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw , SelImm.X , xWen = T, canRobCompress = T), 276*768f5f91SYangyu Chen CTZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz , SelImm.X , xWen = T, canRobCompress = T), 277*768f5f91SYangyu Chen CTZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw , SelImm.X , xWen = T, canRobCompress = T), 278*768f5f91SYangyu Chen 279*768f5f91SYangyu Chen CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop , SelImm.X , xWen = T, canRobCompress = T), 280*768f5f91SYangyu Chen CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw , SelImm.X , xWen = T, canRobCompress = T), 281*768f5f91SYangyu Chen 28289cc69c1STang Haojin MAX -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X , xWen = T, canRobCompress = T), 28389cc69c1STang Haojin MAXU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu , SelImm.X , xWen = T, canRobCompress = T), 284*768f5f91SYangyu Chen MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X , xWen = T, canRobCompress = T), 285*768f5f91SYangyu Chen MINU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu , SelImm.X , xWen = T, canRobCompress = T), 286ee8ff153Szfw 28789cc69c1STang Haojin SEXT_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sextb , SelImm.X , xWen = T, canRobCompress = T), 28889cc69c1STang Haojin SEXT_H -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sexth , SelImm.X , xWen = T, canRobCompress = T), 289*768f5f91SYangyu Chen // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0. 290*768f5f91SYangyu Chen // If we configured to have no Zbkb, we should add zext.h here. 291ee8ff153Szfw 292*768f5f91SYangyu Chen ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol , SelImm.X , xWen = T, canRobCompress = T), 293*768f5f91SYangyu Chen ROLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw , SelImm.X , xWen = T, canRobCompress = T), 29489cc69c1STang Haojin ROR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.X , xWen = T, canRobCompress = T), 29589cc69c1STang Haojin RORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror , SelImm.IMM_I, xWen = T, canRobCompress = T), 296*768f5f91SYangyu Chen RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.IMM_I, xWen = T, canRobCompress = T), 297*768f5f91SYangyu Chen RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.X , xWen = T, canRobCompress = T), 298ee8ff153Szfw 299*768f5f91SYangyu Chen ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb , SelImm.X , xWen = T, canRobCompress = T), 300*768f5f91SYangyu Chen 301*768f5f91SYangyu Chen REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X , xWen = T, canRobCompress = T), 302*768f5f91SYangyu Chen 303*768f5f91SYangyu Chen // Zbc 304*768f5f91SYangyu Chen CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul , SelImm.X , xWen = T, canRobCompress = T), 305*768f5f91SYangyu Chen CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh , SelImm.X , xWen = T, canRobCompress = T), 306*768f5f91SYangyu Chen CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr , SelImm.X , xWen = T, canRobCompress = T), 307*768f5f91SYangyu Chen 308*768f5f91SYangyu Chen // Zbs 309*768f5f91SYangyu Chen BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.X , xWen = T, canRobCompress = T), 310*768f5f91SYangyu Chen BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.IMM_I, xWen = T, canRobCompress = T), 311*768f5f91SYangyu Chen BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.X , xWen = T, canRobCompress = T), 312*768f5f91SYangyu Chen BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.IMM_I, xWen = T, canRobCompress = T), 313*768f5f91SYangyu Chen BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.X , xWen = T, canRobCompress = T), 314*768f5f91SYangyu Chen BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.IMM_I, xWen = T, canRobCompress = T), 315*768f5f91SYangyu Chen BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.X , xWen = T, canRobCompress = T), 316*768f5f91SYangyu Chen BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.IMM_I, xWen = T, canRobCompress = T), 317*768f5f91SYangyu Chen 318*768f5f91SYangyu Chen // Zbkb 319*768f5f91SYangyu Chen // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb 320*768f5f91SYangyu Chen PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X , xWen = T, canRobCompress = T), 321*768f5f91SYangyu Chen PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh , SelImm.X , xWen = T, canRobCompress = T), 322*768f5f91SYangyu Chen PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw , SelImm.X , xWen = T, canRobCompress = T), 323*768f5f91SYangyu Chen BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X , xWen = T, canRobCompress = T), 324*768f5f91SYangyu Chen // If configured to RV32, we should add zip and unzip. 325*768f5f91SYangyu Chen 326*768f5f91SYangyu Chen // Zbkc 327*768f5f91SYangyu Chen // clmul, clmulh is in Zbc 328*768f5f91SYangyu Chen 329*768f5f91SYangyu Chen // Zbkx 330*768f5f91SYangyu Chen XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn , SelImm.X , xWen = T, canRobCompress = T), 331*768f5f91SYangyu Chen XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb , SelImm.X , xWen = T, canRobCompress = T), 332*768f5f91SYangyu Chen ) 333*768f5f91SYangyu Chen} 334*768f5f91SYangyu Chen 335*768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants { 336*768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 337*768f5f91SYangyu Chen // Zknd: NIST Suite: AES Decryption 338*768f5f91SYangyu Chen AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds , SelImm.X , xWen = T, canRobCompress = T), 339*768f5f91SYangyu Chen AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm , SelImm.X , xWen = T, canRobCompress = T), 340*768f5f91SYangyu Chen AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im , SelImm.X , xWen = T, canRobCompress = T), 341*768f5f91SYangyu Chen AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T), 342*768f5f91SYangyu Chen AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2 , SelImm.X , xWen = T, canRobCompress = T), 343*768f5f91SYangyu Chen 344*768f5f91SYangyu Chen // Zkne: NIST Suite: AES Encryption 345*768f5f91SYangyu Chen // aes64ks1i, aes64ks2 is in Zknd 346*768f5f91SYangyu Chen AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es , SelImm.X , xWen = T, canRobCompress = T), 347*768f5f91SYangyu Chen AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm , SelImm.X , xWen = T, canRobCompress = T), 348*768f5f91SYangyu Chen 349*768f5f91SYangyu Chen // Zknh: NIST Suite: Hash Function Instructions 350*768f5f91SYangyu Chen SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T, canRobCompress = T), 351*768f5f91SYangyu Chen SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T, canRobCompress = T), 352*768f5f91SYangyu Chen SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T, canRobCompress = T), 353*768f5f91SYangyu Chen SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T, canRobCompress = T), 354*768f5f91SYangyu Chen SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T, canRobCompress = T), 355*768f5f91SYangyu Chen SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T, canRobCompress = T), 356*768f5f91SYangyu Chen SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T, canRobCompress = T), 357*768f5f91SYangyu Chen SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T, canRobCompress = T), 358*768f5f91SYangyu Chen 359*768f5f91SYangyu Chen // Zksed: ShangMi Suite: SM4 Block Cipher Instructions 360*768f5f91SYangyu Chen SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0 , SelImm.X , xWen = T, canRobCompress = T), 361*768f5f91SYangyu Chen SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1 , SelImm.X , xWen = T, canRobCompress = T), 362*768f5f91SYangyu Chen SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2 , SelImm.X , xWen = T, canRobCompress = T), 363*768f5f91SYangyu Chen SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3 , SelImm.X , xWen = T, canRobCompress = T), 364*768f5f91SYangyu Chen SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0 , SelImm.X , xWen = T, canRobCompress = T), 365*768f5f91SYangyu Chen SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1 , SelImm.X , xWen = T, canRobCompress = T), 366*768f5f91SYangyu Chen SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2 , SelImm.X , xWen = T, canRobCompress = T), 367*768f5f91SYangyu Chen SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3 , SelImm.X , xWen = T, canRobCompress = T), 368*768f5f91SYangyu Chen 369*768f5f91SYangyu Chen // Zksh: ShangMi Suite: SM3 Hash Function Instructions 370*768f5f91SYangyu Chen SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0 , SelImm.X , xWen = T, canRobCompress = T), 371*768f5f91SYangyu Chen SM3P1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p1 , SelImm.X , xWen = T, canRobCompress = T), 3724d24c305SYikeZhou ) 373be25371aSYikeZhou} 374be25371aSYikeZhou 375be25371aSYikeZhou/** 376be25371aSYikeZhou * FP Decode constants 377be25371aSYikeZhou */ 37857a10886SXuan Huobject FpDecode extends DecodeConstants{ 37957a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 38057a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 38157a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 38257a10886SXuan Hu FSW -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S ), 38357a10886SXuan Hu FSD -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S ), 3844d24c305SYikeZhou 38523ea5b5eSZiyue Zhang FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T), 38623ea5b5eSZiyue Zhang FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_W_X, fWen = T, canRobCompress = T), 387c2a8ae00SYikeZhou 3884d24c305SYikeZhou // Int to FP 38989cc69c1STang Haojin FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39089cc69c1STang Haojin FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39189cc69c1STang Haojin FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39289cc69c1STang Haojin FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 3934d24c305SYikeZhou 39489cc69c1STang Haojin FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39589cc69c1STang Haojin FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39689cc69c1STang Haojin FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 39789cc69c1STang Haojin FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 3984d24c305SYikeZhou 3994d24c305SYikeZhou ) 400be25371aSYikeZhou} 401be25371aSYikeZhou 402be25371aSYikeZhou/** 403be25371aSYikeZhou * FP Divide SquareRoot Constants 404be25371aSYikeZhou */ 405be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 40657a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 40789cc69c1STang Haojin FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 40889cc69c1STang Haojin FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 40989cc69c1STang Haojin FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 41089cc69c1STang Haojin FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 4114d24c305SYikeZhou ) 412be25371aSYikeZhou} 413be25371aSYikeZhou 4144d24c305SYikeZhou/** 415af2f7849Shappy-lx * Svinval extension Constants 416af2f7849Shappy-lx */ 417af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 41857a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 419af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 420af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 421af2f7849Shappy-lx */ 42257a10886SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X), 423af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 424af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 425af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 426af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 427af2f7849Shappy-lx */ 42857a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 429af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 430af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 431af2f7849Shappy-lx * then dispatch and issue this instrucion 432af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 433af2f7849Shappy-lx */ 43457a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 435af2f7849Shappy-lx /* what is Svinval extension ? 436af2f7849Shappy-lx * -----> sfecne.w.inval 437af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 438af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 439af2f7849Shappy-lx * -----> sfecne.inval.ir 440af2f7849Shappy-lx * 441af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 442af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 443af2f7849Shappy-lx */ 444af2f7849Shappy-lx ) 445af2f7849Shappy-lx} 44657a10886SXuan Hu 447af2f7849Shappy-lx/* 448ca18a0b4SWilliam Wang * CBO decode 449ca18a0b4SWilliam Wang */ 450ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 45157a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 45257a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 45357a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 45457a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 45557a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 456ca18a0b4SWilliam Wang ) 457ca18a0b4SWilliam Wang} 458ca18a0b4SWilliam Wang 459d0de7e4aSpeixiaokun/* 460d0de7e4aSpeixiaokun * Hypervisor decode 461d0de7e4aSpeixiaokun */ 462d0de7e4aSpeixiaokunobject HypervisorDecode extends DecodeConstants { 463e25e4d90SXuan Hu override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 464e25e4d90SXuan Hu HFENCE_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 465e25e4d90SXuan Hu HFENCE_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 466e25e4d90SXuan Hu HINVAL_GVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_g, SelImm.X), 467e25e4d90SXuan Hu HINVAL_VVMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.hfence_v, SelImm.X), 468e25e4d90SXuan Hu HLV_B -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvb, SelImm.X, xWen = T), 469e25e4d90SXuan Hu HLV_BU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvbu, SelImm.X, xWen = T), 470e25e4d90SXuan Hu HLV_D -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvd, SelImm.X, xWen = T), 471e25e4d90SXuan Hu HLV_H -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvh, SelImm.X, xWen = T), 472e25e4d90SXuan Hu HLV_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvhu, SelImm.X, xWen = T), 473e25e4d90SXuan Hu HLV_W -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvw, SelImm.X, xWen = T), 474e25e4d90SXuan Hu HLV_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvwu, SelImm.X, xWen = T), 475e25e4d90SXuan Hu HLVX_HU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxhu, SelImm.X, xWen = T), 476e25e4d90SXuan Hu HLVX_WU -> XSDecode(SrcType.reg, SrcType.X, SrcType.X, FuType.ldu, LSUOpType.hlvxwu, SelImm.X, xWen = T), 477e25e4d90SXuan Hu HSV_B -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvb, SelImm.X), 478e25e4d90SXuan Hu HSV_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvd, SelImm.X), 479e25e4d90SXuan Hu HSV_H -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvh, SelImm.X), 480e25e4d90SXuan Hu HSV_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.hsvw, SelImm.X), 481d0de7e4aSpeixiaokun ) 482d0de7e4aSpeixiaokun} 483d0de7e4aSpeixiaokun 484ca18a0b4SWilliam Wang/** 4854d24c305SYikeZhou * XiangShan Trap Decode constants 4864d24c305SYikeZhou */ 4874d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 488361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 48957a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 49057a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 4914d24c305SYikeZhou ) 4924d24c305SYikeZhou} 493be25371aSYikeZhou 49449f433deSXuan Huabstract class Imm(val len: Int) { 495b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 496b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 497b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 498b0ae3ac4SLinJiawei} 499b0ae3ac4SLinJiawei 500b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 501fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 502b0ae3ac4SLinJiawei 503b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 504b0ae3ac4SLinJiawei Cat(instr(31, 20)) 505b0ae3ac4SLinJiawei} 506b0ae3ac4SLinJiawei 507b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 508b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 509b0ae3ac4SLinJiawei 510b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 511b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 512b0ae3ac4SLinJiawei} 513b0ae3ac4SLinJiawei 514b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 515b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 516b0ae3ac4SLinJiawei 517b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 518b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 519b0ae3ac4SLinJiawei} 520b0ae3ac4SLinJiawei 521b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 522fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 523b0ae3ac4SLinJiawei 524b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 525b0ae3ac4SLinJiawei instr(31, 12) 526c2a8ae00SYikeZhou } 527c2a8ae00SYikeZhou} 528c2a8ae00SYikeZhou 529b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 530b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 531b0ae3ac4SLinJiawei 532b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 533b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 534b0ae3ac4SLinJiawei } 535b0ae3ac4SLinJiawei} 536b0ae3ac4SLinJiawei 537b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){ 538b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 539b0ae3ac4SLinJiawei 540b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 541b0ae3ac4SLinJiawei Cat(instr(19, 15), instr(31, 20)) 542b0ae3ac4SLinJiawei } 543b0ae3ac4SLinJiawei} 544b0ae3ac4SLinJiawei 545ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 546ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 547ee8ff153Szfw 548ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 549ee8ff153Szfw instr(25, 20) 550ee8ff153Szfw } 551ee8ff153Szfw} 552ee8ff153Szfw 55358c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 55458c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 55558c35d23Shuxuan0307 55658c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 55758c35d23Shuxuan0307 instr(19, 15) 55858c35d23Shuxuan0307 } 55958c35d23Shuxuan0307} 560b52d4755SXuan Hu 56158c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 56258c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 56358c35d23Shuxuan0307 56458c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 56558c35d23Shuxuan0307 instr(19, 15) 56658c35d23Shuxuan0307 } 56758c35d23Shuxuan0307} 568b52d4755SXuan Hu 5694aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 5704aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 5714aa9ed34Sfdy 5724aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 5734aa9ed34Sfdy instr(30, 20) 5744aa9ed34Sfdy } 5754aa9ed34Sfdy} 576b52d4755SXuan Hu 577b52d4755SXuan Hucase class Imm_VSETIVLI() extends Imm(13){ 5784aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 5794aa9ed34Sfdy 5804aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 5815c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 582b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 583b52d4755SXuan Hu val vtype8 = rvInst.ZIMM_VTYPE 584b52d4755SXuan Hu Cat(uimm5, vtype8) 585b52d4755SXuan Hu } 586b52d4755SXuan Hu /** 587b52d4755SXuan Hu * get VType from extended imm 588b52d4755SXuan Hu * @param extedImm 589b52d4755SXuan Hu * @return VType 590b52d4755SXuan Hu */ 591b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 592b52d4755SXuan Hu val vtype = Wire(new InstVType) 593b52d4755SXuan Hu vtype := extedImm(7, 0).asTypeOf(new InstVType) 594b52d4755SXuan Hu vtype 595b52d4755SXuan Hu } 596b52d4755SXuan Hu 597b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 598b52d4755SXuan Hu extedImm(12, 8) 5994aa9ed34Sfdy } 6004aa9ed34Sfdy} 601fe528fd6Ssinsanction 602fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){ 603fe528fd6Ssinsanction override def do_toImm32(minBits: UInt): UInt = minBits(31, 0) 604fe528fd6Ssinsanction 605fe528fd6Ssinsanction override def minBitsFromInstr(instr: UInt): UInt = { 606fe528fd6Ssinsanction instr(31, 0) 607fe528fd6Ssinsanction } 608fe528fd6Ssinsanction} 609fe528fd6Ssinsanction 6107e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){ 6117e30d16cSZhaoyang You override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 6127e30d16cSZhaoyang You 6137e30d16cSZhaoyang You override def minBitsFromInstr(instr: UInt): UInt = { 6147e30d16cSZhaoyang You Cat(instr(26), instr(19, 15)) 6157e30d16cSZhaoyang You } 6167e30d16cSZhaoyang You} 6177e30d16cSZhaoyang You 618b0ae3ac4SLinJiaweiobject ImmUnion { 619b0ae3ac4SLinJiawei val I = Imm_I() 620b0ae3ac4SLinJiawei val S = Imm_S() 621b0ae3ac4SLinJiawei val B = Imm_B() 622b0ae3ac4SLinJiawei val U = Imm_U() 623b0ae3ac4SLinJiawei val J = Imm_J() 624b0ae3ac4SLinJiawei val Z = Imm_Z() 625ee8ff153Szfw val B6 = Imm_B6() 62658c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 62758c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 6284aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 6294aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 630fe528fd6Ssinsanction val LUI32 = Imm_LUI32() 6317e30d16cSZhaoyang You val VRORVI = Imm_VRORVI() 6324aa9ed34Sfdy 633520f7dacSsinsanction // do not add special type lui32 to this, keep ImmUnion max len being 20. 6347e30d16cSZhaoyang You val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI) 635b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 636b0ae3ac4SLinJiawei val immSelMap = Seq( 637b0ae3ac4SLinJiawei SelImm.IMM_I, 638b0ae3ac4SLinJiawei SelImm.IMM_S, 639b0ae3ac4SLinJiawei SelImm.IMM_SB, 640b0ae3ac4SLinJiawei SelImm.IMM_U, 641b0ae3ac4SLinJiawei SelImm.IMM_UJ, 642ee8ff153Szfw SelImm.IMM_Z, 64358c35d23Shuxuan0307 SelImm.IMM_B6, 64458c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 6454aa9ed34Sfdy SelImm.IMM_OPIVIU, 6464aa9ed34Sfdy SelImm.IMM_VSETVLI, 647fe528fd6Ssinsanction SelImm.IMM_VSETIVLI, 6487e30d16cSZhaoyang You SelImm.IMM_VRORVI, 649b0ae3ac4SLinJiawei ).zip(imms) 650b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 651b0ae3ac4SLinJiawei} 652b0ae3ac4SLinJiawei 653fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 654fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 655fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 656765e58c6Ssinsanction Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm) 657fd7603d9SYinan Xu } 6583b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 659fd7603d9SYinan Xu val loadImmLen = Imm_I().len 6603b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 661f4dcd9fcSsinsanction Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0)) 662fd7603d9SYinan Xu } 663fd7603d9SYinan Xu} 664b0ae3ac4SLinJiawei 665be25371aSYikeZhou/** 666be25371aSYikeZhou * IO bundle for the Decode unit 667be25371aSYikeZhou */ 668aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle { 669aaa08c5aSxiaofeibao-xjtu val decodedInst = Output(new DecodedInst) 670aaa08c5aSxiaofeibao-xjtu val isComplex = Output(Bool()) 671aaa08c5aSxiaofeibao-xjtu val uopInfo = Output(new UopInfo) 672aaa08c5aSxiaofeibao-xjtu} 6732225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 6743b739f49SXuan Hu val enq = new Bundle { 6753b739f49SXuan Hu val ctrlFlow = Input(new StaticInst) 676d91483a6Sfdy val vtype = Input(new VType) 6774aa9ed34Sfdy } 6783b739f49SXuan Hu// val vconfig = Input(UInt(XLEN.W)) 679aaa08c5aSxiaofeibao-xjtu val deq = new DecodeUnitDeqIO 680af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 681be25371aSYikeZhou} 682be25371aSYikeZhou 683be25371aSYikeZhou/** 684be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 685be25371aSYikeZhou */ 6862225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 687be25371aSYikeZhou val io = IO(new DecodeUnitIO) 688be25371aSYikeZhou 6893b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 690be25371aSYikeZhou 69175e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 69275e2c883SXuan Hu 69357a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 69457a10886SXuan Hu FpDecode.table ++ 695bdda74fdSxiaofeibao-xjtu// FDivSqrtDecode.table ++ 696*768f5f91SYangyu Chen BitmanipDecode.table ++ 697*768f5f91SYangyu Chen ScalarCryptoDecode.table ++ 698a19215ddSYinan Xu XSTrapDecode.table ++ 699a19215ddSYinan Xu CBODecode.table ++ 700b65b9ebaSXuan Hu SvinvalDecode.table ++ 701e25e4d90SXuan Hu HypervisorDecode.table ++ 702b65b9ebaSXuan Hu VecDecoder.table 703b65b9ebaSXuan Hu 70489cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 705a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 706239413e5SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue 707a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 708a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 709be25371aSYikeZhou 7104d24c305SYikeZhou // output 7113b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 712be25371aSYikeZhou 7132ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 7147ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 7153b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 7161a1319cbSLinJiawei 7173b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 7183b739f49SXuan Hu 719a8db15d8Sfdy decodedInst.uopIdx := 0.U 720d91483a6Sfdy decodedInst.firstUop := true.B 721d91483a6Sfdy decodedInst.lastUop := true.B 722f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 7233235a9d8SZiyue-Zhang decodedInst.numWB := 1.U 724deb6421eSHaojin Tang 72573c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 726f7af4c74Schengguanghui decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep 72773c4359eSYikeZhou 72849a2cda2SXuan Hu // fmadd - b1000011 72949a2cda2SXuan Hu // fmsub - b1000111 73049a2cda2SXuan Hu // fnmsub- b1001011 73149a2cda2SXuan Hu // fnmadd- b1001111 73249a2cda2SXuan Hu private val isFMA = inst.OPCODE === BitPat("b100??11") 73349a2cda2SXuan Hu 734996aacc9SXuan Hu private val v0Idx = 0 735996aacc9SXuan Hu private val vconfigIdx = VCONFIG_IDX 736996aacc9SXuan Hu 737178dd38cSYikeZhou // read src1~3 location 73898cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 73998cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 74049a2cda2SXuan Hu // src(2) of fma is fs3, src(2) of vector inst is old vd 74149a2cda2SXuan Hu decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD) 742996aacc9SXuan Hu decodedInst.lsrc(3) := v0Idx.U 743996aacc9SXuan Hu decodedInst.lsrc(4) := vconfigIdx.U 744b6b11f60SXuan Hu 745178dd38cSYikeZhou // read dest location 74698cfe81bSxgkiri decodedInst.ldest := inst.RD 7474d24c305SYikeZhou 748c2a8ae00SYikeZhou // fill in exception vector 749567f0269Ssinsanction val vecException = Module(new VecExceptionGen) 750567f0269Ssinsanction vecException.io.inst := io.enq.ctrlFlow.instr 751567f0269Ssinsanction vecException.io.decodedInst := decodedInst 752bdda74fdSxiaofeibao-xjtu vecException.io.vtype := decodedInst.vpu.vtype 753567f0269Ssinsanction decodedInst.exceptionVec(illegalInstr) := decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst 7544d24c305SYikeZhou 755af2f7849Shappy-lx when (!io.csrCtrl.svinval_enable) { 756567f0269Ssinsanction val base_ii = decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst 757af2f7849Shappy-lx val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr 758af2f7849Shappy-lx val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr 759af2f7849Shappy-lx val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr 760d0de7e4aSpeixiaokun val hinval_gvma = HINVAL_GVMA === ctrl_flow.instr 761d0de7e4aSpeixiaokun val hinval_vvma = HINVAL_VVMA === ctrl_flow.instr 762d0de7e4aSpeixiaokun val svinval_ii = sinval || w_inval || inval_ir || hinval_gvma || hinval_vvma 7633b739f49SXuan Hu decodedInst.exceptionVec(illegalInstr) := base_ii || svinval_ii 7643b739f49SXuan Hu decodedInst.flushPipe := false.B 765af2f7849Shappy-lx } 766af2f7849Shappy-lx 767d0de7e4aSpeixiaokun when(io.csrCtrl.virtMode){ 768e25e4d90SXuan Hu // Todo: optimize EX_VI decode 769d0de7e4aSpeixiaokun // vs/vu attempting to exec hyperinst will raise virtual instruction 770e25e4d90SXuan Hu decodedInst.exceptionVec(virtualInstr) := ctrl_flow.instr === HLV_B || ctrl_flow.instr === HLV_BU || 771d0de7e4aSpeixiaokun ctrl_flow.instr === HLV_H || ctrl_flow.instr === HLV_HU || 772d0de7e4aSpeixiaokun ctrl_flow.instr === HLVX_HU || ctrl_flow.instr === HLV_W || 773d0de7e4aSpeixiaokun ctrl_flow.instr === HLVX_WU || ctrl_flow.instr === HLV_WU || 774d0de7e4aSpeixiaokun ctrl_flow.instr === HLV_D || ctrl_flow.instr === HSV_B || 775d0de7e4aSpeixiaokun ctrl_flow.instr === HSV_H || ctrl_flow.instr === HSV_W || 776d0de7e4aSpeixiaokun ctrl_flow.instr === HSV_D || ctrl_flow.instr === HFENCE_VVMA || 777d0de7e4aSpeixiaokun ctrl_flow.instr === HFENCE_GVMA || ctrl_flow.instr === HINVAL_GVMA || 778d0de7e4aSpeixiaokun ctrl_flow.instr === HINVAL_VVMA 779d0de7e4aSpeixiaokun } 780d0de7e4aSpeixiaokun 781c2a8ae00SYikeZhou // fix frflags 782c2a8ae00SYikeZhou // fflags zero csrrs rd csr 783c2a8ae00SYikeZhou val isFrflags = BitPat("b000000000001_00000_010_?????_1110011") === ctrl_flow.instr 7843b739f49SXuan Hu when (decodedInst.fuType === FuType.csr.U && isFrflags) { 7853b739f49SXuan Hu decodedInst.blockBackward := false.B 786c2a8ae00SYikeZhou } 787c2a8ae00SYikeZhou 7883b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 789b0ae3ac4SLinJiawei x => { 7907ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 791b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 792b0ae3ac4SLinJiawei x._1 -> minBits 793b0ae3ac4SLinJiawei } 794b0ae3ac4SLinJiawei )) 795aac4464eSYinan Xu 7967531c765SXuan Hu private val isLs = FuType.isLoadStore(decodedInst.fuType) 7977531c765SXuan Hu private val isVls = FuType.isVls(decodedInst.fuType) 7987531c765SXuan Hu private val isStore = FuType.isStore(decodedInst.fuType) 7997531c765SXuan Hu private val isAMO = FuType.isAMO(decodedInst.fuType) 8007531c765SXuan Hu private val isVStore = FuType.isVStore(decodedInst.fuType) 8017531c765SXuan Hu private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType) 8027531c765SXuan Hu 8037531c765SXuan Hu decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch) 80475e2c883SXuan Hu 80575e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 806be25371aSYikeZhou 8070bca6cb3SZiyue Zhang private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S) 80839c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 80939c388b5SXuan Hu private val narrowInsts = Seq( 81039c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 81139c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 81239c388b5SXuan Hu ) 81339c388b5SXuan Hu private val maskDstInsts = Seq( 81439c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 81539c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 81639c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 8179eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 8189eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 8199eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 8209eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 821f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 82239c388b5SXuan Hu ) 82330fcc710SZiyue Zhang private val maskOpInsts = Seq( 82430fcc710SZiyue Zhang VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 82530fcc710SZiyue Zhang ) 826bdda74fdSxiaofeibao-xjtu private val wfflagsInsts = Seq( 827bdda74fdSxiaofeibao-xjtu // opfff 828bdda74fdSxiaofeibao-xjtu FADD_S, FSUB_S, FADD_D, FSUB_D, 829bdda74fdSxiaofeibao-xjtu FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, 830bdda74fdSxiaofeibao-xjtu FMIN_S, FMAX_S, FMIN_D, FMAX_D, 831bdda74fdSxiaofeibao-xjtu FMUL_S, FMUL_D, 832bdda74fdSxiaofeibao-xjtu FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, 833bdda74fdSxiaofeibao-xjtu FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, 834bdda74fdSxiaofeibao-xjtu FSGNJ_S, FSGNJN_S, FSGNJX_S, 835bdda74fdSxiaofeibao-xjtu // opfvv 836bdda74fdSxiaofeibao-xjtu VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV, 837bdda74fdSxiaofeibao-xjtu VFMUL_VV, VFDIV_VV, VFWMUL_VV, 838bdda74fdSxiaofeibao-xjtu VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV, 839bdda74fdSxiaofeibao-xjtu VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV, 840bdda74fdSxiaofeibao-xjtu VFSQRT_V, 841bdda74fdSxiaofeibao-xjtu VFMIN_VV, VFMAX_VV, 842bdda74fdSxiaofeibao-xjtu VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV, 843bdda74fdSxiaofeibao-xjtu VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV, 844bdda74fdSxiaofeibao-xjtu // opfvf 845bdda74fdSxiaofeibao-xjtu VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF, 846bdda74fdSxiaofeibao-xjtu VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF, 847bdda74fdSxiaofeibao-xjtu VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF, 848bdda74fdSxiaofeibao-xjtu VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF, 849bdda74fdSxiaofeibao-xjtu VFMIN_VF, VFMAX_VF, 850bdda74fdSxiaofeibao-xjtu VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF, 851bdda74fdSxiaofeibao-xjtu VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF, 852bdda74fdSxiaofeibao-xjtu // fcvt & vfcvt 853bdda74fdSxiaofeibao-xjtu FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU, 854bdda74fdSxiaofeibao-xjtu FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 855bdda74fdSxiaofeibao-xjtu FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU, 856bdda74fdSxiaofeibao-xjtu FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 857ba899681Schengguanghui 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, 858ba899681Schengguanghui 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, 859ba899681Schengguanghui 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, 860ba899681Schengguanghui VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V, 861bdda74fdSxiaofeibao-xjtu ) 862bdda74fdSxiaofeibao-xjtu decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _) 863bdda74fdSxiaofeibao-xjtu val fpToVecDecoder = Module(new FPToVecDecoder()) 864bdda74fdSxiaofeibao-xjtu fpToVecDecoder.io.instr := inst.asUInt 865bdda74fdSxiaofeibao-xjtu val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst 8663b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 867bdda74fdSxiaofeibao-xjtu when(isFpToVecInst){ 868bdda74fdSxiaofeibao-xjtu decodedInst.vpu := fpToVecDecoder.io.vpuCtrl 869bdda74fdSxiaofeibao-xjtu }.otherwise{ 87075e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 87175e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 87275e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 87375e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 87475e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 87575e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 87675e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 877d9355d3aSZiyue-Zhang decodedInst.vpu.veew := inst.WIDTH 87894e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 87939c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 88039c388b5SXuan Hu decodedInst.vpu.isNarrow := narrowInsts.map(_ === inst.ALL).reduce(_ || _) 88139c388b5SXuan Hu decodedInst.vpu.isDstMask := maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 88230fcc710SZiyue Zhang decodedInst.vpu.isOpMask := maskOpInsts.map(_ === inst.ALL).reduce(_ || _) 883bdda74fdSxiaofeibao-xjtu } 88475e2c883SXuan Hu 88531c51290Szhanglinjuan decodedInst.vlsInstr := isVls 88631c51290Szhanglinjuan 8876d56ac16Ssinsanction decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src 8886d56ac16Ssinsanction decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig 8896d56ac16Ssinsanction 8907f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 89187dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 89287dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 89306cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 89487dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 8950a34fc22SZiyue Zhang uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0) 896c4501a6fSZiyue-Zhang uopInfoGen.io.in.preInfo.nf := inst.NF 89706cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr 898c90e3eacSZiyue Zhang uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm 8997f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 9007f9f0a79SzhanglyGit io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop 9013235a9d8SZiyue-Zhang io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB 9027f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 9037f9f0a79SzhanglyGit 90475e2c883SXuan Hu io.deq.decodedInst := decodedInst 9059faa51afSxiaofeibao-xjtu io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen 906be25371aSYikeZhou //------------------------------------------------------------- 907be25371aSYikeZhou // Debug Info 9083b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 9093b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 9103b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 9113b739f49SXuan 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", 9123b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 9133b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 9143b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 9153b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 9163b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 9173b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 9183b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 9193b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 920be25371aSYikeZhou} 921