From 54b73aef5784f971c69143528108ebfc5516e314 Mon Sep 17 00:00:00 2001 From: "Wesley W. Terpstra" Date: Wed, 12 Oct 2016 21:11:32 -0700 Subject: [PATCH] tilelink2: WidthWidget and Fragmenter no longer erase latency --- src/main/scala/uncore/tilelink2/Buffer.scala | 6 +++--- src/main/scala/uncore/tilelink2/Fragmenter.scala | 3 +-- src/main/scala/uncore/tilelink2/WidthWidget.scala | 5 ++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/scala/uncore/tilelink2/Buffer.scala b/src/main/scala/uncore/tilelink2/Buffer.scala index 659cf6dd..3ca2dec0 100644 --- a/src/main/scala/uncore/tilelink2/Buffer.scala +++ b/src/main/scala/uncore/tilelink2/Buffer.scala @@ -5,7 +5,7 @@ package uncore.tilelink2 import Chisel._ import chisel3.internal.sourceinfo.SourceInfo import diplomacy._ -import scala.math.max +import scala.math.{min,max} // pipe is only used if a queue has depth = 1 class TLBuffer(a: Int = 2, b: Int = 2, c: Int = 2, d: Int = 2, e: Int = 2, pipe: Boolean = true) extends LazyModule @@ -17,8 +17,8 @@ class TLBuffer(a: Int = 2, b: Int = 2, c: Int = 2, d: Int = 2, e: Int = 2, pipe: require (e >= 0) val node = TLAdapterNode( - clientFn = { seq => seq(0).copy(minLatency = seq(0).minLatency + max(1,b) + max(1,c)) }, - managerFn = { seq => seq(0).copy(minLatency = seq(0).minLatency + max(1,a) + max(1,d)) }) + clientFn = { seq => seq(0).copy(minLatency = seq(0).minLatency + min(1,b) + min(1,c)) }, + managerFn = { seq => seq(0).copy(minLatency = seq(0).minLatency + min(1,a) + min(1,d)) }) lazy val module = new LazyModuleImp(this) { val io = new Bundle { diff --git a/src/main/scala/uncore/tilelink2/Fragmenter.scala b/src/main/scala/uncore/tilelink2/Fragmenter.scala index a98321b1..10df7da8 100644 --- a/src/main/scala/uncore/tilelink2/Fragmenter.scala +++ b/src/main/scala/uncore/tilelink2/Fragmenter.scala @@ -39,10 +39,9 @@ class TLFragmenter(minSize: Int, maxSize: Int, alwaysMin: Boolean = false) exten def mapClient(c: TLClientParameters) = c.copy( sourceId = IdRange(c.sourceId.start << fragmentBits, c.sourceId.end << fragmentBits)) - // 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), minLatency = 0) }) + managerFn = { case Seq(m) => m.copy(managers = m.managers.map(mapManager)) }) 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 32dc793b..bfbf9eb4 100644 --- a/src/main/scala/uncore/tilelink2/WidthWidget.scala +++ b/src/main/scala/uncore/tilelink2/WidthWidget.scala @@ -10,10 +10,9 @@ 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.copy(minLatency = 0) }, - managerFn = { case Seq(m) => m.copy(minLatency = 0, beatBytes = innerBeatBytes) }) + clientFn = { case Seq(c) => c }, + managerFn = { case Seq(m) => m.copy(beatBytes = innerBeatBytes) }) lazy val module = new LazyModuleImp(this) { val io = new Bundle {