From 5681693ccc6ef8d8bc14177352acd1b39dc98959 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Mon, 31 Jul 2017 18:05:14 -0700 Subject: [PATCH] Fix a D$ ready-valid signaling regression I broke this in 66d06460fab4110b886fa7626697cbf39ace8cfd. --- src/main/scala/rocket/DCache.scala | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/scala/rocket/DCache.scala b/src/main/scala/rocket/DCache.scala index a53121c1..223fade9 100644 --- a/src/main/scala/rocket/DCache.scala +++ b/src/main/scala/rocket/DCache.scala @@ -430,11 +430,19 @@ class DCacheModule(outer: DCache) extends HellaCacheModule(outer) { } } + // Finish TileLink transaction by issuing a GrantAck + tl_out.e.valid := tl_out.d.valid && d_first && grantIsCached && canAcceptCachedGrant + tl_out.e.bits := edge.GrantAck(tl_out.d.bits) + assert(tl_out.e.fire() === (tl_out.d.fire() && d_first && grantIsCached)) + // data refill // note this ready-valid signaling ignores E-channel backpressure, which // benignly means the data RAM might occasionally be redundantly written dataArb.io.in(1).valid := tl_out.d.valid && grantIsRefill && canAcceptCachedGrant - when (grantIsRefill && !dataArb.io.in(1).ready) { tl_out.d.ready := false } + when (grantIsRefill && !dataArb.io.in(1).ready) { + tl_out.e.valid := false + tl_out.d.ready := false + } dataArb.io.in(1).bits.write := true dataArb.io.in(1).bits.addr := s2_req_block_addr | d_address_inc dataArb.io.in(1).bits.way_en := s2_victim_way @@ -463,11 +471,6 @@ class DCacheModule(outer: DCache) extends HellaCacheModule(outer) { } } - // Finish TileLink transaction by issuing a GrantAck - tl_out.e.valid := tl_out.d.valid && d_first && grantIsCached && canAcceptCachedGrant - tl_out.e.bits := edge.GrantAck(tl_out.d.bits) - when (tl_out.e.fire()) { assert(tl_out.d.fire()) } - // Handle an incoming TileLink Probe message val block_probe = releaseInFlight || grantInProgress || blockProbeAfterGrantCount > 0 || lrscValid || (s2_valid_hit && s2_lr) metaArb.io.in(6).valid := tl_out.b.valid && !block_probe