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