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