From 88440ebf89625bab300c5a2a02aba6a14723470e Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Mon, 12 Sep 2016 16:52:03 -0700 Subject: [PATCH] Use PseudoLRU in BTB when possible (for powers of two) --- src/main/scala/rocket/btb.scala | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/scala/rocket/btb.scala b/src/main/scala/rocket/btb.scala index 2f305850..26e805d3 100644 --- a/src/main/scala/rocket/btb.scala +++ b/src/main/scala/rocket/btb.scala @@ -7,6 +7,7 @@ import junctions._ import cde.{Parameters, Field} import Util._ import uncore.util._ +import uncore.agents.PseudoLRU case object BtbKey extends Field[BtbParameters] @@ -180,7 +181,16 @@ class BTB(implicit p: Parameters) extends BtbModule { val updateHits = tagMatch(r_btb_update.bits.pc, updatePageHit) val updateHit = if (updatesOutOfOrder) updateHits.orR else r_btb_update.bits.prediction.valid val updateHitAddr = if (updatesOutOfOrder) OHToUInt(updateHits) else r_btb_update.bits.prediction.bits.entry - val nextRepl = Counter(r_btb_update.valid && !updateHit, entries)._1 + + // we'd prefer PseudoLRU replacement, but it only works for powers of 2 + val nextRepl = + if (!isPow2(entries)) { + Counter(r_btb_update.valid && !updateHit, entries)._1 + } else { + val plru = new PseudoLRU(entries) + when (hits.orR) { plru.access(OHToUInt(hits)) } + plru.replace + } val useUpdatePageHit = updatePageHit.orR val usePageHit = pageHit.orR