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( 131768f5f91SYangyu 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 158768f5f91SYangyu Chen // RV64I (extend from RV32I) 159768f5f91SYangyu Chen LD -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld , SelImm.IMM_I, xWen = T), 160768f5f91SYangyu Chen LWU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T), 161768f5f91SYangyu Chen SD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd , SelImm.IMM_S ), 162768f5f91SYangyu Chen 163768f5f91SYangyu Chen SLLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T), 164768f5f91SYangyu Chen SRLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T), 165768f5f91SYangyu Chen SRAI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T), 166768f5f91SYangyu Chen 167768f5f91SYangyu Chen ADDIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T), 168768f5f91SYangyu Chen SLLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T), 169768f5f91SYangyu Chen SRAIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T), 170768f5f91SYangyu Chen SRLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T), 171768f5f91SYangyu Chen 172768f5f91SYangyu Chen ADDW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X , xWen = T, canRobCompress = T), 173768f5f91SYangyu Chen SUBW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X , xWen = T, canRobCompress = T), 174768f5f91SYangyu Chen SLLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X , xWen = T, canRobCompress = T), 175768f5f91SYangyu Chen SRAW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X , xWen = T, canRobCompress = T), 176768f5f91SYangyu Chen SRLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X , xWen = T, canRobCompress = T), 177768f5f91SYangyu Chen 178768f5f91SYangyu 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 204768f5f91SYangyu 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 224768f5f91SYangyu 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), 249768f5f91SYangyu Chen ) 250768f5f91SYangyu Chen} 251ee8ff153Szfw 252768f5f91SYangyu Chenobject BitmanipDecode extends DecodeConstants{ 253768f5f91SYangyu Chen /* 254768f5f91SYangyu Chen Note: Some Bitmanip instruction may have different OP code between rv32 and rv64. 255768f5f91SYangyu Chen Including pseudo instruction like zext.h, and different funct12 like rev8. 256768f5f91SYangyu Chen If some day we need to support change XLEN via CSR, we should care about this. 257768f5f91SYangyu Chen */ 258768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 259768f5f91SYangyu Chen // Zba 260768f5f91SYangyu Chen ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T, canRobCompress = T), 261768f5f91SYangyu Chen SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T, canRobCompress = T), 262768f5f91SYangyu Chen SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T, canRobCompress = T), 263768f5f91SYangyu Chen SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T, canRobCompress = T), 264768f5f91SYangyu Chen SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T, canRobCompress = T), 265768f5f91SYangyu Chen SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T, canRobCompress = T), 266768f5f91SYangyu Chen SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T, canRobCompress = T), 267768f5f91SYangyu Chen SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T, canRobCompress = T), 268768f5f91SYangyu Chen 269768f5f91SYangyu 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 274768f5f91SYangyu Chen CLZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clz , SelImm.X , xWen = T, canRobCompress = T), 275768f5f91SYangyu Chen CLZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.clzw , SelImm.X , xWen = T, canRobCompress = T), 276768f5f91SYangyu Chen CTZ -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctz , SelImm.X , xWen = T, canRobCompress = T), 277768f5f91SYangyu Chen CTZW -> XSDecode(SrcType.reg, SrcType.DC , SrcType.X, FuType.bku, BKUOpType.ctzw , SelImm.X , xWen = T, canRobCompress = T), 278768f5f91SYangyu Chen 279768f5f91SYangyu Chen CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop , SelImm.X , xWen = T, canRobCompress = T), 280768f5f91SYangyu Chen CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw , SelImm.X , xWen = T, canRobCompress = T), 281768f5f91SYangyu 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), 284768f5f91SYangyu Chen MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X , xWen = T, canRobCompress = T), 285768f5f91SYangyu 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), 289768f5f91SYangyu Chen // zext.h in rv64 is shared with packw in Zbkb with rs2 = $0. 290768f5f91SYangyu Chen // If we configured to have no Zbkb, we should add zext.h here. 291ee8ff153Szfw 292768f5f91SYangyu Chen ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol , SelImm.X , xWen = T, canRobCompress = T), 293768f5f91SYangyu 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), 296768f5f91SYangyu Chen RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.IMM_I, xWen = T, canRobCompress = T), 297768f5f91SYangyu Chen RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw , SelImm.X , xWen = T, canRobCompress = T), 298ee8ff153Szfw 299768f5f91SYangyu Chen ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb , SelImm.X , xWen = T, canRobCompress = T), 300768f5f91SYangyu Chen 301768f5f91SYangyu Chen REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X , xWen = T, canRobCompress = T), 302768f5f91SYangyu Chen 303768f5f91SYangyu Chen // Zbc 304768f5f91SYangyu Chen CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul , SelImm.X , xWen = T, canRobCompress = T), 305768f5f91SYangyu Chen CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh , SelImm.X , xWen = T, canRobCompress = T), 306768f5f91SYangyu Chen CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr , SelImm.X , xWen = T, canRobCompress = T), 307768f5f91SYangyu Chen 308768f5f91SYangyu Chen // Zbs 309768f5f91SYangyu Chen BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.X , xWen = T, canRobCompress = T), 310768f5f91SYangyu Chen BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr , SelImm.IMM_I, xWen = T, canRobCompress = T), 311768f5f91SYangyu Chen BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.X , xWen = T, canRobCompress = T), 312768f5f91SYangyu Chen BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext , SelImm.IMM_I, xWen = T, canRobCompress = T), 313768f5f91SYangyu Chen BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.X , xWen = T, canRobCompress = T), 314768f5f91SYangyu Chen BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv , SelImm.IMM_I, xWen = T, canRobCompress = T), 315768f5f91SYangyu Chen BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.X , xWen = T, canRobCompress = T), 316768f5f91SYangyu Chen BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset , SelImm.IMM_I, xWen = T, canRobCompress = T), 317768f5f91SYangyu Chen 318768f5f91SYangyu Chen // Zbkb 319768f5f91SYangyu Chen // rol, rolw, ror,rori, roriw, rorw, andn, orn, xnor, rev8 is in Zbb 320768f5f91SYangyu Chen PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X , xWen = T, canRobCompress = T), 321768f5f91SYangyu Chen PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh , SelImm.X , xWen = T, canRobCompress = T), 322768f5f91SYangyu Chen PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw , SelImm.X , xWen = T, canRobCompress = T), 323768f5f91SYangyu Chen BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X , xWen = T, canRobCompress = T), 324768f5f91SYangyu Chen // If configured to RV32, we should add zip and unzip. 325768f5f91SYangyu Chen 326768f5f91SYangyu Chen // Zbkc 327768f5f91SYangyu Chen // clmul, clmulh is in Zbc 328768f5f91SYangyu Chen 329768f5f91SYangyu Chen // Zbkx 330768f5f91SYangyu Chen XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn , SelImm.X , xWen = T, canRobCompress = T), 331768f5f91SYangyu Chen XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb , SelImm.X , xWen = T, canRobCompress = T), 332768f5f91SYangyu Chen ) 333768f5f91SYangyu Chen} 334768f5f91SYangyu Chen 335768f5f91SYangyu Chenobject ScalarCryptoDecode extends DecodeConstants { 336768f5f91SYangyu Chen val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 337768f5f91SYangyu Chen // Zknd: NIST Suite: AES Decryption 338768f5f91SYangyu Chen AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds , SelImm.X , xWen = T, canRobCompress = T), 339768f5f91SYangyu Chen AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm , SelImm.X , xWen = T, canRobCompress = T), 340768f5f91SYangyu Chen AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im , SelImm.X , xWen = T, canRobCompress = T), 341768f5f91SYangyu Chen AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i , SelImm.IMM_I, xWen = T, canRobCompress = T), 342768f5f91SYangyu Chen AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2 , SelImm.X , xWen = T, canRobCompress = T), 343768f5f91SYangyu Chen 344768f5f91SYangyu Chen // Zkne: NIST Suite: AES Encryption 345768f5f91SYangyu Chen // aes64ks1i, aes64ks2 is in Zknd 346768f5f91SYangyu Chen AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es , SelImm.X , xWen = T, canRobCompress = T), 347768f5f91SYangyu Chen AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm , SelImm.X , xWen = T, canRobCompress = T), 348768f5f91SYangyu Chen 349768f5f91SYangyu Chen // Zknh: NIST Suite: Hash Function Instructions 350768f5f91SYangyu Chen SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T, canRobCompress = T), 351768f5f91SYangyu Chen SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T, canRobCompress = T), 352768f5f91SYangyu Chen SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T, canRobCompress = T), 353768f5f91SYangyu Chen SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T, canRobCompress = T), 354768f5f91SYangyu Chen SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T, canRobCompress = T), 355768f5f91SYangyu Chen SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T, canRobCompress = T), 356768f5f91SYangyu Chen SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T, canRobCompress = T), 357768f5f91SYangyu Chen SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T, canRobCompress = T), 358768f5f91SYangyu Chen 359768f5f91SYangyu Chen // Zksed: ShangMi Suite: SM4 Block Cipher Instructions 360768f5f91SYangyu Chen SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0 , SelImm.X , xWen = T, canRobCompress = T), 361768f5f91SYangyu Chen SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1 , SelImm.X , xWen = T, canRobCompress = T), 362768f5f91SYangyu Chen SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2 , SelImm.X , xWen = T, canRobCompress = T), 363768f5f91SYangyu Chen SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3 , SelImm.X , xWen = T, canRobCompress = T), 364768f5f91SYangyu Chen SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0 , SelImm.X , xWen = T, canRobCompress = T), 365768f5f91SYangyu Chen SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1 , SelImm.X , xWen = T, canRobCompress = T), 366768f5f91SYangyu Chen SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2 , SelImm.X , xWen = T, canRobCompress = T), 367768f5f91SYangyu Chen SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3 , SelImm.X , xWen = T, canRobCompress = T), 368768f5f91SYangyu Chen 369768f5f91SYangyu Chen // Zksh: ShangMi Suite: SM3 Hash Function Instructions 370768f5f91SYangyu Chen SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0 , SelImm.X , xWen = T, canRobCompress = T), 371768f5f91SYangyu 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 385964d9a87SZiyue Zhang FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2v, IF2VectorType.FMX_D_X, fWen = T, canRobCompress = T), 386964d9a87SZiyue 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 484545d7be0SYangyu Chenobject ZicondDecode extends DecodeConstants { 485545d7be0SYangyu Chen override val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 486545d7be0SYangyu Chen CZERO_EQZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_eqz, SelImm.X, xWen = T, canRobCompress = T), 487545d7be0SYangyu Chen CZERO_NEZ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.czero_nez, SelImm.X, xWen = T, canRobCompress = T), 488545d7be0SYangyu Chen ) 489545d7be0SYangyu Chen} 490545d7be0SYangyu Chen 491ca18a0b4SWilliam Wang/** 4924d24c305SYikeZhou * XiangShan Trap Decode constants 4934d24c305SYikeZhou */ 4944d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 495361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 49657a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 49757a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 4984d24c305SYikeZhou ) 4994d24c305SYikeZhou} 500be25371aSYikeZhou 50149f433deSXuan Huabstract class Imm(val len: Int) { 502b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 503b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 504b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 505b0ae3ac4SLinJiawei} 506b0ae3ac4SLinJiawei 507b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 508fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 509b0ae3ac4SLinJiawei 510b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 511b0ae3ac4SLinJiawei Cat(instr(31, 20)) 512b0ae3ac4SLinJiawei} 513b0ae3ac4SLinJiawei 514b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 515b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 516b0ae3ac4SLinJiawei 517b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 518b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 519b0ae3ac4SLinJiawei} 520b0ae3ac4SLinJiawei 521b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 522b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 523b0ae3ac4SLinJiawei 524b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 525b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 526b0ae3ac4SLinJiawei} 527b0ae3ac4SLinJiawei 528b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 529fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 530b0ae3ac4SLinJiawei 531b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 532b0ae3ac4SLinJiawei instr(31, 12) 533c2a8ae00SYikeZhou } 534c2a8ae00SYikeZhou} 535c2a8ae00SYikeZhou 536b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 537b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 538b0ae3ac4SLinJiawei 539b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 540b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 541b0ae3ac4SLinJiawei } 542b0ae3ac4SLinJiawei} 543b0ae3ac4SLinJiawei 544b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){ 545b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 546b0ae3ac4SLinJiawei 547b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 548b0ae3ac4SLinJiawei Cat(instr(19, 15), instr(31, 20)) 549b0ae3ac4SLinJiawei } 550b0ae3ac4SLinJiawei} 551b0ae3ac4SLinJiawei 552ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 553ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 554ee8ff153Szfw 555ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 556ee8ff153Szfw instr(25, 20) 557ee8ff153Szfw } 558ee8ff153Szfw} 559ee8ff153Szfw 56058c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 56158c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 56258c35d23Shuxuan0307 56358c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 56458c35d23Shuxuan0307 instr(19, 15) 56558c35d23Shuxuan0307 } 56658c35d23Shuxuan0307} 567b52d4755SXuan Hu 56858c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 56958c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 57058c35d23Shuxuan0307 57158c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 57258c35d23Shuxuan0307 instr(19, 15) 57358c35d23Shuxuan0307 } 57458c35d23Shuxuan0307} 575b52d4755SXuan Hu 5764aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 5774aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 5784aa9ed34Sfdy 5794aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 5804aa9ed34Sfdy instr(30, 20) 5814aa9ed34Sfdy } 5824aa9ed34Sfdy} 583b52d4755SXuan Hu 584b52d4755SXuan Hucase class Imm_VSETIVLI() extends Imm(13){ 5854aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 5864aa9ed34Sfdy 5874aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 5885c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 589b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 590b52d4755SXuan Hu val vtype8 = rvInst.ZIMM_VTYPE 591b52d4755SXuan Hu Cat(uimm5, vtype8) 592b52d4755SXuan Hu } 593b52d4755SXuan Hu /** 594b52d4755SXuan Hu * get VType from extended imm 595b52d4755SXuan Hu * @param extedImm 596b52d4755SXuan Hu * @return VType 597b52d4755SXuan Hu */ 598b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 599b52d4755SXuan Hu val vtype = Wire(new InstVType) 600b52d4755SXuan Hu vtype := extedImm(7, 0).asTypeOf(new InstVType) 601b52d4755SXuan Hu vtype 602b52d4755SXuan Hu } 603b52d4755SXuan Hu 604b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 605b52d4755SXuan Hu extedImm(12, 8) 6064aa9ed34Sfdy } 6074aa9ed34Sfdy} 608fe528fd6Ssinsanction 609fe528fd6Ssinsanctioncase class Imm_LUI32() extends Imm(32){ 610fe528fd6Ssinsanction override def do_toImm32(minBits: UInt): UInt = minBits(31, 0) 611fe528fd6Ssinsanction 612fe528fd6Ssinsanction override def minBitsFromInstr(instr: UInt): UInt = { 613fe528fd6Ssinsanction instr(31, 0) 614fe528fd6Ssinsanction } 615fe528fd6Ssinsanction} 616fe528fd6Ssinsanction 6177e30d16cSZhaoyang Youcase class Imm_VRORVI() extends Imm(6){ 6187e30d16cSZhaoyang You override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 6197e30d16cSZhaoyang You 6207e30d16cSZhaoyang You override def minBitsFromInstr(instr: UInt): UInt = { 6217e30d16cSZhaoyang You Cat(instr(26), instr(19, 15)) 6227e30d16cSZhaoyang You } 6237e30d16cSZhaoyang You} 6247e30d16cSZhaoyang You 625b0ae3ac4SLinJiaweiobject ImmUnion { 626b0ae3ac4SLinJiawei val I = Imm_I() 627b0ae3ac4SLinJiawei val S = Imm_S() 628b0ae3ac4SLinJiawei val B = Imm_B() 629b0ae3ac4SLinJiawei val U = Imm_U() 630b0ae3ac4SLinJiawei val J = Imm_J() 631b0ae3ac4SLinJiawei val Z = Imm_Z() 632ee8ff153Szfw val B6 = Imm_B6() 63358c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 63458c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 6354aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 6364aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 637fe528fd6Ssinsanction val LUI32 = Imm_LUI32() 6387e30d16cSZhaoyang You val VRORVI = Imm_VRORVI() 6394aa9ed34Sfdy 640520f7dacSsinsanction // do not add special type lui32 to this, keep ImmUnion max len being 20. 6417e30d16cSZhaoyang You val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI, VRORVI) 642b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 643b0ae3ac4SLinJiawei val immSelMap = Seq( 644b0ae3ac4SLinJiawei SelImm.IMM_I, 645b0ae3ac4SLinJiawei SelImm.IMM_S, 646b0ae3ac4SLinJiawei SelImm.IMM_SB, 647b0ae3ac4SLinJiawei SelImm.IMM_U, 648b0ae3ac4SLinJiawei SelImm.IMM_UJ, 649ee8ff153Szfw SelImm.IMM_Z, 65058c35d23Shuxuan0307 SelImm.IMM_B6, 65158c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 6524aa9ed34Sfdy SelImm.IMM_OPIVIU, 6534aa9ed34Sfdy SelImm.IMM_VSETVLI, 654fe528fd6Ssinsanction SelImm.IMM_VSETIVLI, 6557e30d16cSZhaoyang You SelImm.IMM_VRORVI, 656b0ae3ac4SLinJiawei ).zip(imms) 657b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 658b0ae3ac4SLinJiawei} 659b0ae3ac4SLinJiawei 660fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 661fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 662fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 663765e58c6Ssinsanction Cat(lui_imm(ImmUnion.maxLen - loadImm.getWidth - 1, 0), loadImm) 664fd7603d9SYinan Xu } 6653b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 666fd7603d9SYinan Xu val loadImmLen = Imm_I().len 6673b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 668f4dcd9fcSsinsanction Cat(Imm_U().toImm32(imm_u)(31, loadImmLen), uop.imm(loadImmLen - 1, 0)) 669fd7603d9SYinan Xu } 670fd7603d9SYinan Xu} 671b0ae3ac4SLinJiawei 672be25371aSYikeZhou/** 673be25371aSYikeZhou * IO bundle for the Decode unit 674be25371aSYikeZhou */ 675aaa08c5aSxiaofeibao-xjtuclass DecodeUnitDeqIO(implicit p: Parameters) extends XSBundle { 676aaa08c5aSxiaofeibao-xjtu val decodedInst = Output(new DecodedInst) 677aaa08c5aSxiaofeibao-xjtu val isComplex = Output(Bool()) 678aaa08c5aSxiaofeibao-xjtu val uopInfo = Output(new UopInfo) 679aaa08c5aSxiaofeibao-xjtu} 6802225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 6813b739f49SXuan Hu val enq = new Bundle { 6823b739f49SXuan Hu val ctrlFlow = Input(new StaticInst) 683d91483a6Sfdy val vtype = Input(new VType) 6844aa9ed34Sfdy } 6853b739f49SXuan Hu// val vconfig = Input(UInt(XLEN.W)) 686aaa08c5aSxiaofeibao-xjtu val deq = new DecodeUnitDeqIO 687af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 688be25371aSYikeZhou} 689be25371aSYikeZhou 690be25371aSYikeZhou/** 691be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 692be25371aSYikeZhou */ 6932225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 694be25371aSYikeZhou val io = IO(new DecodeUnitIO) 695be25371aSYikeZhou 6963b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 697be25371aSYikeZhou 69875e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 69975e2c883SXuan Hu 70057a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 70157a10886SXuan Hu FpDecode.table ++ 702bdda74fdSxiaofeibao-xjtu// FDivSqrtDecode.table ++ 703768f5f91SYangyu Chen BitmanipDecode.table ++ 704768f5f91SYangyu Chen ScalarCryptoDecode.table ++ 705a19215ddSYinan Xu XSTrapDecode.table ++ 706a19215ddSYinan Xu CBODecode.table ++ 707b65b9ebaSXuan Hu SvinvalDecode.table ++ 708e25e4d90SXuan Hu HypervisorDecode.table ++ 709545d7be0SYangyu Chen VecDecoder.table ++ 710545d7be0SYangyu Chen ZicondDecode.table 711b65b9ebaSXuan Hu 71289cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 713a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 714239413e5SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.ohid && t.reverse.head.value == SelImm.IMM_U.litValue 715a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 716a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 717be25371aSYikeZhou 7184d24c305SYikeZhou // output 7193b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 720be25371aSYikeZhou 7212ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 7227ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 7233b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 7241a1319cbSLinJiawei 7253b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 7263b739f49SXuan Hu 727a8db15d8Sfdy decodedInst.uopIdx := 0.U 728d91483a6Sfdy decodedInst.firstUop := true.B 729d91483a6Sfdy decodedInst.lastUop := true.B 730f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 7313235a9d8SZiyue-Zhang decodedInst.numWB := 1.U 732deb6421eSHaojin Tang 73373c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 734f7af4c74Schengguanghui decodedInst.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U && !io.csrCtrl.singlestep 73573c4359eSYikeZhou 73649a2cda2SXuan Hu // fmadd - b1000011 73749a2cda2SXuan Hu // fmsub - b1000111 73849a2cda2SXuan Hu // fnmsub- b1001011 73949a2cda2SXuan Hu // fnmadd- b1001111 74049a2cda2SXuan Hu private val isFMA = inst.OPCODE === BitPat("b100??11") 741e8b68a8eSgood-circle private val isVppu = FuType.isVppu(decodedInst.fuType) 742e8b68a8eSgood-circle private val isVecOPF = FuType.isVecOPF(decodedInst.fuType) 74349a2cda2SXuan Hu 744996aacc9SXuan Hu private val v0Idx = 0 745996aacc9SXuan Hu private val vconfigIdx = VCONFIG_IDX 746996aacc9SXuan Hu 747178dd38cSYikeZhou // read src1~3 location 74898cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 74998cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 75049a2cda2SXuan Hu // src(2) of fma is fs3, src(2) of vector inst is old vd 75149a2cda2SXuan Hu decodedInst.lsrc(2) := Mux(isFMA, inst.FS3, inst.VD) 752996aacc9SXuan Hu decodedInst.lsrc(3) := v0Idx.U 753996aacc9SXuan Hu decodedInst.lsrc(4) := vconfigIdx.U 754b6b11f60SXuan Hu 755178dd38cSYikeZhou // read dest location 75698cfe81bSxgkiri decodedInst.ldest := inst.RD 7574d24c305SYikeZhou 758c2a8ae00SYikeZhou // fill in exception vector 759567f0269Ssinsanction val vecException = Module(new VecExceptionGen) 760567f0269Ssinsanction vecException.io.inst := io.enq.ctrlFlow.instr 761567f0269Ssinsanction vecException.io.decodedInst := decodedInst 762bdda74fdSxiaofeibao-xjtu vecException.io.vtype := decodedInst.vpu.vtype 763567f0269Ssinsanction decodedInst.exceptionVec(illegalInstr) := decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst 7644d24c305SYikeZhou 765af2f7849Shappy-lx when (!io.csrCtrl.svinval_enable) { 766567f0269Ssinsanction val base_ii = decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst 767af2f7849Shappy-lx val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr 768af2f7849Shappy-lx val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr 769af2f7849Shappy-lx val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr 770d0de7e4aSpeixiaokun val hinval_gvma = HINVAL_GVMA === ctrl_flow.instr 771d0de7e4aSpeixiaokun val hinval_vvma = HINVAL_VVMA === ctrl_flow.instr 772d0de7e4aSpeixiaokun val svinval_ii = sinval || w_inval || inval_ir || hinval_gvma || hinval_vvma 7733b739f49SXuan Hu decodedInst.exceptionVec(illegalInstr) := base_ii || svinval_ii 7743b739f49SXuan Hu decodedInst.flushPipe := false.B 775af2f7849Shappy-lx } 776af2f7849Shappy-lx 777d0de7e4aSpeixiaokun when(io.csrCtrl.virtMode){ 778e25e4d90SXuan Hu // Todo: optimize EX_VI decode 779d0de7e4aSpeixiaokun // vs/vu attempting to exec hyperinst will raise virtual instruction 780e25e4d90SXuan Hu decodedInst.exceptionVec(virtualInstr) := ctrl_flow.instr === HLV_B || ctrl_flow.instr === HLV_BU || 781d0de7e4aSpeixiaokun ctrl_flow.instr === HLV_H || ctrl_flow.instr === HLV_HU || 782d0de7e4aSpeixiaokun ctrl_flow.instr === HLVX_HU || ctrl_flow.instr === HLV_W || 783d0de7e4aSpeixiaokun ctrl_flow.instr === HLVX_WU || ctrl_flow.instr === HLV_WU || 784d0de7e4aSpeixiaokun ctrl_flow.instr === HLV_D || ctrl_flow.instr === HSV_B || 785d0de7e4aSpeixiaokun ctrl_flow.instr === HSV_H || ctrl_flow.instr === HSV_W || 786d0de7e4aSpeixiaokun ctrl_flow.instr === HSV_D || ctrl_flow.instr === HFENCE_VVMA || 787d0de7e4aSpeixiaokun ctrl_flow.instr === HFENCE_GVMA || ctrl_flow.instr === HINVAL_GVMA || 788d0de7e4aSpeixiaokun ctrl_flow.instr === HINVAL_VVMA 789d0de7e4aSpeixiaokun } 790d0de7e4aSpeixiaokun 7913b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 792b0ae3ac4SLinJiawei x => { 7937ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 794b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 795b0ae3ac4SLinJiawei x._1 -> minBits 796b0ae3ac4SLinJiawei } 797b0ae3ac4SLinJiawei )) 798aac4464eSYinan Xu 7997531c765SXuan Hu private val isLs = FuType.isLoadStore(decodedInst.fuType) 8007531c765SXuan Hu private val isVls = FuType.isVls(decodedInst.fuType) 8017531c765SXuan Hu private val isStore = FuType.isStore(decodedInst.fuType) 8027531c765SXuan Hu private val isAMO = FuType.isAMO(decodedInst.fuType) 8037531c765SXuan Hu private val isVStore = FuType.isVStore(decodedInst.fuType) 8047531c765SXuan Hu private val isBranch = !decodedInst.preDecodeInfo.notCFI || FuType.isJump(decodedInst.fuType) 8057531c765SXuan Hu 8067531c765SXuan Hu decodedInst.commitType := Cat(isLs | isVls, (isStore && !isAMO) | isVStore | isBranch) 80775e2c883SXuan Hu 80875e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 809be25371aSYikeZhou 8100bca6cb3SZiyue Zhang private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VFRDIV_VF, VFRSUB_VF, VFMV_F_S) 81139c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 81239c388b5SXuan Hu private val narrowInsts = Seq( 81339c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 81439c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 81539c388b5SXuan Hu ) 81639c388b5SXuan Hu private val maskDstInsts = Seq( 81739c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 81839c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 81939c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 8209eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 8219eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 8229eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 8239eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 824f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 82539c388b5SXuan Hu ) 82630fcc710SZiyue Zhang private val maskOpInsts = Seq( 82730fcc710SZiyue Zhang VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 82830fcc710SZiyue Zhang ) 829*94e6af68SZiyue-Zhang private val vmaInsts = Seq( 830*94e6af68SZiyue-Zhang VMACC_VV, VMACC_VX, VNMSAC_VV, VNMSAC_VX, VMADD_VV, VMADD_VX, VNMSUB_VV, VNMSUB_VX, 831*94e6af68SZiyue-Zhang VWMACCU_VV, VWMACCU_VX, VWMACC_VV, VWMACC_VX, VWMACCSU_VV, VWMACCSU_VX, VWMACCUS_VX, 832*94e6af68SZiyue-Zhang ) 833bdda74fdSxiaofeibao-xjtu private val wfflagsInsts = Seq( 834bdda74fdSxiaofeibao-xjtu // opfff 835bdda74fdSxiaofeibao-xjtu FADD_S, FSUB_S, FADD_D, FSUB_D, 836bdda74fdSxiaofeibao-xjtu FEQ_S, FLT_S, FLE_S, FEQ_D, FLT_D, FLE_D, 837bdda74fdSxiaofeibao-xjtu FMIN_S, FMAX_S, FMIN_D, FMAX_D, 838bdda74fdSxiaofeibao-xjtu FMUL_S, FMUL_D, 839bdda74fdSxiaofeibao-xjtu FDIV_S, FDIV_D, FSQRT_S, FSQRT_D, 840bdda74fdSxiaofeibao-xjtu FMADD_S, FMSUB_S, FNMADD_S, FNMSUB_S, FMADD_D, FMSUB_D, FNMADD_D, FNMSUB_D, 841bdda74fdSxiaofeibao-xjtu FSGNJ_S, FSGNJN_S, FSGNJX_S, 842bdda74fdSxiaofeibao-xjtu // opfvv 843bdda74fdSxiaofeibao-xjtu VFADD_VV, VFSUB_VV, VFWADD_VV, VFWSUB_VV, VFWADD_WV, VFWSUB_WV, 844bdda74fdSxiaofeibao-xjtu VFMUL_VV, VFDIV_VV, VFWMUL_VV, 845bdda74fdSxiaofeibao-xjtu VFMACC_VV, VFNMACC_VV, VFMSAC_VV, VFNMSAC_VV, VFMADD_VV, VFNMADD_VV, VFMSUB_VV, VFNMSUB_VV, 846bdda74fdSxiaofeibao-xjtu VFWMACC_VV, VFWNMACC_VV, VFWMSAC_VV, VFWNMSAC_VV, 847bdda74fdSxiaofeibao-xjtu VFSQRT_V, 848bdda74fdSxiaofeibao-xjtu VFMIN_VV, VFMAX_VV, 849bdda74fdSxiaofeibao-xjtu VMFEQ_VV, VMFNE_VV, VMFLT_VV, VMFLE_VV, 850bdda74fdSxiaofeibao-xjtu VFSGNJ_VV, VFSGNJN_VV, VFSGNJX_VV, 851bdda74fdSxiaofeibao-xjtu // opfvf 852bdda74fdSxiaofeibao-xjtu VFADD_VF, VFSUB_VF, VFRSUB_VF, VFWADD_VF, VFWSUB_VF, VFWADD_WF, VFWSUB_WF, 853bdda74fdSxiaofeibao-xjtu VFMUL_VF, VFDIV_VF, VFRDIV_VF, VFWMUL_VF, 854bdda74fdSxiaofeibao-xjtu VFMACC_VF, VFNMACC_VF, VFMSAC_VF, VFNMSAC_VF, VFMADD_VF, VFNMADD_VF, VFMSUB_VF, VFNMSUB_VF, 855bdda74fdSxiaofeibao-xjtu VFWMACC_VF, VFWNMACC_VF, VFWMSAC_VF, VFWNMSAC_VF, 856bdda74fdSxiaofeibao-xjtu VFMIN_VF, VFMAX_VF, 857bdda74fdSxiaofeibao-xjtu VMFEQ_VF, VMFNE_VF, VMFLT_VF, VMFLE_VF, VMFGT_VF, VMFGE_VF, 858bdda74fdSxiaofeibao-xjtu VFSGNJ_VF, VFSGNJN_VF, VFSGNJX_VF, 859aab8ef9cSxiaofeibao-xjtu // vfred 860aab8ef9cSxiaofeibao-xjtu VFREDOSUM_VS, VFREDUSUM_VS, VFREDMAX_VS, VFREDMIN_VS, VFWREDOSUM_VS, VFWREDUSUM_VS, 861bdda74fdSxiaofeibao-xjtu // fcvt & vfcvt 862bdda74fdSxiaofeibao-xjtu FCVT_S_W, FCVT_S_WU, FCVT_S_L, FCVT_S_LU, 863bdda74fdSxiaofeibao-xjtu FCVT_W_S, FCVT_WU_S, FCVT_L_S, FCVT_LU_S, 864bdda74fdSxiaofeibao-xjtu FCVT_D_W, FCVT_D_WU, FCVT_D_L, FCVT_D_LU, 865bdda74fdSxiaofeibao-xjtu FCVT_W_D, FCVT_WU_D, FCVT_L_D, FCVT_LU_D, FCVT_S_D, FCVT_D_S, 866ba899681Schengguanghui 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, 867ba899681Schengguanghui 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, 868ba899681Schengguanghui 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, 869ba899681Schengguanghui VFNCVT_ROD_F_F_W, VFRSQRT7_V, VFREC7_V, 870bdda74fdSxiaofeibao-xjtu ) 871bdda74fdSxiaofeibao-xjtu decodedInst.wfflags := wfflagsInsts.map(_ === inst.ALL).reduce(_ || _) 872bdda74fdSxiaofeibao-xjtu val fpToVecDecoder = Module(new FPToVecDecoder()) 873bdda74fdSxiaofeibao-xjtu fpToVecDecoder.io.instr := inst.asUInt 874bdda74fdSxiaofeibao-xjtu val isFpToVecInst = fpToVecDecoder.io.vpuCtrl.fpu.isFpToVecInst 8753b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 876bdda74fdSxiaofeibao-xjtu when(isFpToVecInst){ 877bdda74fdSxiaofeibao-xjtu decodedInst.vpu := fpToVecDecoder.io.vpuCtrl 878bdda74fdSxiaofeibao-xjtu }.otherwise{ 87975e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 88075e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 88175e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 88275e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 88375e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 88475e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 88575e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 886d9355d3aSZiyue-Zhang decodedInst.vpu.veew := inst.WIDTH 88794e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 88839c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 889b6279fc6SZiyue Zhang val isNarrow = narrowInsts.map(_ === inst.ALL).reduce(_ || _) 890b6279fc6SZiyue Zhang val isDstMask = maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 891b6279fc6SZiyue Zhang val isOpMask = maskOpInsts.map(_ === inst.ALL).reduce(_ || _) 892b6279fc6SZiyue Zhang val isVlx = decodedInst.fuOpType === VlduType.vloxe || decodedInst.fuOpType === VlduType.vluxe 893d8ceb649SZiyue Zhang val isWritePartVd = decodedInst.uopSplitType === UopSplitType.VEC_VRED || decodedInst.uopSplitType === UopSplitType.VEC_0XV 894*94e6af68SZiyue-Zhang val isVma = vmaInsts.map(_ === inst.ALL).reduce(_ || _) 895b6279fc6SZiyue Zhang decodedInst.vpu.isNarrow := isNarrow 896b6279fc6SZiyue Zhang decodedInst.vpu.isDstMask := isDstMask 897b6279fc6SZiyue Zhang decodedInst.vpu.isOpMask := isOpMask 898*94e6af68SZiyue-Zhang decodedInst.vpu.isDependOldvd := isVppu || isVecOPF || isVStore || (isDstMask && !isOpMask) || isNarrow || isVlx || isVma 899d8ceb649SZiyue Zhang decodedInst.vpu.isWritePartVd := isWritePartVd 900bdda74fdSxiaofeibao-xjtu } 90175e2c883SXuan Hu 90231c51290Szhanglinjuan decodedInst.vlsInstr := isVls 90331c51290Szhanglinjuan 9046d56ac16Ssinsanction decodedInst.srcType(3) := Mux(inst.VM === 0.U && !isFpToVecInst, SrcType.vp, SrcType.DC) // mask src 9056d56ac16Ssinsanction decodedInst.srcType(4) := Mux(!isFpToVecInst, SrcType.vp, SrcType.DC) // vconfig 9066d56ac16Ssinsanction 9077f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 90887dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 90987dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 91006cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 91187dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 9120a34fc22SZiyue Zhang uopInfoGen.io.in.preInfo.vmvn := inst.IMM5_OPIVI(2, 0) 913c4501a6fSZiyue-Zhang uopInfoGen.io.in.preInfo.nf := inst.NF 91406cb2bc1Sweidingliu uopInfoGen.io.in.preInfo.isVlsr := decodedInst.fuOpType === VlduType.vlr || decodedInst.fuOpType === VstuType.vsr 915c90e3eacSZiyue Zhang uopInfoGen.io.in.preInfo.isVlsm := decodedInst.fuOpType === VlduType.vlm || decodedInst.fuOpType === VstuType.vsm 9167f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 9177f9f0a79SzhanglyGit io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop 9183235a9d8SZiyue-Zhang io.deq.uopInfo.numOfWB := uopInfoGen.io.out.uopInfo.numOfWB 9197f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 9207f9f0a79SzhanglyGit 92175e2c883SXuan Hu io.deq.decodedInst := decodedInst 9229faa51afSxiaofeibao-xjtu io.deq.decodedInst.rfWen := (decodedInst.ldest =/= 0.U) && decodedInst.rfWen 923985804e6SXuan Hu // change vlsu to vseglsu when NF =/= 0.U 924985804e6SXuan Hu io.deq.decodedInst.fuType := Mux1H(Seq( 925985804e6SXuan Hu (!FuType.FuTypeOrR(decodedInst.fuType, FuType.vldu, FuType.vstu) ) -> decodedInst.fuType, 926f94f6503SXuan 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, 927f94f6503SXuan Hu // MOP === b00 && SUMOP === b01000: unit-stride whole register store 928f94f6503SXuan Hu // MOP =/= b00 : strided and indexed store 929f94f6503SXuan 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, 930f94f6503SXuan Hu // MOP === b00 && LUMOP === b01000: unit-stride whole register load 931f94f6503SXuan Hu // MOP =/= b00 : strided and indexed load 932f94f6503SXuan 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, 933985804e6SXuan Hu )) 934be25371aSYikeZhou //------------------------------------------------------------- 935be25371aSYikeZhou // Debug Info 9363b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 9373b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 9383b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 9393b739f49SXuan 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", 9403b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 9413b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 9423b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 9433b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 9443b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 9453b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 9463b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 9473b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 948be25371aSYikeZhou} 949