diff --git a/src/main/scala/tilelink/SourceShrinker.scala b/src/main/scala/tilelink/SourceShrinker.scala index 50f92dbb6b..f4a90dc6e5 100644 --- a/src/main/scala/tilelink/SourceShrinker.scala +++ b/src/main/scala/tilelink/SourceShrinker.scala @@ -11,19 +11,21 @@ import scala.math.{min,max} class TLSourceShrinker(maxInFlight: Int)(implicit p: Parameters) extends LazyModule { require (maxInFlight > 0) + private def noShrinkRequired(client: TLClientPortParameters) = maxInFlight >= client.endSourceId // The SourceShrinker completely destroys all FIFO property guarantees private val client = TLMasterParameters.v1( name = "TLSourceShrinker", sourceId = IdRange(0, maxInFlight)) val node = TLAdapterNode( - // We erase all client information since we crush the source Ids - clientFn = { cp => TLMasterPortParameters.v1( - clients = Seq(client.v1copy(requestFifo = cp.clients.exists(_.requestFifo))), - echoFields = cp.echoFields, - requestFields = cp.requestFields, - responseKeys = cp.responseKeys - )}, + clientFn = { cp => if (noShrinkRequired(cp)) { cp } else { + // We erase all client information since we crush the source Ids + TLMasterPortParameters.v1( + clients = Seq(client.v1copy(requestFifo = cp.clients.exists(_.requestFifo))), + echoFields = cp.echoFields, + requestFields = cp.requestFields, + responseKeys = cp.responseKeys) + } }, managerFn = { mp => mp.v1copy(managers = mp.managers.map(m => m.v1copy(fifoId = if (maxInFlight==1) Some(0) else m.fifoId))) }) lazy val module = new LazyModuleImp(this) { @@ -39,7 +41,7 @@ class TLSourceShrinker(maxInFlight: Int)(implicit p: Parameters) extends LazyMod in.c.ready := Bool(true) in.e.ready := Bool(true) - if (maxInFlight >= edgeIn.client.endSourceId) { + if (noShrinkRequired(edgeIn.client)) { out.a <> in.a in.d <> out.d } else { diff --git a/src/main/scala/tilelink/Xbar.scala b/src/main/scala/tilelink/Xbar.scala index 14acfb3e8d..916bff599c 100644 --- a/src/main/scala/tilelink/Xbar.scala +++ b/src/main/scala/tilelink/Xbar.scala @@ -54,7 +54,7 @@ class TLXbar(policy: TLArbiter.Policy = TLArbiter.roundRobin)(implicit p: Parame endSinkId = TLXbar.mapOutputIds(seq).map(_.end).max, managers = seq.flatMap { port => require (port.beatBytes == seq(0).beatBytes, - s"Xbar data widths don't match: ${port.managers.map(_.name)} has ${port.beatBytes}B vs ${seq(0).managers.map(_.name)} has ${seq(0).beatBytes}B") + s"Xbar ($name with parent $parent) data widths don't match: ${port.managers.map(_.name)} has ${port.beatBytes}B vs ${seq(0).managers.map(_.name)} has ${seq(0).beatBytes}B") val fifoIdMapper = fifoIdFactory() port.managers map { manager => manager.v1copy( fifoId = manager.fifoId.map(fifoIdMapper(_)) @@ -66,7 +66,7 @@ class TLXbar(policy: TLArbiter.Policy = TLArbiter.roundRobin)(implicit p: Parame lazy val module = new LazyModuleImp(this) { if ((node.in.size * node.out.size) > (8*32)) { println (s"!!! WARNING !!!") - println (s" Your TLXbar ($name) is very large, with ${node.in.size} Masters and ${node.out.size} Slaves.") + println (s" Your TLXbar ($name with parent $parent) is very large, with ${node.in.size} Masters and ${node.out.size} Slaves.") println (s"!!! WARNING !!!") }