xref: /XiangShan/src/main/scala/utils/TLDump.scala (revision 8b33cd30e0034914b58520e0dc3c0c4b1aad6a03)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
17e2801f97Slinjiaweipackage utils
18e2801f97Slinjiawei
198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
20e2801f97Slinjiaweiimport chisel3._
216a527891SBigWhiteDogimport chisel3.util._
226a527891SBigWhiteDogimport freechips.rocketchip.tilelink.TLMessages._
236a527891SBigWhiteDogimport freechips.rocketchip.tilelink.TLPermissions._
24e2801f97Slinjiaweiimport freechips.rocketchip.tilelink.{TLBundle, TLBundleA, TLBundleB, TLBundleC, TLBundleD, TLBundleE, TLChannel}
25bb2f3f51STang Haojinimport utility.XSDebug
26e2801f97Slinjiawei
276a527891SBigWhiteDogtrait HasTLDump {
28e2801f97Slinjiawei
292225d46eSJiawei Lin  implicit val p: Parameters
302225d46eSJiawei Lin
318f653805SLinJiawei  implicit class TLDump(channel: TLChannel) {
32*8b33cd30Sklin02    def dump(cond: Bool) = channel match {
338f653805SLinJiawei      case a: TLBundleA =>
34*8b33cd30Sklin02        printChannelA(a, cond)
358f653805SLinJiawei      case b: TLBundleB =>
36*8b33cd30Sklin02        printChannelB(b, cond)
378f653805SLinJiawei      case c: TLBundleC =>
38*8b33cd30Sklin02        printChannelC(c, cond)
398f653805SLinJiawei      case d: TLBundleD =>
40*8b33cd30Sklin02        printChannelD(d, cond)
418f653805SLinJiawei      case e: TLBundleE =>
42*8b33cd30Sklin02        printChannelE(e, cond)
43e2801f97Slinjiawei    }
44e2801f97Slinjiawei  }
456a527891SBigWhiteDog
46*8b33cd30Sklin02  def printChannelA(a: TLBundleA, cond: Bool): Unit = {
47*8b33cd30Sklin02    def APrintable(opStr: String, paramStr: String = ""): Printable = {
48*8b33cd30Sklin02      a.channelName + " " + opStr + " " +
49*8b33cd30Sklin02        (if (paramStr != "") paramStr else Printable.pack("param: %x", a.param)) +
50*8b33cd30Sklin02        Printable.pack(" size: %x source: %d address: %x mask: %x data: %x corrupt: %b\n",
51*8b33cd30Sklin02          a.size, a.source, a.address, a.mask, a.data, a.corrupt)
52*8b33cd30Sklin02    }
53*8b33cd30Sklin02    def ACond(opCode: UInt, param: Option[UInt] = None): Bool = {
54*8b33cd30Sklin02      // skip param compare if not passed
55*8b33cd30Sklin02      val paramComp = if (param.isDefined) a.param === param.get else true.B
56*8b33cd30Sklin02      cond && a.opcode === opCode && paramComp
576a527891SBigWhiteDog    }
586a527891SBigWhiteDog
59*8b33cd30Sklin02    XSDebug(false, ACond(PutFullData), APrintable("PutFullData"))
60*8b33cd30Sklin02    XSDebug(false, ACond(PutPartialData), APrintable("PutPartialData"))
61*8b33cd30Sklin02    XSDebug(false, ACond(ArithmeticData), APrintable("ArithmeticData"))
62*8b33cd30Sklin02    XSDebug(false, ACond(LogicalData), APrintable("LogicalData"))
63*8b33cd30Sklin02    XSDebug(false, ACond(Get), APrintable("Get"))
64*8b33cd30Sklin02    XSDebug(false, ACond(Hint), APrintable("Intent"))
65*8b33cd30Sklin02
66*8b33cd30Sklin02    XSDebug(false, ACond(AcquireBlock, Some(NtoB)), APrintable("AcquireBlock", "NtoB"))
67*8b33cd30Sklin02    XSDebug(false, ACond(AcquireBlock, Some(NtoT)), APrintable("AcquireBlock", "NtoT"))
68*8b33cd30Sklin02    XSDebug(false, ACond(AcquireBlock, Some(BtoT)), APrintable("AcquireBlock", "BtoT"))
69*8b33cd30Sklin02
70*8b33cd30Sklin02    XSDebug(false, ACond(AcquirePerm, Some(NtoB)), APrintable("AcquirePerm", "NtoB"))
71*8b33cd30Sklin02    XSDebug(false, ACond(AcquirePerm, Some(NtoT)), APrintable("AcquirePerm", "NtoT"))
72*8b33cd30Sklin02    XSDebug(false, ACond(AcquirePerm, Some(BtoT)), APrintable("AcquirePerm", "BtoT"))
736a527891SBigWhiteDog  }
746a527891SBigWhiteDog
75*8b33cd30Sklin02  def printChannelB(b: TLBundleB, cond: Bool): Unit = {
76*8b33cd30Sklin02    def BPrintable(opStr: String, paramStr: String = ""): Printable = {
77*8b33cd30Sklin02      b.channelName + " " + opStr + " " +
78*8b33cd30Sklin02        (if (paramStr != "") paramStr else Printable.pack("param: %x", b.param)) +
79*8b33cd30Sklin02        Printable.pack(" size: %x source: %d address: %x mask: %x data: %x corrupt: %b\n",
80*8b33cd30Sklin02          b.size, b.source, b.address, b.mask, b.data, b.corrupt)
81*8b33cd30Sklin02    }
82*8b33cd30Sklin02    def BCond(opCode: UInt, param: Option[UInt] = None): Bool = {
83*8b33cd30Sklin02      // skip param compare if not passed
84*8b33cd30Sklin02      val paramComp = if (param.isDefined) b.param === param.get else true.B
85*8b33cd30Sklin02      cond && b.opcode === opCode && paramComp
866a527891SBigWhiteDog    }
876a527891SBigWhiteDog
88*8b33cd30Sklin02    XSDebug(false, BCond(PutFullData), BPrintable("PutFullData"))
89*8b33cd30Sklin02    XSDebug(false, BCond(PutPartialData), BPrintable("PutPartialData"))
90*8b33cd30Sklin02    XSDebug(false, BCond(ArithmeticData), BPrintable("ArithmeticData"))
91*8b33cd30Sklin02    XSDebug(false, BCond(LogicalData), BPrintable("LogicalData"))
92*8b33cd30Sklin02    XSDebug(false, BCond(Get), BPrintable("Get"))
93*8b33cd30Sklin02    XSDebug(false, BCond(Hint), BPrintable("Intent"))
94*8b33cd30Sklin02
95*8b33cd30Sklin02    XSDebug(false, BCond(Probe, Some(toN)), BPrintable("Probe", "toN"))
96*8b33cd30Sklin02    XSDebug(false, BCond(Probe, Some(toB)), BPrintable("Probe", "toB"))
97*8b33cd30Sklin02    XSDebug(false, BCond(Probe, Some(toT)), BPrintable("Probe", "toT"))
986a527891SBigWhiteDog  }
996a527891SBigWhiteDog
100*8b33cd30Sklin02  def printChannelC(c: TLBundleC, cond: Bool): Unit = {
101*8b33cd30Sklin02    def CPrintable(opStr: String, paramStr: String = ""): Printable = {
102*8b33cd30Sklin02      c.channelName + " " + opStr + " " +
103*8b33cd30Sklin02        (if (paramStr != "") paramStr else Printable.pack("param: %x", c.param)) +
104*8b33cd30Sklin02        Printable.pack(" size: %x source: %d address: %x data: %x corrupt: %b\n",
105*8b33cd30Sklin02          c.size, c.source, c.address, c.data, c.corrupt)
106*8b33cd30Sklin02    }
107*8b33cd30Sklin02    def CCond(opCode: UInt, param: Option[UInt] = None): Bool = {
108*8b33cd30Sklin02      // skip param compare if not passed
109*8b33cd30Sklin02      val paramComp = if (param.isDefined) c.param === param.get else true.B
110*8b33cd30Sklin02      cond && c.opcode === opCode && paramComp
1116a527891SBigWhiteDog    }
1126a527891SBigWhiteDog
113*8b33cd30Sklin02    XSDebug(false, CCond(AccessAck), CPrintable("AccessAck"))
114*8b33cd30Sklin02    XSDebug(false, CCond(AccessAckData), CPrintable("AccessAckData"))
115*8b33cd30Sklin02    XSDebug(false, CCond(HintAck), CPrintable("HintAck"))
116*8b33cd30Sklin02
117*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAck, Some(TtoB)), CPrintable("ProbeAck", "TtoB"))
118*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAck, Some(TtoN)), CPrintable("ProbeAck", "TtoN"))
119*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAck, Some(BtoN)), CPrintable("ProbeAck", "BtoN"))
120*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAck, Some(TtoT)), CPrintable("ProbeAck", "TtoT"))
121*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAck, Some(BtoB)), CPrintable("ProbeAck", "BtoB"))
122*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAck, Some(NtoN)), CPrintable("ProbeAck", "NtoN"))
123*8b33cd30Sklin02
124*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAckData, Some(TtoB)), CPrintable("ProbeAckData", "TtoB"))
125*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAckData, Some(TtoN)), CPrintable("ProbeAckData", "TtoN"))
126*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAckData, Some(BtoN)), CPrintable("ProbeAckData", "BtoN"))
127*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAckData, Some(TtoT)), CPrintable("ProbeAckData", "TtoT"))
128*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAckData, Some(BtoB)), CPrintable("ProbeAckData", "BtoB"))
129*8b33cd30Sklin02    XSDebug(false, CCond(ProbeAckData, Some(NtoN)), CPrintable("ProbeAckData", "NtoN"))
130*8b33cd30Sklin02
131*8b33cd30Sklin02    XSDebug(false, CCond(Release, Some(TtoB)), CPrintable("Release", "TtoB"))
132*8b33cd30Sklin02    XSDebug(false, CCond(Release, Some(TtoN)), CPrintable("Release", "TtoN"))
133*8b33cd30Sklin02    XSDebug(false, CCond(Release, Some(BtoN)), CPrintable("Release", "BtoN"))
134*8b33cd30Sklin02    XSDebug(false, CCond(Release, Some(TtoT)), CPrintable("Release", "TtoT"))
135*8b33cd30Sklin02    XSDebug(false, CCond(Release, Some(BtoB)), CPrintable("Release", "BtoB"))
136*8b33cd30Sklin02    XSDebug(false, CCond(Release, Some(NtoN)), CPrintable("Release", "NtoN"))
137*8b33cd30Sklin02
138*8b33cd30Sklin02    XSDebug(false, CCond(ReleaseData, Some(TtoB)), CPrintable("ReleaseData", "TtoB"))
139*8b33cd30Sklin02    XSDebug(false, CCond(ReleaseData, Some(TtoN)), CPrintable("ReleaseData", "TtoN"))
140*8b33cd30Sklin02    XSDebug(false, CCond(ReleaseData, Some(BtoN)), CPrintable("ReleaseData", "BtoN"))
141*8b33cd30Sklin02    XSDebug(false, CCond(ReleaseData, Some(TtoT)), CPrintable("ReleaseData", "TtoT"))
142*8b33cd30Sklin02    XSDebug(false, CCond(ReleaseData, Some(BtoB)), CPrintable("ReleaseData", "BtoB"))
143*8b33cd30Sklin02    XSDebug(false, CCond(ReleaseData, Some(NtoN)), CPrintable("ReleaseData", "NtoN"))
1446a527891SBigWhiteDog  }
1456a527891SBigWhiteDog
146*8b33cd30Sklin02  def printChannelD(d: TLBundleD, cond: Bool): Unit = {
147*8b33cd30Sklin02    def DPrintable(opStr: String, paramStr: String = ""): Printable = {
148*8b33cd30Sklin02      d.channelName + " " + opStr + " " +
149*8b33cd30Sklin02        (if (paramStr != "") paramStr else Printable.pack("param: %x", d.param)) +
150*8b33cd30Sklin02        Printable.pack(" size: %x source: %d sink: %d denied: %b data: %x corrupt: %b\n",
151*8b33cd30Sklin02          d.size, d.source, d.sink, d.denied, d.data, d.corrupt)
1526a527891SBigWhiteDog    }
153*8b33cd30Sklin02    def DCond(opCode: UInt, param: Option[UInt] = None): Bool = {
154*8b33cd30Sklin02      // skip param compare if not passed
155*8b33cd30Sklin02      val paramComp = if (param.isDefined) d.param === param.get else true.B
156*8b33cd30Sklin02      cond && d.opcode === opCode && paramComp
1576a527891SBigWhiteDog    }
1586a527891SBigWhiteDog
159*8b33cd30Sklin02    XSDebug(false, DCond(AccessAck), DPrintable("AccessAck"))
160*8b33cd30Sklin02    XSDebug(false, DCond(AccessAckData), DPrintable("AccessAckData"))
161*8b33cd30Sklin02    XSDebug(false, DCond(HintAck), DPrintable("HintAck"))
162*8b33cd30Sklin02
163*8b33cd30Sklin02    XSDebug(false, DCond(Grant, Some(toT)), DPrintable("Grant", "toT"))
164*8b33cd30Sklin02    XSDebug(false, DCond(Grant, Some(toB)), DPrintable("Grant", "toB"))
165*8b33cd30Sklin02    XSDebug(false, DCond(Grant, Some(toN)), DPrintable("Grant", "toN"))
166*8b33cd30Sklin02
167*8b33cd30Sklin02    XSDebug(false, DCond(GrantData, Some(toT)), DPrintable("GrantData", "toT"))
168*8b33cd30Sklin02    XSDebug(false, DCond(GrantData, Some(toB)), DPrintable("GrantData", "toB"))
169*8b33cd30Sklin02    XSDebug(false, DCond(GrantData, Some(toN)), DPrintable("GrantData", "toN"))
170*8b33cd30Sklin02
171*8b33cd30Sklin02    XSDebug(false, DCond(GrantData, Some(toT)), DPrintable("GrantData", "toT"))
172*8b33cd30Sklin02    XSDebug(false, DCond(GrantData, Some(toB)), DPrintable("GrantData", "toB"))
173*8b33cd30Sklin02    XSDebug(false, DCond(GrantData, Some(toN)), DPrintable("GrantData", "toN"))
174*8b33cd30Sklin02
175*8b33cd30Sklin02    XSDebug(false, DCond(ReleaseAck), DPrintable("ReleaseAck"))
1766a527891SBigWhiteDog  }
1776a527891SBigWhiteDog
178*8b33cd30Sklin02  def printChannelE(e: TLBundleE, cond: Bool): Unit = {
179*8b33cd30Sklin02    XSDebug(false, cond, e.channelName + "GrantAck sink: %d\n", e.sink)
1806a527891SBigWhiteDog  }
1816a527891SBigWhiteDog
1828f653805SLinJiawei}
183