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