| @@ -11,7 +11,7 @@ import freechips.rocketchip.tile.HasCoreParameters | |||||||
| import freechips.rocketchip.util._ | import freechips.rocketchip.util._ | ||||||
|  |  | ||||||
| case class BTBParams( | case class BTBParams( | ||||||
|   nEntries: Int = 32, |   nEntries: Int = 30, | ||||||
|   nMatchBits: Int = 14, |   nMatchBits: Int = 14, | ||||||
|   nPages: Int = 6, |   nPages: Int = 6, | ||||||
|   nRAS: Int = 6, |   nRAS: Int = 6, | ||||||
| @@ -24,7 +24,6 @@ trait HasBtbParameters extends HasCoreParameters { | |||||||
|   val entries = btbParams.nEntries |   val entries = btbParams.nEntries | ||||||
|   val updatesOutOfOrder = btbParams.updatesOutOfOrder |   val updatesOutOfOrder = btbParams.updatesOutOfOrder | ||||||
|   val nPages = (btbParams.nPages + 1) / 2 * 2 // control logic assumes 2 divides pages |   val nPages = (btbParams.nPages + 1) / 2 * 2 // control logic assumes 2 divides pages | ||||||
|   val opaqueBits = log2Up(entries) |  | ||||||
| } | } | ||||||
|  |  | ||||||
| abstract class BtbModule(implicit val p: Parameters) extends Module with HasBtbParameters | abstract class BtbModule(implicit val p: Parameters) extends Module with HasBtbParameters | ||||||
| @@ -141,7 +140,7 @@ class BTBResp(implicit p: Parameters) extends BtbBundle()(p) { | |||||||
|   val mask = Bits(width = fetchWidth) |   val mask = Bits(width = fetchWidth) | ||||||
|   val bridx = Bits(width = log2Up(fetchWidth)) |   val bridx = Bits(width = log2Up(fetchWidth)) | ||||||
|   val target = UInt(width = vaddrBits) |   val target = UInt(width = vaddrBits) | ||||||
|   val entry = UInt(width = opaqueBits) |   val entry = UInt(width = log2Up(entries + 1)) | ||||||
|   val bht = new BHTResp |   val bht = new BHTResp | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -196,7 +195,7 @@ class BTB(implicit p: Parameters) extends BtbModule { | |||||||
|     if (updatesOutOfOrder) { |     if (updatesOutOfOrder) { | ||||||
|       val updateHits = (pageHit << 1)(Mux1H(idxMatch(r_btb_update.bits.pc), idxPages)) |       val updateHits = (pageHit << 1)(Mux1H(idxMatch(r_btb_update.bits.pc), idxPages)) | ||||||
|       (updateHits.orR, OHToUInt(updateHits)) |       (updateHits.orR, OHToUInt(updateHits)) | ||||||
|     } else (r_btb_update.bits.prediction.valid, r_btb_update.bits.prediction.bits.entry) |     } else (r_btb_update.bits.prediction.valid && r_btb_update.bits.prediction.bits.entry < entries, r_btb_update.bits.prediction.bits.entry) | ||||||
|  |  | ||||||
|   val useUpdatePageHit = updatePageHit.orR |   val useUpdatePageHit = updatePageHit.orR | ||||||
|   val usePageHit = pageHit.orR |   val usePageHit = pageHit.orR | ||||||
|   | |||||||
| @@ -259,6 +259,7 @@ class FrontendModule(outer: Frontend) extends LazyModuleImp(outer) | |||||||
|         when (taken) { |         when (taken) { | ||||||
|           fq.io.enq.bits.btb.valid := true |           fq.io.enq.bits.btb.valid := true | ||||||
|           fq.io.enq.bits.btb.bits.taken := true |           fq.io.enq.bits.btb.bits.taken := true | ||||||
|  |           fq.io.enq.bits.btb.bits.entry := UInt(tileParams.btb.get.nEntries) | ||||||
|           s2_redirect := true |           s2_redirect := true | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|   | |||||||
| @@ -136,7 +136,13 @@ class PTW(n: Int)(implicit edge: TLEdgeOut, p: Parameters) extends CoreModule()( | |||||||
|   val l2_refill = RegNext(false.B) |   val l2_refill = RegNext(false.B) | ||||||
|   io.dpath.perf.l2miss := false |   io.dpath.perf.l2miss := false | ||||||
|   val (l2_hit, l2_pte) = if (coreParams.nL2TLBEntries == 0) (false.B, Wire(new PTE)) else { |   val (l2_hit, l2_pte) = if (coreParams.nL2TLBEntries == 0) (false.B, Wire(new PTE)) else { | ||||||
|  |     val code = new ParityCode | ||||||
|  |     require(isPow2(coreParams.nL2TLBEntries)) | ||||||
|  |     val idxBits = log2Ceil(coreParams.nL2TLBEntries) | ||||||
|  |     val tagBits = vpnBits - idxBits | ||||||
|  |  | ||||||
|     class Entry extends Bundle { |     class Entry extends Bundle { | ||||||
|  |       val tag = UInt(width = tagBits) | ||||||
|       val ppn = UInt(width = ppnBits) |       val ppn = UInt(width = ppnBits) | ||||||
|       val d = Bool() |       val d = Bool() | ||||||
|       val a = Bool() |       val a = Bool() | ||||||
| @@ -144,20 +150,19 @@ class PTW(n: Int)(implicit edge: TLEdgeOut, p: Parameters) extends CoreModule()( | |||||||
|       val x = Bool() |       val x = Bool() | ||||||
|       val w = Bool() |       val w = Bool() | ||||||
|       val r = Bool() |       val r = Bool() | ||||||
|  |  | ||||||
|  |       override def cloneType = new Entry().asInstanceOf[this.type] | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     val code = new ParityCode |     val ram = SeqMem(coreParams.nL2TLBEntries, UInt(width = code.width(new Entry().getWidth))) | ||||||
|     require(isPow2(coreParams.nL2TLBEntries)) |  | ||||||
|     val idxBits = log2Ceil(coreParams.nL2TLBEntries) |  | ||||||
|     val tagBits = vpnBits - idxBits |  | ||||||
|     val ram = SeqMem(coreParams.nL2TLBEntries, UInt(width = code.width(new Entry().getWidth + tagBits))) |  | ||||||
|     val g = Reg(UInt(width = coreParams.nL2TLBEntries)) |     val g = Reg(UInt(width = coreParams.nL2TLBEntries)) | ||||||
|     val valid = RegInit(UInt(0, coreParams.nL2TLBEntries)) |     val valid = RegInit(UInt(0, coreParams.nL2TLBEntries)) | ||||||
|     val (r_tag, r_idx) = Split(r_req.addr, idxBits) |     val (r_tag, r_idx) = Split(r_req.addr, idxBits) | ||||||
|     when (l2_refill) { |     when (l2_refill) { | ||||||
|       val entry = Wire(new Entry) |       val entry = Wire(new Entry) | ||||||
|       entry := r_pte |       entry := r_pte | ||||||
|       ram.write(r_idx, code.encode(Cat(entry.asUInt, r_tag))) |       entry.tag := r_tag | ||||||
|  |       ram.write(r_idx, code.encode(entry.asUInt)) | ||||||
|  |  | ||||||
|       val mask = UIntToOH(r_idx) |       val mask = UIntToOH(r_idx) | ||||||
|       valid := valid | mask |       valid := valid | mask | ||||||
| @@ -176,11 +181,11 @@ class PTW(n: Int)(implicit edge: TLEdgeOut, p: Parameters) extends CoreModule()( | |||||||
|     val s2_rdata = code.decode(RegEnable(s1_rdata, s1_valid)) |     val s2_rdata = code.decode(RegEnable(s1_rdata, s1_valid)) | ||||||
|     when (s2_valid && s2_rdata.error) { valid := 0.U } |     when (s2_valid && s2_rdata.error) { valid := 0.U } | ||||||
|  |  | ||||||
|     val (s2_entry, s2_tag) = Split(s2_rdata.uncorrected, tagBits) |     val s2_entry = s2_rdata.uncorrected.asTypeOf(new Entry) | ||||||
|     val s2_hit = s2_valid && !s2_rdata.error && r_tag === s2_tag |     val s2_hit = s2_valid && !s2_rdata.error && r_tag === s2_entry.tag | ||||||
|     io.dpath.perf.l2miss := s2_valid && !(r_tag === s2_tag) |     io.dpath.perf.l2miss := s2_valid && !(r_tag === s2_entry.tag) | ||||||
|     val s2_pte = Wire(new PTE) |     val s2_pte = Wire(new PTE) | ||||||
|     s2_pte := s2_entry.asTypeOf(new Entry) |     s2_pte := s2_entry | ||||||
|     s2_pte.g := g(r_idx) |     s2_pte.g := g(r_idx) | ||||||
|     s2_pte.v := true |     s2_pte.v := true | ||||||
|  |  | ||||||
| @@ -261,6 +266,7 @@ class PTW(n: Int)(implicit edge: TLEdgeOut, p: Parameters) extends CoreModule()( | |||||||
|     resp_valid(r_req_dest) := true |     resp_valid(r_req_dest) := true | ||||||
|     resp_ae := false |     resp_ae := false | ||||||
|     r_pte := l2_pte |     r_pte := l2_pte | ||||||
|  |     count := pgLevels-1 | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user