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 192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters 20be25371aSYikeZhouimport chisel3._ 21be25371aSYikeZhouimport chisel3.util._ 22a19215ddSYinan Xuimport freechips.rocketchip.rocket.Instructions 236ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat 24be25371aSYikeZhouimport utils._ 253c02ee8fSwakafaimport utility._ 266ab6918fSYinan Xuimport xiangshan.ExceptionNO.illegalInstr 276ab6918fSYinan Xuimport xiangshan._ 28361e6d51SJiuyang Liuimport freechips.rocketchip.rocket.Instructions._ 29be25371aSYikeZhou 30be25371aSYikeZhou/** 31be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/ 32be25371aSYikeZhou */ 33be25371aSYikeZhouabstract trait DecodeConstants { 34361e6d51SJiuyang Liu // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt. 3557a10886SXuan Hu def X = BitPat("b0") 364d24c305SYikeZhou def N = BitPat("b0") 374d24c305SYikeZhou def Y = BitPat("b1") 3857a10886SXuan Hu def T = true 3957a10886SXuan Hu def F = false 404d24c305SYikeZhou 41c2a8ae00SYikeZhou def decodeDefault: List[BitPat] = // illegal instruction 4220e31bd1SYinan Xu // srcType(0) srcType(1) srcType(2) fuType fuOpType rfWen 434d24c305SYikeZhou // | | | | | | fpWen 4457a10886SXuan Hu // | | | | | | | vecWen 4557a10886SXuan Hu // | | | | | | | | isXSTrap 4657a10886SXuan Hu // | | | | | | | | | noSpecExec 4757a10886SXuan Hu // | | | | | | | | | | blockBackward 4857a10886SXuan Hu // | | | | | | | | | | | flushPipe 4957a10886SXuan Hu // | | | | | | | | | | | | selImm 5057a10886SXuan Hu List(SrcType.X, SrcType.X, SrcType.X, FuType.X, FuOpType.X, N, N, N, N, N, N, N, SelImm.INVALID_INSTR) // Use SelImm to indicate invalid instr 514d24c305SYikeZhou 5257a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] 5357a10886SXuan Hu final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate())) 54be25371aSYikeZhou} 55be25371aSYikeZhou 56c2a8ae00SYikeZhoutrait DecodeUnitConstants 574d24c305SYikeZhou{ 584d24c305SYikeZhou // abstract out instruction decode magic numbers 594d24c305SYikeZhou val RD_MSB = 11 604d24c305SYikeZhou val RD_LSB = 7 614d24c305SYikeZhou val RS1_MSB = 19 624d24c305SYikeZhou val RS1_LSB = 15 634d24c305SYikeZhou val RS2_MSB = 24 644d24c305SYikeZhou val RS2_LSB = 20 654d24c305SYikeZhou val RS3_MSB = 31 664d24c305SYikeZhou val RS3_LSB = 27 674d24c305SYikeZhou} 684d24c305SYikeZhou 69be25371aSYikeZhou/** 70be25371aSYikeZhou * Decoded control signals 714d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala 72be25371aSYikeZhou */ 73c2a8ae00SYikeZhou 7457a10886SXuan Huabstract class XSDecodeBase { 7557a10886SXuan Hu def X = BitPat("b?") 7657a10886SXuan Hu def N = BitPat("b0") 7757a10886SXuan Hu def Y = BitPat("b1") 7857a10886SXuan Hu def T = true 7957a10886SXuan Hu def F = false 8057a10886SXuan Hu def generate() : List[BitPat] 8157a10886SXuan Hu} 8257a10886SXuan Hu 8357a10886SXuan Hucase class XSDecode( 8457a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 8557a10886SXuan Hu fu: BitPat, fuOp: BitPat, selImm: BitPat, 8657a10886SXuan Hu xWen: Boolean = false, 8757a10886SXuan Hu fWen: Boolean = false, 8857a10886SXuan Hu vWen: Boolean = false, 8957a10886SXuan Hu mWen: Boolean = false, 9057a10886SXuan Hu xsTrap: Boolean = false, 9157a10886SXuan Hu noSpec: Boolean = false, 9257a10886SXuan Hu blockBack: Boolean = false, 9357a10886SXuan Hu flushPipe: Boolean = false, 9457a10886SXuan Hu) extends XSDecodeBase { 9557a10886SXuan Hu def generate() : List[BitPat] = { 9657a10886SXuan Hu List (src1, src2, src3, fu, fuOp, xWen.B, fWen.B, (vWen || mWen).B, xsTrap.B, noSpec.B, blockBack.B, flushPipe.B, selImm) 9757a10886SXuan Hu } 9857a10886SXuan Hu} 9957a10886SXuan Hu 10057a10886SXuan Hucase class FDecode( 10157a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 10257a10886SXuan Hu fu: BitPat, fuOp: BitPat, selImm: BitPat = SelImm.X, 10357a10886SXuan Hu xWen: Boolean = false, 10457a10886SXuan Hu fWen: Boolean = false, 10557a10886SXuan Hu vWen: Boolean = false, 10657a10886SXuan Hu mWen: Boolean = false, 10757a10886SXuan Hu xsTrap: Boolean = false, 10857a10886SXuan Hu noSpec: Boolean = false, 10957a10886SXuan Hu blockBack: Boolean = false, 11057a10886SXuan Hu flushPipe: Boolean = false, 11157a10886SXuan Hu) extends XSDecodeBase { 11257a10886SXuan Hu def generate() : List[BitPat] = { 11357a10886SXuan Hu XSDecode(src1, src2, src3, fu, fuOp, selImm, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe).generate() 11457a10886SXuan Hu } 11557a10886SXuan Hu} 11657a10886SXuan Hu 117be25371aSYikeZhou/** 118be25371aSYikeZhou * Decode constants for RV64 119be25371aSYikeZhou */ 120be25371aSYikeZhouobject X64Decode extends DecodeConstants { 12157a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 12257a10886SXuan Hu LD -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld , SelImm.IMM_I, xWen = T), 12357a10886SXuan Hu LWU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T), 12457a10886SXuan Hu SD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd , SelImm.IMM_S ), 1254d24c305SYikeZhou 12657a10886SXuan Hu SLLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T), 12757a10886SXuan Hu SRLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T), 12857a10886SXuan Hu SRAI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T), 1294d24c305SYikeZhou 13057a10886SXuan Hu ADDIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T), 13157a10886SXuan Hu SLLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T), 13257a10886SXuan Hu SRAIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T), 13357a10886SXuan Hu SRLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T), 1344d24c305SYikeZhou 13557a10886SXuan Hu ADDW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X , xWen = T), 13657a10886SXuan Hu SUBW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X , xWen = T), 13757a10886SXuan Hu SLLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X , xWen = T), 13857a10886SXuan Hu SRAW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X , xWen = T), 13957a10886SXuan Hu SRLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X , xWen = T), 140ee8ff153Szfw 14157a10886SXuan Hu RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw, SelImm.X , xWen = T), 14257a10886SXuan Hu RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw, SelImm.IMM_I, xWen = T), 14357a10886SXuan Hu ROLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw, SelImm.X , xWen = T), 1444d24c305SYikeZhou ) 145be25371aSYikeZhou} 146be25371aSYikeZhou 147be25371aSYikeZhou/** 148be25371aSYikeZhou * Overall Decode constants 149be25371aSYikeZhou */ 150be25371aSYikeZhouobject XDecode extends DecodeConstants { 15157a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 15257a10886SXuan Hu LW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw , SelImm.IMM_I, xWen = T), 15357a10886SXuan Hu LH -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh , SelImm.IMM_I, xWen = T), 15457a10886SXuan Hu LHU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T), 15557a10886SXuan Hu LB -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb , SelImm.IMM_I, xWen = T), 15657a10886SXuan Hu LBU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T), 15757a10886SXuan Hu SW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw , SelImm.IMM_S ), 15857a10886SXuan Hu SH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh , SelImm.IMM_S ), 15957a10886SXuan Hu SB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb , SelImm.IMM_S ), 16057a10886SXuan Hu LUI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T), 16157a10886SXuan Hu ADDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T), 16257a10886SXuan Hu ANDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T), 16357a10886SXuan Hu ORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or , SelImm.IMM_I, xWen = T), 16457a10886SXuan Hu XORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T), 16557a10886SXuan Hu SLTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T), 16657a10886SXuan Hu SLTIU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T), 16757a10886SXuan Hu SLL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X , xWen = T), 16857a10886SXuan Hu ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X , xWen = T), 16957a10886SXuan Hu SUB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X , xWen = T), 17057a10886SXuan Hu SLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X , xWen = T), 17157a10886SXuan Hu SLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X , xWen = T), 17257a10886SXuan Hu AND -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X , xWen = T), 17357a10886SXuan Hu OR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or , SelImm.X , xWen = T), 17457a10886SXuan Hu XOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X , xWen = T), 17557a10886SXuan Hu SRA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X , xWen = T), 17657a10886SXuan Hu SRL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X , xWen = T), 1774d24c305SYikeZhou 17857a10886SXuan Hu MUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul , SelImm.X, xWen = T), 17957a10886SXuan Hu MULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh , SelImm.X, xWen = T), 18057a10886SXuan Hu MULHU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T), 18157a10886SXuan Hu MULHSU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T), 18257a10886SXuan Hu MULW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw , SelImm.X, xWen = T), 1834d24c305SYikeZhou 18457a10886SXuan Hu DIV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div , SelImm.X, xWen = T), 18557a10886SXuan Hu DIVU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu , SelImm.X, xWen = T), 18657a10886SXuan Hu REM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem , SelImm.X, xWen = T), 18757a10886SXuan Hu REMU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu , SelImm.X, xWen = T), 18857a10886SXuan Hu DIVW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw , SelImm.X, xWen = T), 18957a10886SXuan Hu DIVUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T), 19057a10886SXuan Hu REMW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw , SelImm.X, xWen = T), 19157a10886SXuan Hu REMUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T), 1924d24c305SYikeZhou 19357a10886SXuan Hu AUIPC -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T), 19457a10886SXuan Hu JAL -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal , SelImm.IMM_UJ, xWen = T), 19557a10886SXuan Hu JALR -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , xWen = T), 19657a10886SXuan Hu BEQ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.beq , SelImm.IMM_SB ), 19757a10886SXuan Hu BNE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bne , SelImm.IMM_SB ), 19857a10886SXuan Hu BGE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bge , SelImm.IMM_SB ), 19957a10886SXuan Hu BGEU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bgeu , SelImm.IMM_SB ), 20057a10886SXuan Hu BLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.blt , SelImm.IMM_SB ), 20157a10886SXuan Hu BLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bltu , SelImm.IMM_SB ), 2024d24c305SYikeZhou 20357a10886SXuan Hu // I-type, XSDecodeiate12 holds the CSR register. 20457a10886SXuan Hu CSRRW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 20557a10886SXuan Hu CSRRS -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 20657a10886SXuan Hu CSRRC -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 2074d24c305SYikeZhou 20857a10886SXuan Hu CSRRWI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 20957a10886SXuan Hu CSRRSI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21057a10886SXuan Hu CSRRCI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2114d24c305SYikeZhou 21257a10886SXuan Hu EBREAK -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21357a10886SXuan Hu ECALL -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21457a10886SXuan Hu SRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21557a10886SXuan Hu MRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21657a10886SXuan Hu DRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21757a10886SXuan Hu WFI -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X , xWen = T, noSpec = T, blockBack = T), 2184d24c305SYikeZhou 21957a10886SXuan Hu SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22057a10886SXuan Hu FENCE_I -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22157a10886SXuan Hu FENCE -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 2224d24c305SYikeZhou 2234d24c305SYikeZhou // A-type 22457a10886SXuan Hu AMOADD_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 22557a10886SXuan Hu AMOXOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 22657a10886SXuan Hu AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 22757a10886SXuan Hu AMOAND_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 22857a10886SXuan Hu AMOOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 22957a10886SXuan Hu AMOMIN_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23057a10886SXuan Hu AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23157a10886SXuan Hu AMOMAX_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23257a10886SXuan Hu AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2334d24c305SYikeZhou 23457a10886SXuan Hu AMOADD_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23557a10886SXuan Hu AMOXOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23657a10886SXuan Hu AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23757a10886SXuan Hu AMOAND_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23857a10886SXuan Hu AMOOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23957a10886SXuan Hu AMOMIN_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24057a10886SXuan Hu AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24157a10886SXuan Hu AMOMAX_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24257a10886SXuan Hu AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2434d24c305SYikeZhou 24457a10886SXuan Hu LR_W -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24557a10886SXuan Hu LR_D -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24657a10886SXuan Hu SC_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24757a10886SXuan Hu SC_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 248ee8ff153Szfw 24957a10886SXuan Hu ANDN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn, SelImm.X, xWen = T), 25057a10886SXuan Hu ORN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X, xWen = T), 25157a10886SXuan Hu XNOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor, SelImm.X, xWen = T), 25257a10886SXuan Hu ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb, SelImm.X, xWen = T), 253ee8ff153Szfw 25457a10886SXuan Hu MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X, xWen = T), 25557a10886SXuan Hu MINU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu, SelImm.X, xWen = T), 25657a10886SXuan Hu MAX -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X, xWen = T), 25757a10886SXuan Hu MAXU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu, SelImm.X, xWen = T), 258ee8ff153Szfw 25957a10886SXuan Hu SEXT_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sextb, SelImm.X, xWen = T), 26057a10886SXuan Hu PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh, SelImm.X, xWen = T), 26157a10886SXuan Hu SEXT_H -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sexth, SelImm.X, xWen = T), 26257a10886SXuan Hu PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw, SelImm.X, xWen = T), 26357a10886SXuan Hu BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X, xWen = T), 26457a10886SXuan Hu REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X, xWen = T), 26557a10886SXuan Hu PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X, xWen = T), 266ee8ff153Szfw 26757a10886SXuan Hu BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset, SelImm.X , xWen = T), 26857a10886SXuan Hu BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset, SelImm.IMM_I, xWen = T), 26957a10886SXuan Hu BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr, SelImm.X , xWen = T), 27057a10886SXuan Hu BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr, SelImm.IMM_I, xWen = T), 27157a10886SXuan Hu BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv, SelImm.X , xWen = T), 27257a10886SXuan Hu BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv, SelImm.IMM_I, xWen = T), 27357a10886SXuan Hu BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext, SelImm.X , xWen = T), 27457a10886SXuan Hu BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext, SelImm.IMM_I, xWen = T), 275ee8ff153Szfw 27657a10886SXuan Hu ROR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror, SelImm.X , xWen = T), 27757a10886SXuan Hu RORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror, SelImm.IMM_I , xWen = T), 27857a10886SXuan Hu ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol, SelImm.X , xWen = T), 279ee8ff153Szfw 28057a10886SXuan Hu SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T), 28157a10886SXuan Hu SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T), 28257a10886SXuan Hu SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T), 28357a10886SXuan Hu SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T), 28457a10886SXuan Hu SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T), 28557a10886SXuan Hu SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T), 28657a10886SXuan Hu ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T), 28757a10886SXuan Hu SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T), 2884d24c305SYikeZhou ) 289be25371aSYikeZhou} 290be25371aSYikeZhou 291be25371aSYikeZhou/** 292be25371aSYikeZhou * FP Decode constants 293be25371aSYikeZhou */ 29457a10886SXuan Huobject FpDecode extends DecodeConstants{ 29557a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 29657a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 29757a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 29857a10886SXuan Hu FSW -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S ), 29957a10886SXuan Hu FSD -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S ), 3004d24c305SYikeZhou 30157a10886SXuan Hu FCLASS_S-> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 30257a10886SXuan Hu FCLASS_D-> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 3034d24c305SYikeZhou 30457a10886SXuan Hu FMV_X_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 30557a10886SXuan Hu FMV_X_W -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 3064d24c305SYikeZhou 30757a10886SXuan Hu FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 30857a10886SXuan Hu FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 309c2a8ae00SYikeZhou 31057a10886SXuan Hu FSGNJ_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 31157a10886SXuan Hu FSGNJ_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 31257a10886SXuan Hu FSGNJX_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 31357a10886SXuan Hu FSGNJX_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 31457a10886SXuan Hu FSGNJN_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 31557a10886SXuan Hu FSGNJN_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 3164d24c305SYikeZhou 3174d24c305SYikeZhou // FP to FP 31857a10886SXuan Hu FCVT_S_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 31957a10886SXuan Hu FCVT_D_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 3204d24c305SYikeZhou 3214d24c305SYikeZhou // Int to FP 32257a10886SXuan Hu FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 32357a10886SXuan Hu FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 32457a10886SXuan Hu FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 32557a10886SXuan Hu FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 3264d24c305SYikeZhou 32757a10886SXuan Hu FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 32857a10886SXuan Hu FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 32957a10886SXuan Hu FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 33057a10886SXuan Hu FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T), 3314d24c305SYikeZhou 3324d24c305SYikeZhou // FP to Int 33357a10886SXuan Hu FCVT_W_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 33457a10886SXuan Hu FCVT_WU_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 33557a10886SXuan Hu FCVT_L_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 33657a10886SXuan Hu FCVT_LU_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 3374d24c305SYikeZhou 33857a10886SXuan Hu FCVT_W_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 33957a10886SXuan Hu FCVT_WU_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 34057a10886SXuan Hu FCVT_L_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 34157a10886SXuan Hu FCVT_LU_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 3424d24c305SYikeZhou 34357a10886SXuan Hu FEQ_S -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 34457a10886SXuan Hu FLT_S -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 34557a10886SXuan Hu FLE_S -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 3464d24c305SYikeZhou 34757a10886SXuan Hu FEQ_D -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 34857a10886SXuan Hu FLT_D -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 34957a10886SXuan Hu FLE_D -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T), 3504d24c305SYikeZhou 35157a10886SXuan Hu FMIN_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 35257a10886SXuan Hu FMAX_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 35357a10886SXuan Hu FMIN_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 35457a10886SXuan Hu FMAX_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 3554d24c305SYikeZhou 35657a10886SXuan Hu FADD_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T), 35757a10886SXuan Hu FSUB_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T), 35857a10886SXuan Hu FMUL_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T), 35957a10886SXuan Hu FADD_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T), 36057a10886SXuan Hu FSUB_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T), 36157a10886SXuan Hu FMUL_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T), 3624d24c305SYikeZhou 36357a10886SXuan Hu FMADD_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T), 36457a10886SXuan Hu FMSUB_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T), 36557a10886SXuan Hu FNMADD_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T), 36657a10886SXuan Hu FNMSUB_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T), 36757a10886SXuan Hu FMADD_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T), 36857a10886SXuan Hu FMSUB_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T), 36957a10886SXuan Hu FNMADD_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T), 37057a10886SXuan Hu FNMSUB_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T), 3714d24c305SYikeZhou ) 372be25371aSYikeZhou} 373be25371aSYikeZhou 374be25371aSYikeZhou/** 375ee8ff153Szfw * Bit Manipulation Decode 376ee8ff153Szfw */ 377ee8ff153Szfwobject BDecode extends DecodeConstants{ 37857a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 379ee8ff153Szfw // Basic bit manipulation 38057a10886SXuan Hu CLZ -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.clz, SelImm.X, xWen = T), 38157a10886SXuan Hu CTZ -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.ctz, SelImm.X, xWen = T), 38257a10886SXuan Hu CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop, SelImm.X, xWen = T), 38357a10886SXuan Hu XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb, SelImm.X, xWen = T), 38457a10886SXuan Hu XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn, SelImm.X, xWen = T), 38507596dc6Szfw 38657a10886SXuan Hu CLZW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.clzw, SelImm.X, xWen = T), 38757a10886SXuan Hu CTZW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.ctzw, SelImm.X, xWen = T), 38857a10886SXuan Hu CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw, SelImm.X, xWen = T), 389ee8ff153Szfw 39057a10886SXuan Hu CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul, SelImm.X, xWen = T), 39157a10886SXuan Hu CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh, SelImm.X, xWen = T), 39257a10886SXuan Hu CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr, SelImm.X, xWen = T), 3933feeca58Szfw 39457a10886SXuan Hu AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es, SelImm.X , xWen = T), 39557a10886SXuan Hu AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm, SelImm.X , xWen = T), 39657a10886SXuan Hu AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds, SelImm.X , xWen = T), 39757a10886SXuan Hu AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm, SelImm.X , xWen = T), 39857a10886SXuan Hu AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im, SelImm.X , xWen = T), 39957a10886SXuan Hu AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i, SelImm.IMM_I, xWen = T), 40057a10886SXuan Hu AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2, SelImm.X , xWen = T), 40157a10886SXuan Hu SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T), 40257a10886SXuan Hu SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T), 40357a10886SXuan Hu SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T), 40457a10886SXuan Hu SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T), 40557a10886SXuan Hu SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T), 40657a10886SXuan Hu SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T), 40757a10886SXuan Hu SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T), 40857a10886SXuan Hu SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T), 40957a10886SXuan Hu SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0, SelImm.X , xWen = T), 41057a10886SXuan Hu SM3P1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p1, SelImm.X , xWen = T), 41157a10886SXuan Hu SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0, SelImm.X , xWen = T), 41257a10886SXuan Hu SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1, SelImm.X , xWen = T), 41357a10886SXuan Hu SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2, SelImm.X , xWen = T), 41457a10886SXuan Hu SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3, SelImm.X , xWen = T), 41557a10886SXuan Hu SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0, SelImm.X , xWen = T), 41657a10886SXuan Hu SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1, SelImm.X , xWen = T), 41757a10886SXuan Hu SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2, SelImm.X , xWen = T), 41857a10886SXuan Hu SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3, SelImm.X , xWen = T), 419ee8ff153Szfw ) 420ee8ff153Szfw} 421ee8ff153Szfw 422ee8ff153Szfw/** 423be25371aSYikeZhou * FP Divide SquareRoot Constants 424be25371aSYikeZhou */ 425be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 42657a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 42757a10886SXuan Hu FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 42857a10886SXuan Hu FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 42957a10886SXuan Hu FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 43057a10886SXuan Hu FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T), 4314d24c305SYikeZhou ) 432be25371aSYikeZhou} 433be25371aSYikeZhou 4344d24c305SYikeZhou/** 435af2f7849Shappy-lx * Svinval extension Constants 436af2f7849Shappy-lx */ 437af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 43857a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 439af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 440af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 441af2f7849Shappy-lx */ 44257a10886SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X), 443af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 444af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 445af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 446af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 447af2f7849Shappy-lx */ 44857a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 449af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 450af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 451af2f7849Shappy-lx * then dispatch and issue this instrucion 452af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 453af2f7849Shappy-lx */ 45457a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 455af2f7849Shappy-lx /* what is Svinval extension ? 456af2f7849Shappy-lx * -----> sfecne.w.inval 457af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 458af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 459af2f7849Shappy-lx * -----> sfecne.inval.ir 460af2f7849Shappy-lx * 461af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 462af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 463af2f7849Shappy-lx */ 464af2f7849Shappy-lx ) 465af2f7849Shappy-lx} 46657a10886SXuan Hu 467af2f7849Shappy-lx/* 468ca18a0b4SWilliam Wang * CBO decode 469ca18a0b4SWilliam Wang */ 470ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 47157a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 47257a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 47357a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 47457a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 47557a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 476ca18a0b4SWilliam Wang ) 477ca18a0b4SWilliam Wang} 478ca18a0b4SWilliam Wang 479ca18a0b4SWilliam Wang/** 4804d24c305SYikeZhou * XiangShan Trap Decode constants 4814d24c305SYikeZhou */ 4824d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 483361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 48457a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 48557a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 4864d24c305SYikeZhou ) 4874d24c305SYikeZhou} 488be25371aSYikeZhou 489b0ae3ac4SLinJiawei//object Imm32Gen { 490b0ae3ac4SLinJiawei// def apply(sel: UInt, inst: UInt) = { 491b0ae3ac4SLinJiawei// val sign = Mux(sel === SelImm.IMM_Z, 0.S, inst(31).asSInt) 492b0ae3ac4SLinJiawei// val b30_20 = Mux(sel === SelImm.IMM_U, inst(30,20).asSInt, sign) 493b0ae3ac4SLinJiawei// val b19_12 = Mux(sel =/= SelImm.IMM_U && sel =/= SelImm.IMM_UJ, sign, inst(19,12).asSInt) 494b0ae3ac4SLinJiawei// val b11 = Mux(sel === SelImm.IMM_U || sel === SelImm.IMM_Z, 0.S, 495b0ae3ac4SLinJiawei// Mux(sel === SelImm.IMM_UJ, inst(20).asSInt, 496b0ae3ac4SLinJiawei// Mux(sel === SelImm.IMM_SB, inst(7).asSInt, sign))) 497b0ae3ac4SLinJiawei// val b10_5 = Mux(sel === SelImm.IMM_U || sel === SelImm.IMM_Z, 0.U(1.W), inst(30,25)) 498b0ae3ac4SLinJiawei// val b4_1 = Mux(sel === SelImm.IMM_U, 0.U(1.W), 499b0ae3ac4SLinJiawei// Mux(sel === SelImm.IMM_S || sel === SelImm.IMM_SB, inst(11,8), 500b0ae3ac4SLinJiawei// Mux(sel === SelImm.IMM_Z, inst(19,16), inst(24,21)))) 501b0ae3ac4SLinJiawei// val b0 = Mux(sel === SelImm.IMM_S, inst(7), 502b0ae3ac4SLinJiawei// Mux(sel === SelImm.IMM_I, inst(20), 503b0ae3ac4SLinJiawei// Mux(sel === SelImm.IMM_Z, inst(15), 0.U(1.W)))) 504b0ae3ac4SLinJiawei// 505b0ae3ac4SLinJiawei// Cat(sign, b30_20, b19_12, b11, b10_5, b4_1, b0) 506b0ae3ac4SLinJiawei// } 507b0ae3ac4SLinJiawei//} 508c2a8ae00SYikeZhou 509b0ae3ac4SLinJiaweiabstract class Imm(val len: Int) extends Bundle { 510b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 511b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 512b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 513b0ae3ac4SLinJiawei} 514b0ae3ac4SLinJiawei 515b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 516fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 517b0ae3ac4SLinJiawei 518b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 519b0ae3ac4SLinJiawei Cat(instr(31, 20)) 520b0ae3ac4SLinJiawei} 521b0ae3ac4SLinJiawei 522b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 523b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 524b0ae3ac4SLinJiawei 525b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 526b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 527b0ae3ac4SLinJiawei} 528b0ae3ac4SLinJiawei 529b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 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(7), instr(30, 25), instr(11, 8)) 534b0ae3ac4SLinJiawei} 535b0ae3ac4SLinJiawei 536b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 537fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 538b0ae3ac4SLinJiawei 539b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 540b0ae3ac4SLinJiawei instr(31, 12) 541c2a8ae00SYikeZhou } 542c2a8ae00SYikeZhou} 543c2a8ae00SYikeZhou 544b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 545b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 546b0ae3ac4SLinJiawei 547b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 548b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 549b0ae3ac4SLinJiawei } 550b0ae3ac4SLinJiawei} 551b0ae3ac4SLinJiawei 552b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){ 553b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 554b0ae3ac4SLinJiawei 555b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 556b0ae3ac4SLinJiawei Cat(instr(19, 15), instr(31, 20)) 557b0ae3ac4SLinJiawei } 558b0ae3ac4SLinJiawei} 559b0ae3ac4SLinJiawei 560ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 561ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 562ee8ff153Szfw 563ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 564ee8ff153Szfw instr(25, 20) 565ee8ff153Szfw } 566ee8ff153Szfw} 567ee8ff153Szfw 56858c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 56958c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 57058c35d23Shuxuan0307 57158c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 57258c35d23Shuxuan0307 instr(19, 15) 57358c35d23Shuxuan0307 } 57458c35d23Shuxuan0307} 57558c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 57658c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 57758c35d23Shuxuan0307 57858c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 57958c35d23Shuxuan0307 instr(19, 15) 58058c35d23Shuxuan0307 } 58158c35d23Shuxuan0307} 582b0ae3ac4SLinJiaweiobject ImmUnion { 583b0ae3ac4SLinJiawei val I = Imm_I() 584b0ae3ac4SLinJiawei val S = Imm_S() 585b0ae3ac4SLinJiawei val B = Imm_B() 586b0ae3ac4SLinJiawei val U = Imm_U() 587b0ae3ac4SLinJiawei val J = Imm_J() 588b0ae3ac4SLinJiawei val Z = Imm_Z() 589ee8ff153Szfw val B6 = Imm_B6() 59058c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 59158c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 59258c35d23Shuxuan0307 val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU) 593b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 594b0ae3ac4SLinJiawei val immSelMap = Seq( 595b0ae3ac4SLinJiawei SelImm.IMM_I, 596b0ae3ac4SLinJiawei SelImm.IMM_S, 597b0ae3ac4SLinJiawei SelImm.IMM_SB, 598b0ae3ac4SLinJiawei SelImm.IMM_U, 599b0ae3ac4SLinJiawei SelImm.IMM_UJ, 600ee8ff153Szfw SelImm.IMM_Z, 60158c35d23Shuxuan0307 SelImm.IMM_B6, 60258c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 60358c35d23Shuxuan0307 SelImm.IMM_OPIVIU 604b0ae3ac4SLinJiawei ).zip(imms) 605b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 606b0ae3ac4SLinJiawei} 607b0ae3ac4SLinJiawei 608fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 609fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 610fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 611fd7603d9SYinan Xu Cat(lui_imm(Imm_U().len - loadImm.getWidth - 1, 0), loadImm) 612fd7603d9SYinan Xu } 613fd7603d9SYinan Xu def getLuiImm(uop: MicroOp): UInt = { 614fd7603d9SYinan Xu val loadImmLen = Imm_I().len 615fd7603d9SYinan Xu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.ctrl.imm(ImmUnion.maxLen - 1, loadImmLen)) 616fd7603d9SYinan Xu Imm_U().do_toImm32(imm_u) 617fd7603d9SYinan Xu } 618fd7603d9SYinan Xu} 619b0ae3ac4SLinJiawei 620be25371aSYikeZhou/** 621be25371aSYikeZhou * IO bundle for the Decode unit 622be25371aSYikeZhou */ 6232225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 624be25371aSYikeZhou val enq = new Bundle { val ctrl_flow = Input(new CtrlFlow) } 625be25371aSYikeZhou val deq = new Bundle { val cf_ctrl = Output(new CfCtrl) } 626af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 627be25371aSYikeZhou} 628be25371aSYikeZhou 629be25371aSYikeZhou/** 630be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 631be25371aSYikeZhou */ 6322225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 633be25371aSYikeZhou val io = IO(new DecodeUnitIO) 634be25371aSYikeZhou 6354d24c305SYikeZhou val ctrl_flow = Wire(new CtrlFlow) // input with RVC Expanded 6364d24c305SYikeZhou val cf_ctrl = Wire(new CfCtrl) 6374d24c305SYikeZhou 638be25371aSYikeZhou ctrl_flow := io.enq.ctrl_flow 639be25371aSYikeZhou 64057a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 64157a10886SXuan Hu FpDecode.table ++ 642a19215ddSYinan Xu FDivSqrtDecode.table ++ 643a19215ddSYinan Xu X64Decode.table ++ 644a19215ddSYinan Xu XSTrapDecode.table ++ 645a19215ddSYinan Xu BDecode.table ++ 646a19215ddSYinan Xu CBODecode.table ++ 647*b65b9ebaSXuan Hu SvinvalDecode.table ++ 648*b65b9ebaSXuan Hu VecDecoder.table 649*b65b9ebaSXuan Hu 650*b65b9ebaSXuan Hu require(decode_table.map(_._2.length == 13).reduce(_ && _), "Decode tables have different column size") 651a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 652a19215ddSYinan Xu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu.litValue && t.reverse.head.value == SelImm.IMM_U.litValue 653a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 654a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 655be25371aSYikeZhou 6564d24c305SYikeZhou // output 6574d24c305SYikeZhou cf_ctrl.cf := ctrl_flow 6586e7c9679Shuxuan0307 val cs: CtrlSignals = Wire(new CtrlSignals()).decode(ctrl_flow.instr, decode_table) 659d4aca96cSlqre cs.singleStep := false.B 660c88c3a2aSYinan Xu cs.replayInst := false.B 661be25371aSYikeZhou 6622ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 6637ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 6642ce29ed6SLinJiawei cs.fpu := fpDecoder.io.fpCtrl 6651a1319cbSLinJiawei 666a7a8a6ccSHaojin Tang // TODO: vec decode 667deb6421eSHaojin Tang cs.vecWen := DontCare 668a7a8a6ccSHaojin Tang cs.srcType(3) := DontCare 669a7a8a6ccSHaojin Tang cs.lsrc(3) := DontCare 670deb6421eSHaojin Tang 67173c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 672c3abb8b6SYinan Xu cs.isMove := isMove && ctrl_flow.instr(RD_MSB, RD_LSB) =/= 0.U 67373c4359eSYikeZhou 674178dd38cSYikeZhou // read src1~3 location 675a19215ddSYinan Xu cs.lsrc(0) := ctrl_flow.instr(RS1_MSB, RS1_LSB) 67620e31bd1SYinan Xu cs.lsrc(1) := ctrl_flow.instr(RS2_MSB, RS2_LSB) 67720e31bd1SYinan Xu cs.lsrc(2) := ctrl_flow.instr(RS3_MSB, RS3_LSB) 678178dd38cSYikeZhou // read dest location 679c3abb8b6SYinan Xu cs.ldest := ctrl_flow.instr(RD_MSB, RD_LSB) 6804d24c305SYikeZhou 681c2a8ae00SYikeZhou // fill in exception vector 68226a692b9SYinan Xu cf_ctrl.cf.exceptionVec := io.enq.ctrl_flow.exceptionVec 683389157b6SYikeZhou cf_ctrl.cf.exceptionVec(illegalInstr) := cs.selImm === SelImm.INVALID_INSTR 6844d24c305SYikeZhou 685af2f7849Shappy-lx when (!io.csrCtrl.svinval_enable) { 686af2f7849Shappy-lx val base_ii = cs.selImm === SelImm.INVALID_INSTR 687af2f7849Shappy-lx val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr 688af2f7849Shappy-lx val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr 689af2f7849Shappy-lx val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr 690af2f7849Shappy-lx val svinval_ii = sinval || w_inval || inval_ir 691af2f7849Shappy-lx cf_ctrl.cf.exceptionVec(illegalInstr) := base_ii || svinval_ii 692af2f7849Shappy-lx cs.flushPipe := false.B 693af2f7849Shappy-lx } 694af2f7849Shappy-lx 695c2a8ae00SYikeZhou // fix frflags 696c2a8ae00SYikeZhou // fflags zero csrrs rd csr 697c2a8ae00SYikeZhou val isFrflags = BitPat("b000000000001_00000_010_?????_1110011") === ctrl_flow.instr 698c2a8ae00SYikeZhou when (cs.fuType === FuType.csr && isFrflags) { 699c2a8ae00SYikeZhou cs.blockBackward := false.B 700c2a8ae00SYikeZhou } 701c2a8ae00SYikeZhou 702b0ae3ac4SLinJiawei cs.imm := LookupTree(cs.selImm, ImmUnion.immSelMap.map( 703b0ae3ac4SLinJiawei x => { 7047ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 705b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 706b0ae3ac4SLinJiawei x._1 -> minBits 707b0ae3ac4SLinJiawei } 708b0ae3ac4SLinJiawei )) 709aac4464eSYinan Xu 7104d24c305SYikeZhou cf_ctrl.ctrl := cs 711c2a8ae00SYikeZhou 7124d24c305SYikeZhou io.deq.cf_ctrl := cf_ctrl 713be25371aSYikeZhou 714be25371aSYikeZhou //------------------------------------------------------------- 715be25371aSYikeZhou // Debug Info 71661a56a41SYinan Xu XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 7174d24c305SYikeZhou io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 71861a56a41SYinan Xu io.enq.ctrl_flow.crossPageIPFFix) 71920e31bd1SYinan Xu 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", 72020e31bd1SYinan Xu io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 72120e31bd1SYinan Xu io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 7224d24c305SYikeZhou io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 7236e7c9679Shuxuan0307 XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 7244d24c305SYikeZhou io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 7254d24c305SYikeZhou io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 7266e7c9679Shuxuan0307 io.deq.cf_ctrl.ctrl.imm) 72761a56a41SYinan Xu XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 728be25371aSYikeZhou} 729