xref: /XiangShan/src/main/scala/top/BusPerfMonitor.scala (revision 1a2cf1521d2269374286d137546263e946c0fc7c)
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