Fix matchingSources logic when all lanes are invalid
When all lanes are invalid so that arb.io.valid is 0, we should not deassert d_ready.
This commit is contained in:
@@ -216,7 +216,7 @@ class VortexTile private (
|
|||||||
// Conditionally instantiate memory coalescer
|
// Conditionally instantiate memory coalescer
|
||||||
val coalescerNode = p(CoalescerKey) match {
|
val coalescerNode = p(CoalescerKey) match {
|
||||||
case Some(coalescerParam) => {
|
case Some(coalescerParam) => {
|
||||||
val coal = LazyModule(new CoalescingUnit(coalescerParam))
|
val coal = LazyModule(new CoalescingUnit(coalescerParam.copy(enable = false)))
|
||||||
coal.cpuNode :=* dmemAggregateNode
|
coal.cpuNode :=* dmemAggregateNode
|
||||||
coal.aggregateNode // N+1 lanes
|
coal.aggregateNode // N+1 lanes
|
||||||
}
|
}
|
||||||
@@ -406,7 +406,12 @@ class VortexTileModuleImp(outer: VortexTile) extends BaseTileModuleImp(outer) {
|
|||||||
}
|
}
|
||||||
val matchingSources = Wire(UInt(outer.numLanes.W))
|
val matchingSources = Wire(UInt(outer.numLanes.W))
|
||||||
matchingSources := dmemTLBundles
|
matchingSources := dmemTLBundles
|
||||||
.map(b => (b.d.bits.source === arb.io.out.bits) && arb.io.out.valid)
|
.map(b =>
|
||||||
|
// If there is no valid response across all lanes, matchingSources
|
||||||
|
// should always be 1, or otherwise downstream would think upstream
|
||||||
|
// is blocked and re-try sending
|
||||||
|
!arb.io.out.valid
|
||||||
|
|| (b.d.bits.source === arb.io.out.bits))
|
||||||
.asUInt
|
.asUInt
|
||||||
|
|
||||||
// connection: VortexBundle <--> VortexTLAdapter <--> dmemNodes
|
// connection: VortexBundle <--> VortexTLAdapter <--> dmemNodes
|
||||||
@@ -438,6 +443,11 @@ class VortexTileModuleImp(outer: VortexTile) extends BaseTileModuleImp(outer) {
|
|||||||
tlAdapter.io.outResp.valid := tlBundle.d.valid && matchingSources(i)
|
tlAdapter.io.outResp.valid := tlBundle.d.valid && matchingSources(i)
|
||||||
tlBundle.d.ready := tlAdapter.io.outResp.ready && matchingSources(i)
|
tlBundle.d.ready := tlAdapter.io.outResp.ready && matchingSources(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
outer.dmemAggregateNode.out.foreach { bo =>
|
||||||
|
dontTouch(bo._1.a)
|
||||||
|
dontTouch(bo._1.d)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: generalize for useVxCache
|
// TODO: generalize for useVxCache
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ case class CoalescerConfig(
|
|||||||
object DefaultCoalescerConfig extends CoalescerConfig(
|
object DefaultCoalescerConfig extends CoalescerConfig(
|
||||||
enable = true,
|
enable = true,
|
||||||
numLanes = 4,
|
numLanes = 4,
|
||||||
queueDepth = 1,
|
queueDepth = 1, // 1-deep request queues
|
||||||
waitTimeout = 8,
|
waitTimeout = 8,
|
||||||
addressWidth = 24,
|
addressWidth = 24,
|
||||||
dataBusWidth = 4, // if "4": 2^4=16 bytes, 128 bit bus
|
dataBusWidth = 4, // if "4": 2^4=16 bytes, 128 bit bus
|
||||||
|
|||||||
Reference in New Issue
Block a user