Use PseudoLRU in BTB when possible (for powers of two)
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user