From 47c7eacafd2eb8a02d5c7ed65a8bbaca746b2ee3 Mon Sep 17 00:00:00 2001 From: Hansung Kim Date: Mon, 8 Apr 2024 18:23:39 -0700 Subject: [PATCH] SourceGen: Handle gen and claim at the same cycle This is possible for 0-latency response on the D channel. --- src/main/scala/radiance/memory/Coalescing.scala | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/scala/radiance/memory/Coalescing.scala b/src/main/scala/radiance/memory/Coalescing.scala index 338c36c..13a01a5 100644 --- a/src/main/scala/radiance/memory/Coalescing.scala +++ b/src/main/scala/radiance/memory/Coalescing.scala @@ -344,13 +344,18 @@ class SourceGenerator[T <: Data]( io.id.valid := (if (ignoreInUse) true.B else !lowestFreeRow.valid) io.id.bits := lowestFree when(io.gen && io.id.valid /* fire */ ) { - occupancyTable(io.id.bits).valid := true.B // mark in use - if (metadata.isDefined) { - occupancyTable(io.id.bits).meta := io.meta + // handle reclaim at the same cycle, e.g. for 0-latency D channel response + when (!io.reclaim.valid || io.reclaim.bits =/= io.id.bits) { + occupancyTable(io.id.bits).valid := true.B // mark in use + if (metadata.isDefined) { + occupancyTable(io.id.bits).meta := io.meta + } } } when(io.reclaim.valid) { // @perf: would this require multiple write ports? + // NOTE: this does not seem sufficient to handle same-cycle gen-reclaimon + // its own occupancyTable(io.reclaim.bits).valid := false.B // mark freed } io.peek := {