diff --git a/src/main/scala/uncore/tilelink2/Fragmenter.scala b/src/main/scala/uncore/tilelink2/Fragmenter.scala index 43d73ab0..05e663eb 100644 --- a/src/main/scala/uncore/tilelink2/Fragmenter.scala +++ b/src/main/scala/uncore/tilelink2/Fragmenter.scala @@ -47,9 +47,10 @@ class TLFragmenter(minSize: Int, maxSize: Int, alwaysMin: Boolean = false) exten supportsPutPartial = TransferSizes.none, supportsHint = TransferSizes.none) + // Because the Fragmenter stalls inner A while serving outer, it can wipe away inner latency val node = TLAdapterNode( clientFn = { case Seq(c) => c.copy(clients = c.clients.map(mapClient)) }, - managerFn = { case Seq(m) => m.copy(managers = m.managers.map(mapManager)) }) + managerFn = { case Seq(m) => m.copy(managers = m.managers.map(mapManager), minLatency = 0) }) lazy val module = new LazyModuleImp(this) { val io = new Bundle { diff --git a/src/main/scala/uncore/tilelink2/HintHandler.scala b/src/main/scala/uncore/tilelink2/HintHandler.scala index 376f8e90..6ebef935 100644 --- a/src/main/scala/uncore/tilelink2/HintHandler.scala +++ b/src/main/scala/uncore/tilelink2/HintHandler.scala @@ -8,9 +8,10 @@ import chisel3.internal.sourceinfo.SourceInfo // Acks Hints for managers that don't support them or Acks all Hints if !passthrough class TLHintHandler(supportManagers: Boolean = true, supportClients: Boolean = false, passthrough: Boolean = true) extends LazyModule { + // HintAcks can come back combinationally => minLatency=0 val node = TLAdapterNode( - clientFn = { case Seq(c) => if (!supportClients) c else c.copy(clients = c.clients .map(_.copy(supportsHint = TransferSizes(1, c.maxTransfer)))) }, - managerFn = { case Seq(m) => if (!supportManagers) m else m.copy(managers = m.managers.map(_.copy(supportsHint = TransferSizes(1, m.maxTransfer)))) }) + clientFn = { case Seq(c) => if (!supportClients) c else c.copy(minLatency = 0, clients = c.clients .map(_.copy(supportsHint = TransferSizes(1, c.maxTransfer)))) }, + managerFn = { case Seq(m) => if (!supportManagers) m else m.copy(minLatency = 0, managers = m.managers.map(_.copy(supportsHint = TransferSizes(1, m.maxTransfer)))) }) lazy val module = new LazyModuleImp(this) { val io = new Bundle { diff --git a/src/main/scala/uncore/tilelink2/WidthWidget.scala b/src/main/scala/uncore/tilelink2/WidthWidget.scala index cd2f141a..87e66903 100644 --- a/src/main/scala/uncore/tilelink2/WidthWidget.scala +++ b/src/main/scala/uncore/tilelink2/WidthWidget.scala @@ -10,9 +10,10 @@ import scala.math.{min,max} // innBeatBytes => the new client-facing bus width class TLWidthWidget(innerBeatBytes: Int) extends LazyModule { + // Because we stall the request while sending beats, atomics can overlap => minLatency=0 val node = TLAdapterNode( - clientFn = { case Seq(c) => c }, - managerFn = { case Seq(m) => m.copy(beatBytes = innerBeatBytes) }) + clientFn = { case Seq(c) => c.copy(minLatency = 0) }, + managerFn = { case Seq(m) => m.copy(minLatency = 0, beatBytes = innerBeatBytes) }) lazy val module = new LazyModuleImp(this) { val io = new Bundle {