xref: /XiangShan/src/main/scala/top/BusPerfMonitor.scala (revision 73be64b3fc882a759f70d0852ba42d09c2a44af6)
11a2cf152SYinan Xupackage top
21a2cf152SYinan Xu
31a2cf152SYinan Xuimport chipsalliance.rocketchip.config.Parameters
4*73be64b3SJiawei 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
10*73be64b3SJiawei Linclass BusPerfMonitor()(implicit p: Parameters) extends LazyModule {
111a2cf152SYinan Xu  val node = TLAdapterNode()
12*73be64b3SJiawei Lin  lazy val module = new BusPerfMonitorImp(this)
131a2cf152SYinan Xu}
141a2cf152SYinan Xu
15*73be64b3SJiawei Linclass BusPerfMonitorImp(outer: BusPerfMonitor)
161a2cf152SYinan Xu  extends LazyModuleImp(outer)
171a2cf152SYinan Xu{
18*73be64b3SJiawei 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
261a2cf152SYinan Xu    XSPerfAccumulate(s"$clientName ${chn.bits.channelName} fire", chn.fire())
271a2cf152SYinan Xu    XSPerfAccumulate(s"$clientName ${chn.bits.channelName} stall", chn.valid && !chn.ready)
281a2cf152SYinan Xu
291a2cf152SYinan Xu    val ops = chn.bits match {
301a2cf152SYinan Xu      case _: TLBundleA => TLMessages.a.map(_._1)
311a2cf152SYinan Xu      case _: TLBundleB => TLMessages.b.map(_._1)
321a2cf152SYinan Xu      case _: TLBundleC => TLMessages.c.map(_._1)
331a2cf152SYinan Xu      case _: TLBundleD => TLMessages.d.map(_._1)
341a2cf152SYinan Xu      case _: TLBundleE => Nil
351a2cf152SYinan Xu    }
361a2cf152SYinan Xu    for((op, i) <- ops.zipWithIndex){
371a2cf152SYinan Xu      chn.bits match {
381a2cf152SYinan Xu        case a: TLBundleA =>
391a2cf152SYinan Xu          XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op fire",
401a2cf152SYinan Xu            i.U === a.opcode && chn.fire()
411a2cf152SYinan Xu          )
421a2cf152SYinan Xu          XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op stall",
431a2cf152SYinan Xu            i.U === a.opcode && chn.valid && !chn.ready
441a2cf152SYinan Xu          )
451a2cf152SYinan Xu        case b: TLBundleB =>
461a2cf152SYinan Xu          XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op fire",
471a2cf152SYinan Xu            i.U === b.opcode && chn.fire()
481a2cf152SYinan Xu          )
491a2cf152SYinan Xu          XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op stall",
501a2cf152SYinan Xu            i.U === b.opcode && chn.valid && !chn.ready
511a2cf152SYinan Xu          )
521a2cf152SYinan Xu        case c: TLBundleC =>
531a2cf152SYinan Xu          XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op fire",
541a2cf152SYinan Xu            i.U === c.opcode && chn.fire()
551a2cf152SYinan Xu          )
561a2cf152SYinan Xu          XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op stall",
571a2cf152SYinan Xu            i.U === c.opcode && chn.valid && !chn.ready
581a2cf152SYinan Xu          )
591a2cf152SYinan Xu        case d: TLBundleD =>
601a2cf152SYinan Xu          XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op fire",
611a2cf152SYinan Xu            i.U === d.opcode && chn.fire()
621a2cf152SYinan Xu          )
631a2cf152SYinan Xu          XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op stall",
641a2cf152SYinan Xu            i.U === d.opcode && chn.valid && !chn.ready
651a2cf152SYinan Xu          )
661a2cf152SYinan Xu      }
671a2cf152SYinan Xu    }
681a2cf152SYinan Xu  }
691a2cf152SYinan Xu
701f0e2dc7SJiawei Lin  for(((in, edgeIn), i) <- outer.node.in.zipWithIndex) {
711f0e2dc7SJiawei Lin    val clientName = s"${edgeIn.master.masters.head.name}_bank_$i"
721a2cf152SYinan Xu    PERF_CHN(clientName, in.a)
731a2cf152SYinan Xu    PERF_CHN(clientName, in.d)
741a2cf152SYinan Xu    if(in.params.hasBCE){
751a2cf152SYinan Xu      PERF_CHN(clientName, in.b)
761a2cf152SYinan Xu      PERF_CHN(clientName, in.c)
771a2cf152SYinan Xu      PERF_CHN(clientName, in.e)
781a2cf152SYinan Xu    }
791a2cf152SYinan Xu  }
801a2cf152SYinan Xu}
811a2cf152SYinan Xu
821a2cf152SYinan Xuobject BusPerfMonitor {
83*73be64b3SJiawei Lin  def apply(enable: Boolean = false)(implicit p: Parameters) = {
84*73be64b3SJiawei Lin    if(enable){
85*73be64b3SJiawei Lin      val busPMU = LazyModule(new BusPerfMonitor())
861a2cf152SYinan Xu      busPMU.node
87*73be64b3SJiawei Lin    } else {
88*73be64b3SJiawei Lin      TLTempNode()
89*73be64b3SJiawei Lin    }
901a2cf152SYinan Xu  }
911a2cf152SYinan Xu}
92