124519898SXuan Hupackage xiangshan.backend.ctrlblock 224519898SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 424519898SXuan Huimport chisel3._ 524519898SXuan Huimport chisel3.util._ 624519898SXuan Huimport xiangshan.XSBundle 7*ac4d321dSXuan Huimport xiangshan.mem.LoadReplayCauses 824519898SXuan Hu 924519898SXuan Huclass DebugMdpInfo(implicit p: Parameters) extends XSBundle{ 1024519898SXuan Hu val ssid = UInt(SSIDWidth.W) 1124519898SXuan Hu val waitAllStore = Bool() 1224519898SXuan Hu} 1324519898SXuan Hu 1424519898SXuan Huclass DebugLsInfo(implicit p: Parameters) extends XSBundle{ 15*ac4d321dSXuan Hu val s1_isTlbFirstMiss = Bool() // in s1 16*ac4d321dSXuan Hu val s1_isLoadToLoadForward = Bool() 17*ac4d321dSXuan Hu val s2_isBankConflict = Bool() 18*ac4d321dSXuan Hu val s2_isDcacheFirstMiss = Bool() // in s2 (predicted result is in s1 when using WPU, real result is in s2) 19*ac4d321dSXuan Hu val s2_isForwardFail = Bool() // in s2 20*ac4d321dSXuan Hu val s3_isReplayFast = Bool() 21*ac4d321dSXuan Hu val s3_isReplaySlow = Bool() 22*ac4d321dSXuan Hu val s3_isReplayRS = Bool() 23*ac4d321dSXuan Hu val s3_isReplay = Bool() 24*ac4d321dSXuan Hu val replayCause = Vec(LoadReplayCauses.allCauses, Bool()) 2524519898SXuan Hu val replayCnt = UInt(XLEN.W) 2624519898SXuan Hu 2724519898SXuan Hu def s1SignalEnable(ena: DebugLsInfo) = { 28*ac4d321dSXuan Hu when(ena.s1_isTlbFirstMiss) { s1_isTlbFirstMiss := true.B } 29*ac4d321dSXuan Hu when(ena.s1_isLoadToLoadForward) { s1_isLoadToLoadForward := true.B } 3024519898SXuan Hu } 3124519898SXuan Hu 3224519898SXuan Hu def s2SignalEnable(ena: DebugLsInfo) = { 33*ac4d321dSXuan Hu when(ena.s2_isBankConflict) { s2_isBankConflict := true.B } 34*ac4d321dSXuan Hu when(ena.s2_isDcacheFirstMiss) { s2_isDcacheFirstMiss := true.B } 35*ac4d321dSXuan Hu when(ena.s2_isForwardFail) { s2_isForwardFail := true.B } 36*ac4d321dSXuan Hu } 37*ac4d321dSXuan Hu def s3SignalEnable(ena: DebugLsInfo) = { 38*ac4d321dSXuan Hu when(ena.s3_isReplayFast) { s3_isReplayFast := true.B } 39*ac4d321dSXuan Hu when(ena.s3_isReplaySlow) { s3_isReplaySlow := true.B } 40*ac4d321dSXuan Hu when(ena.s3_isReplayRS) { s3_isReplayRS := true.B } 41*ac4d321dSXuan Hu when(ena.s3_isReplay) { 42*ac4d321dSXuan Hu s3_isReplay := true.B 4324519898SXuan Hu replayCnt := replayCnt + 1.U 44*ac4d321dSXuan Hu when((ena.replayCause.asUInt ^ replayCause.asUInt).orR) { 45*ac4d321dSXuan Hu replayCause := ena.replayCause.zipWithIndex.map{ case (x, i) => x | replayCause(i) } 46*ac4d321dSXuan Hu } 4724519898SXuan Hu } 4824519898SXuan Hu } 4924519898SXuan Hu} 5024519898SXuan Hu 5124519898SXuan Huobject DebugLsInfo { 5224519898SXuan Hu def init(implicit p: Parameters): DebugLsInfo = { 5324519898SXuan Hu val lsInfo = Wire(new DebugLsInfo) 54*ac4d321dSXuan Hu lsInfo.s1_isTlbFirstMiss := false.B 55*ac4d321dSXuan Hu lsInfo.s1_isLoadToLoadForward := false.B 56*ac4d321dSXuan Hu lsInfo.s2_isBankConflict := false.B 57*ac4d321dSXuan Hu lsInfo.s2_isDcacheFirstMiss := false.B 58*ac4d321dSXuan Hu lsInfo.s2_isForwardFail := false.B 59*ac4d321dSXuan Hu lsInfo.s3_isReplayFast := false.B 60*ac4d321dSXuan Hu lsInfo.s3_isReplaySlow := false.B 61*ac4d321dSXuan Hu lsInfo.s3_isReplayRS := false.B 62*ac4d321dSXuan Hu lsInfo.s3_isReplay := false.B 6324519898SXuan Hu lsInfo.replayCnt := 0.U 64*ac4d321dSXuan Hu lsInfo.replayCause := Seq.fill(LoadReplayCauses.allCauses)(false.B) 6524519898SXuan Hu lsInfo 6624519898SXuan Hu } 6724519898SXuan Hu} 6824519898SXuan Hu 6924519898SXuan Huclass DebugLsInfoBundle(implicit p: Parameters) extends DebugLsInfo { 7024519898SXuan Hu // unified processing at the end stage of load/store ==> s2 ==> bug that will write error robIdx data 7124519898SXuan Hu val s1_robIdx = UInt(log2Ceil(RobSize).W) 7224519898SXuan Hu val s2_robIdx = UInt(log2Ceil(RobSize).W) 73*ac4d321dSXuan Hu val s3_robIdx = UInt(log2Ceil(RobSize).W) 7424519898SXuan Hu} 7524519898SXuan Hu 7624519898SXuan Huclass DebugLSIO(implicit p: Parameters) extends XSBundle { 77e4d4d305SXuan Hu val debugLsInfo = Vec(backendParams.LduCnt + backendParams.HyuCnt + backendParams.StaCnt + backendParams.HyuCnt, Output(new DebugLsInfoBundle)) 7824519898SXuan Hu} 79870f462dSXuan Huclass LsTopdownInfo(implicit p: Parameters) extends XSBundle { 80870f462dSXuan Hu val s1 = new Bundle { 81870f462dSXuan Hu val robIdx = UInt(log2Ceil(RobSize).W) 82870f462dSXuan Hu val vaddr_valid = Bool() 83870f462dSXuan Hu val vaddr_bits = UInt(VAddrBits.W) 84870f462dSXuan Hu } 85870f462dSXuan Hu val s2 = new Bundle { 86870f462dSXuan Hu val robIdx = UInt(log2Ceil(RobSize).W) 87870f462dSXuan Hu val paddr_valid = Bool() 88870f462dSXuan Hu val paddr_bits = UInt(PAddrBits.W) 8983ba63b3SXuan Hu val cache_miss_en = Bool() 9083ba63b3SXuan Hu val first_real_miss = Bool() 91870f462dSXuan Hu } 92870f462dSXuan Hu 93870f462dSXuan Hu def s1SignalEnable(ena: LsTopdownInfo) = { 94870f462dSXuan Hu when(ena.s1.vaddr_valid) { 95870f462dSXuan Hu s1.vaddr_valid := true.B 96870f462dSXuan Hu s1.vaddr_bits := ena.s1.vaddr_bits 97870f462dSXuan Hu } 98870f462dSXuan Hu } 99870f462dSXuan Hu 100870f462dSXuan Hu def s2SignalEnable(ena: LsTopdownInfo) = { 101870f462dSXuan Hu when(ena.s2.paddr_valid) { 102870f462dSXuan Hu s2.paddr_valid := true.B 103870f462dSXuan Hu s2.paddr_bits := ena.s2.paddr_bits 104870f462dSXuan Hu } 10583ba63b3SXuan Hu when(ena.s2.cache_miss_en) { 10683ba63b3SXuan Hu s2.first_real_miss := ena.s2.first_real_miss 10783ba63b3SXuan Hu } 108870f462dSXuan Hu } 109870f462dSXuan Hu} 110870f462dSXuan Hu 111870f462dSXuan Huobject LsTopdownInfo { 112870f462dSXuan Hu def init(implicit p: Parameters): LsTopdownInfo = 0.U.asTypeOf(new LsTopdownInfo) 113870f462dSXuan Hu}