xref: /XiangShan/src/main/scala/xiangshan/backend/ctrlblock/LsInfo.scala (revision ac4d321d18df4775b9ddda83e77cf526a0b1ca67)
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}