xref: /XiangShan/src/main/scala/top/BusPerfMonitor.scala (revision d18dc7e61b53b654f723617cc170f418d4882344)
11a2cf152SYinan Xupackage top
21a2cf152SYinan Xu
31a2cf152SYinan Xuimport chipsalliance.rocketchip.config.Parameters
473be64b3SJiawei Linimport freechips.rocketchip.diplomacy.{AdapterNode, LazyModule, LazyModuleImp}
51a2cf152SYinan Xuimport freechips.rocketchip.tilelink._
61a2cf152SYinan Xuimport chisel3._
71a2cf152SYinan Xuimport chisel3.util._
81a2cf152SYinan Xuimport utils.{XSPerfAccumulate, XSPerfPrint}
91a2cf152SYinan Xu
1073be64b3SJiawei Linclass BusPerfMonitor()(implicit p: Parameters) extends LazyModule {
111a2cf152SYinan Xu  val node = TLAdapterNode()
1273be64b3SJiawei Lin  lazy val module = new BusPerfMonitorImp(this)
131a2cf152SYinan Xu}
141a2cf152SYinan Xu
1573be64b3SJiawei Linclass BusPerfMonitorImp(outer: BusPerfMonitor)
161a2cf152SYinan Xu  extends LazyModuleImp(outer)
171a2cf152SYinan Xu{
1873be64b3SJiawei Lin
191a2cf152SYinan Xu  outer.node.in.zip(outer.node.out).foreach{
201a2cf152SYinan Xu    case ((in, edgeIn), (out, edgeOut)) =>
211a2cf152SYinan Xu      out <> in
221a2cf152SYinan Xu  }
231a2cf152SYinan Xu
241a2cf152SYinan Xu  def PERF_CHN[T <: TLChannel](clientName: String, chn: DecoupledIO[T]) = {
251a2cf152SYinan Xu
26*d18dc7e6Swakafa    val channelName = chn.bits.channelName.replaceAll(" ", "_").replaceAll("'", "")
27*d18dc7e6Swakafa    XSPerfAccumulate(s"${clientName}_${channelName}_fire", chn.fire())
28*d18dc7e6Swakafa    XSPerfAccumulate(s"${clientName}_${channelName}_stall", chn.valid && !chn.ready)
291a2cf152SYinan Xu
301a2cf152SYinan Xu    val ops = chn.bits match {
311a2cf152SYinan Xu      case _: TLBundleA => TLMessages.a.map(_._1)
321a2cf152SYinan Xu      case _: TLBundleB => TLMessages.b.map(_._1)
331a2cf152SYinan Xu      case _: TLBundleC => TLMessages.c.map(_._1)
341a2cf152SYinan Xu      case _: TLBundleD => TLMessages.d.map(_._1)
351a2cf152SYinan Xu      case _: TLBundleE => Nil
361a2cf152SYinan Xu    }
37*d18dc7e6Swakafa
38*d18dc7e6Swakafa    for((op_raw, i) <- ops.zipWithIndex){
39*d18dc7e6Swakafa      val op = s"${op_raw}".replaceAll(" ", "_")
401a2cf152SYinan Xu      chn.bits match {
411a2cf152SYinan Xu        case a: TLBundleA =>
42*d18dc7e6Swakafa          XSPerfAccumulate(s"${clientName}_${channelName}_${op}_fire",
431a2cf152SYinan Xu            i.U === a.opcode && chn.fire()
441a2cf152SYinan Xu          )
45*d18dc7e6Swakafa          XSPerfAccumulate(s"${clientName}_${channelName}_${op}_stall",
461a2cf152SYinan Xu            i.U === a.opcode && chn.valid && !chn.ready
471a2cf152SYinan Xu          )
481a2cf152SYinan Xu        case b: TLBundleB =>
49*d18dc7e6Swakafa          XSPerfAccumulate(s"${clientName}_${channelName}_${op}_fire",
501a2cf152SYinan Xu            i.U === b.opcode && chn.fire()
511a2cf152SYinan Xu          )
52*d18dc7e6Swakafa          XSPerfAccumulate(s"${clientName}_${channelName}_${op}_stall",
531a2cf152SYinan Xu            i.U === b.opcode && chn.valid && !chn.ready
541a2cf152SYinan Xu          )
551a2cf152SYinan Xu        case c: TLBundleC =>
56*d18dc7e6Swakafa          XSPerfAccumulate(s"${clientName}_${channelName}_${op}_fire",
571a2cf152SYinan Xu            i.U === c.opcode && chn.fire()
581a2cf152SYinan Xu          )
59*d18dc7e6Swakafa          XSPerfAccumulate(s"${clientName}_${channelName}_${op}_stall",
601a2cf152SYinan Xu            i.U === c.opcode && chn.valid && !chn.ready
611a2cf152SYinan Xu          )
621a2cf152SYinan Xu        case d: TLBundleD =>
63*d18dc7e6Swakafa          XSPerfAccumulate(s"${clientName}_${channelName}_${op}_fire",
641a2cf152SYinan Xu            i.U === d.opcode && chn.fire()
651a2cf152SYinan Xu          )
66*d18dc7e6Swakafa          XSPerfAccumulate(s"${clientName}_${channelName}_${op}_stall",
671a2cf152SYinan Xu            i.U === d.opcode && chn.valid && !chn.ready
681a2cf152SYinan Xu          )
691a2cf152SYinan Xu      }
701a2cf152SYinan Xu    }
711a2cf152SYinan Xu  }
721a2cf152SYinan Xu
731f0e2dc7SJiawei Lin  for(((in, edgeIn), i) <- outer.node.in.zipWithIndex) {
741f0e2dc7SJiawei Lin    val clientName = s"${edgeIn.master.masters.head.name}_bank_$i"
751a2cf152SYinan Xu    PERF_CHN(clientName, in.a)
761a2cf152SYinan Xu    PERF_CHN(clientName, in.d)
771a2cf152SYinan Xu    if(in.params.hasBCE){
781a2cf152SYinan Xu      PERF_CHN(clientName, in.b)
791a2cf152SYinan Xu      PERF_CHN(clientName, in.c)
801a2cf152SYinan Xu      PERF_CHN(clientName, in.e)
811a2cf152SYinan Xu    }
821a2cf152SYinan Xu  }
831a2cf152SYinan Xu}
841a2cf152SYinan Xu
851a2cf152SYinan Xuobject BusPerfMonitor {
8673be64b3SJiawei Lin  def apply(enable: Boolean = false)(implicit p: Parameters) = {
8773be64b3SJiawei Lin    if(enable){
8873be64b3SJiawei Lin      val busPMU = LazyModule(new BusPerfMonitor())
891a2cf152SYinan Xu      busPMU.node
9073be64b3SJiawei Lin    } else {
9173be64b3SJiawei Lin      TLTempNode()
9273be64b3SJiawei Lin    }
931a2cf152SYinan Xu  }
941a2cf152SYinan Xu}
95