Fix uncoalesced response being dropped

Need to use fire instead of valid so that the uncoalescing /
inflighttable freeing logic happens exactly once at the fire time.

FIXME: might result in long ready chain that goes from TL-D port all the
way to the response queues.
This commit is contained in:
Hansung Kim
2024-01-18 18:50:43 -08:00
parent b1a37d0dda
commit 95dcecbe03

View File

@@ -1132,8 +1132,9 @@ class Uncoalescer(
) )
}) })
// Lookup table as soon as a coalesced response arrives // Lookup table as soon as a coalesced response fires
io.inflightLookup.ready := io.coalResp.valid // @perf: might result in long ready chain?
io.inflightLookup.ready := io.coalResp.fire
// Only accept coalesced response when all enq ports of the response queue // Only accept coalesced response when all enq ports of the response queue
// are ready. This is necessary because uncoalescing logic is a // are ready. This is necessary because uncoalescing logic is a
@@ -1180,7 +1181,7 @@ class Uncoalescer(
// dontTouch(q.io.enq(respQueueCoalPortOffset)) // dontTouch(q.io.enq(respQueueCoalPortOffset))
when(io.inflightLookup.valid && foundReq.valid) { when(io.inflightLookup.valid && foundReq.valid) {
enqIO.valid := io.coalResp.valid && foundReq.valid enqIO.valid := io.coalResp.fire && foundReq.valid
enqIO.bits.op := foundReq.op enqIO.bits.op := foundReq.op
enqIO.bits.source := foundReq.source enqIO.bits.source := foundReq.source
val logSize = foundRow.sizeEnumT.enumToLogSize(foundReq.sizeEnum) val logSize = foundRow.sizeEnumT.enumToLogSize(foundReq.sizeEnum)
@@ -1251,7 +1252,9 @@ class InFlightTable(
// //
// TODO: return actual stuff // TODO: return actual stuff
val lookup = Decoupled(entryT) val lookup = Decoupled(entryT)
// TODO: put this inside decoupledIO // this should really be a part of lookup, but since lookup only accepts
// ready, we need another port for accepting sourceId. Could maybe have a
// custom decoupledIO with ready+sourceId input. @cleanup
val lookupSourceId = Input(UInt(sourceWidth.W)) val lookupSourceId = Input(UInt(sourceWidth.W))
}) })