1*1a2cf152SYinan Xupackage top 2*1a2cf152SYinan Xu 3*1a2cf152SYinan Xuimport chipsalliance.rocketchip.config.Parameters 4*1a2cf152SYinan Xuimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 5*1a2cf152SYinan Xuimport freechips.rocketchip.tilelink._ 6*1a2cf152SYinan Xuimport chisel3._ 7*1a2cf152SYinan Xuimport chisel3.util._ 8*1a2cf152SYinan Xuimport utils.{XSPerfAccumulate, XSPerfPrint} 9*1a2cf152SYinan Xu 10*1a2cf152SYinan Xuclass BusPerfMonitor(enable: Boolean)(implicit p: Parameters) extends LazyModule { 11*1a2cf152SYinan Xu 12*1a2cf152SYinan Xu val node = TLAdapterNode() 13*1a2cf152SYinan Xu 14*1a2cf152SYinan Xu lazy val module = if(enable) { 15*1a2cf152SYinan Xu new BusPerfMonitorImp(this) 16*1a2cf152SYinan Xu } else new BaseBusPerfMonitorImp(this) 17*1a2cf152SYinan Xu 18*1a2cf152SYinan Xu} 19*1a2cf152SYinan Xu 20*1a2cf152SYinan Xuclass BaseBusPerfMonitorImp(outer: BusPerfMonitor) 21*1a2cf152SYinan Xu extends LazyModuleImp(outer) 22*1a2cf152SYinan Xu{ 23*1a2cf152SYinan Xu outer.node.in.zip(outer.node.out).foreach{ 24*1a2cf152SYinan Xu case ((in, edgeIn), (out, edgeOut)) => 25*1a2cf152SYinan Xu out <> in 26*1a2cf152SYinan Xu } 27*1a2cf152SYinan Xu} 28*1a2cf152SYinan Xu 29*1a2cf152SYinan Xuclass BusPerfMonitorImp(outer: BusPerfMonitor) 30*1a2cf152SYinan Xu extends BaseBusPerfMonitorImp(outer) 31*1a2cf152SYinan Xu{ 32*1a2cf152SYinan Xu 33*1a2cf152SYinan Xu def PERF_CHN[T <: TLChannel](clientName: String, chn: DecoupledIO[T]) = { 34*1a2cf152SYinan Xu 35*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} fire", chn.fire()) 36*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} stall", chn.valid && !chn.ready) 37*1a2cf152SYinan Xu 38*1a2cf152SYinan Xu val ops = chn.bits match { 39*1a2cf152SYinan Xu case _: TLBundleA => TLMessages.a.map(_._1) 40*1a2cf152SYinan Xu case _: TLBundleB => TLMessages.b.map(_._1) 41*1a2cf152SYinan Xu case _: TLBundleC => TLMessages.c.map(_._1) 42*1a2cf152SYinan Xu case _: TLBundleD => TLMessages.d.map(_._1) 43*1a2cf152SYinan Xu case _: TLBundleE => Nil 44*1a2cf152SYinan Xu } 45*1a2cf152SYinan Xu for((op, i) <- ops.zipWithIndex){ 46*1a2cf152SYinan Xu chn.bits match { 47*1a2cf152SYinan Xu case a: TLBundleA => 48*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op fire", 49*1a2cf152SYinan Xu i.U === a.opcode && chn.fire() 50*1a2cf152SYinan Xu ) 51*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op stall", 52*1a2cf152SYinan Xu i.U === a.opcode && chn.valid && !chn.ready 53*1a2cf152SYinan Xu ) 54*1a2cf152SYinan Xu case b: TLBundleB => 55*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op fire", 56*1a2cf152SYinan Xu i.U === b.opcode && chn.fire() 57*1a2cf152SYinan Xu ) 58*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op stall", 59*1a2cf152SYinan Xu i.U === b.opcode && chn.valid && !chn.ready 60*1a2cf152SYinan Xu ) 61*1a2cf152SYinan Xu case c: TLBundleC => 62*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op fire", 63*1a2cf152SYinan Xu i.U === c.opcode && chn.fire() 64*1a2cf152SYinan Xu ) 65*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op stall", 66*1a2cf152SYinan Xu i.U === c.opcode && chn.valid && !chn.ready 67*1a2cf152SYinan Xu ) 68*1a2cf152SYinan Xu case d: TLBundleD => 69*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op fire", 70*1a2cf152SYinan Xu i.U === d.opcode && chn.fire() 71*1a2cf152SYinan Xu ) 72*1a2cf152SYinan Xu XSPerfAccumulate(s"$clientName ${chn.bits.channelName} $op stall", 73*1a2cf152SYinan Xu i.U === d.opcode && chn.valid && !chn.ready 74*1a2cf152SYinan Xu ) 75*1a2cf152SYinan Xu } 76*1a2cf152SYinan Xu } 77*1a2cf152SYinan Xu } 78*1a2cf152SYinan Xu 79*1a2cf152SYinan Xu for((in, edgeIn) <- outer.node.in) { 80*1a2cf152SYinan Xu val clientName = edgeIn.master.masters.head.name 81*1a2cf152SYinan Xu PERF_CHN(clientName, in.a) 82*1a2cf152SYinan Xu PERF_CHN(clientName, in.d) 83*1a2cf152SYinan Xu if(in.params.hasBCE){ 84*1a2cf152SYinan Xu PERF_CHN(clientName, in.b) 85*1a2cf152SYinan Xu PERF_CHN(clientName, in.c) 86*1a2cf152SYinan Xu PERF_CHN(clientName, in.e) 87*1a2cf152SYinan Xu } 88*1a2cf152SYinan Xu } 89*1a2cf152SYinan Xu} 90*1a2cf152SYinan Xu 91*1a2cf152SYinan Xuobject BusPerfMonitor { 92*1a2cf152SYinan Xu def apply(enable: Boolean = false)(implicit p: Parameters): TLAdapterNode = { 93*1a2cf152SYinan Xu val busPMU = LazyModule(new BusPerfMonitor(enable)) 94*1a2cf152SYinan Xu busPMU.node 95*1a2cf152SYinan Xu } 96*1a2cf152SYinan Xu} 97