diff --git a/src/main/scala/rocket/DCache.scala b/src/main/scala/rocket/DCache.scala index 52759168..d88b7c38 100644 --- a/src/main/scala/rocket/DCache.scala +++ b/src/main/scala/rocket/DCache.scala @@ -198,15 +198,15 @@ class DCacheModule(outer: DCache) extends HellaCacheModule(outer) { val s2_lr = Bool(usingAtomics) && s2_req.cmd === M_XLR val s2_sc = Bool(usingAtomics) && s2_req.cmd === M_XSC val lrscCount = Reg(init=UInt(0)) - val lrscValid = lrscCount > 0 + val lrscValid = lrscCount > lrscBackoff val lrscAddr = Reg(UInt()) val s2_sc_fail = s2_sc && !(lrscValid && lrscAddr === (s2_req.addr >> blockOffBits)) when (s2_valid_hit && s2_lr) { lrscCount := lrscCycles - 1 lrscAddr := s2_req.addr >> blockOffBits } - when (lrscValid) { lrscCount := lrscCount - 1 } - when ((s2_valid_masked && lrscValid) || io.cpu.invalidate_lr) { lrscCount := 0 } + when (lrscCount > 0) { lrscCount := lrscCount - 1 } + when ((s2_valid_masked && lrscCount > 0) || io.cpu.invalidate_lr) { lrscCount := 0 } // pending store buffer val pstore1_cmd = RegEnable(s1_req.cmd, s1_valid_not_nacked && s1_write) diff --git a/src/main/scala/rocket/HellaCache.scala b/src/main/scala/rocket/HellaCache.scala index 6a8bfe6b..8303bbc6 100644 --- a/src/main/scala/rocket/HellaCache.scala +++ b/src/main/scala/rocket/HellaCache.scala @@ -58,6 +58,7 @@ trait HasL1HellaCacheParameters extends HasL1CacheParameters with HasCoreParamet def encDataBits = code.width(coreDataBits) def encRowBits = encDataBits*rowWords def lrscCycles = 32 // ISA requires 16-insn LRSC sequences to succeed + def lrscBackoff = 3 // disallow LRSC reacquisition briefly def nIOMSHRs = cacheParams.nMMIOs def maxUncachedInFlight = cacheParams.nMMIOs def dataScratchpadSize = cacheParams.dataScratchpadBytes diff --git a/src/main/scala/rocket/NBDcache.scala b/src/main/scala/rocket/NBDcache.scala index da35ba97..188b6ac9 100644 --- a/src/main/scala/rocket/NBDcache.scala +++ b/src/main/scala/rocket/NBDcache.scala @@ -794,18 +794,18 @@ class NonBlockingDCacheModule(outer: NonBlockingDCache) extends HellaCacheModule // load-reserved/store-conditional val lrsc_count = Reg(init=UInt(0)) - val lrsc_valid = lrsc_count.orR + val lrsc_valid = lrsc_count > lrscBackoff val lrsc_addr = Reg(UInt()) val (s2_lr, s2_sc) = (s2_req.cmd === M_XLR, s2_req.cmd === M_XSC) val s2_lrsc_addr_match = lrsc_valid && lrsc_addr === (s2_req.addr >> blockOffBits) val s2_sc_fail = s2_sc && !s2_lrsc_addr_match - when (lrsc_valid) { lrsc_count := lrsc_count - 1 } + when (lrsc_count > 0) { lrsc_count := lrsc_count - 1 } when (s2_valid_masked && s2_hit || s2_replay) { when (s2_lr) { lrsc_count := lrscCycles - 1 lrsc_addr := s2_req.addr >> blockOffBits } - when (lrsc_valid) { + when (lrsc_count > 0) { lrsc_count := 0 } }