tilelink2: WidthWidget and Fragmenter no longer erase latency
This commit is contained in:
parent
200cf3dd13
commit
54b73aef57
@ -5,7 +5,7 @@ package uncore.tilelink2
|
|||||||
import Chisel._
|
import Chisel._
|
||||||
import chisel3.internal.sourceinfo.SourceInfo
|
import chisel3.internal.sourceinfo.SourceInfo
|
||||||
import diplomacy._
|
import diplomacy._
|
||||||
import scala.math.max
|
import scala.math.{min,max}
|
||||||
|
|
||||||
// pipe is only used if a queue has depth = 1
|
// 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
|
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)
|
require (e >= 0)
|
||||||
|
|
||||||
val node = TLAdapterNode(
|
val node = TLAdapterNode(
|
||||||
clientFn = { seq => seq(0).copy(minLatency = seq(0).minLatency + max(1,b) + max(1,c)) },
|
clientFn = { seq => seq(0).copy(minLatency = seq(0).minLatency + min(1,b) + min(1,c)) },
|
||||||
managerFn = { seq => seq(0).copy(minLatency = seq(0).minLatency + max(1,a) + max(1,d)) })
|
managerFn = { seq => seq(0).copy(minLatency = seq(0).minLatency + min(1,a) + min(1,d)) })
|
||||||
|
|
||||||
lazy val module = new LazyModuleImp(this) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
|
@ -39,10 +39,9 @@ class TLFragmenter(minSize: Int, maxSize: Int, alwaysMin: Boolean = false) exten
|
|||||||
def mapClient(c: TLClientParameters) = c.copy(
|
def mapClient(c: TLClientParameters) = c.copy(
|
||||||
sourceId = IdRange(c.sourceId.start << fragmentBits, c.sourceId.end << fragmentBits))
|
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(
|
val node = TLAdapterNode(
|
||||||
clientFn = { case Seq(c) => c.copy(clients = c.clients.map(mapClient)) },
|
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) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
|
@ -10,10 +10,9 @@ import scala.math.{min,max}
|
|||||||
// innBeatBytes => the new client-facing bus width
|
// innBeatBytes => the new client-facing bus width
|
||||||
class TLWidthWidget(innerBeatBytes: Int) extends LazyModule
|
class TLWidthWidget(innerBeatBytes: Int) extends LazyModule
|
||||||
{
|
{
|
||||||
// Because we stall the request while sending beats, atomics can overlap => minLatency=0
|
|
||||||
val node = TLAdapterNode(
|
val node = TLAdapterNode(
|
||||||
clientFn = { case Seq(c) => c.copy(minLatency = 0) },
|
clientFn = { case Seq(c) => c },
|
||||||
managerFn = { case Seq(m) => m.copy(minLatency = 0, beatBytes = innerBeatBytes) })
|
managerFn = { case Seq(m) => m.copy(beatBytes = innerBeatBytes) })
|
||||||
|
|
||||||
lazy val module = new LazyModuleImp(this) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
|
Loading…
Reference in New Issue
Block a user