提交 967327d8 编写于 作者: L LinJiawei 提交者: William Wang

sms: prefetch to l1

上级 c65495a4
...@@ -366,12 +366,6 @@ class XSCoreImp(outer: XSCoreBase) extends LazyModuleImp(outer) ...@@ -366,12 +366,6 @@ class XSCoreImp(outer: XSCoreBase) extends LazyModuleImp(outer)
XSPerfHistogram("fastIn_count", PopCount(allFastUop1.map(_.valid)), true.B, 0, allFastUop1.length, 1) XSPerfHistogram("fastIn_count", PopCount(allFastUop1.map(_.valid)), true.B, 0, allFastUop1.length, 1)
XSPerfHistogram("wakeup_count", PopCount(rfWriteback.map(_.valid)), true.B, 0, rfWriteback.length, 1) XSPerfHistogram("wakeup_count", PopCount(rfWriteback.map(_.valid)), true.B, 0, rfWriteback.length, 1)
// l1 prefetch fuzzer, for debug only
val debug_l1PrefetchFuzzer = Module(new L1PrefetchFuzzer)
debug_l1PrefetchFuzzer.io.req <> memBlock.io.prefetch_req
debug_l1PrefetchFuzzer.io.vaddr := memBlock.io.writeback(0).bits.debug.vaddr
debug_l1PrefetchFuzzer.io.paddr := memBlock.io.writeback(0).bits.debug.paddr
ctrlBlock.perfinfo.perfEventsEu0 := exuBlocks(0).getPerf.dropRight(outer.exuBlocks(0).scheduler.numRs) ctrlBlock.perfinfo.perfEventsEu0 := exuBlocks(0).getPerf.dropRight(outer.exuBlocks(0).scheduler.numRs)
ctrlBlock.perfinfo.perfEventsEu1 := exuBlocks(1).getPerf.dropRight(outer.exuBlocks(1).scheduler.numRs) ctrlBlock.perfinfo.perfEventsEu1 := exuBlocks(1).getPerf.dropRight(outer.exuBlocks(1).scheduler.numRs)
if (!coreParams.softPTW) { if (!coreParams.softPTW) {
......
...@@ -140,6 +140,7 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer) ...@@ -140,6 +140,7 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer)
val stdExeUnits = Seq.fill(exuParameters.StuCnt)(Module(new StdExeUnit)) val stdExeUnits = Seq.fill(exuParameters.StuCnt)(Module(new StdExeUnit))
val stData = stdExeUnits.map(_.io.out) val stData = stdExeUnits.map(_.io.out)
val exeUnits = loadUnits ++ storeUnits val exeUnits = loadUnits ++ storeUnits
val l1_pf_req = Wire(Decoupled(new L1PrefetchReq()))
val prefetcherOpt: Option[BasePrefecher] = coreParams.prefetcher.map { val prefetcherOpt: Option[BasePrefecher] = coreParams.prefetcher.map {
case _: SMSParams => case _: SMSParams =>
val sms = Module(new SMSPrefetcher()) val sms = Module(new SMSPrefetcher())
...@@ -156,6 +157,12 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer) ...@@ -156,6 +157,12 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer)
outer.pf_sender_opt.get.out.head._1.l2_pf_en := RegNextN(io.csrCtrl.l2_pf_enable, 2, Some(true.B)) outer.pf_sender_opt.get.out.head._1.l2_pf_en := RegNextN(io.csrCtrl.l2_pf_enable, 2, Some(true.B))
pf.io.enable := RegNextN(io.csrCtrl.l1D_pf_enable, 2, Some(false.B)) pf.io.enable := RegNextN(io.csrCtrl.l1D_pf_enable, 2, Some(false.B))
}) })
prefetcherOpt match {
case Some(pf) => l1_pf_req <> pf.io.l1_req
case None =>
l1_pf_req.valid := false.B
l1_pf_req.bits := DontCare
}
val pf_train_on_hit = RegNextN(io.csrCtrl.l1D_pf_train_on_hit, 2, Some(true.B)) val pf_train_on_hit = RegNextN(io.csrCtrl.l1D_pf_train_on_hit, 2, Some(true.B))
loadUnits.zipWithIndex.map(x => x._1.suggestName("LoadUnit_"+x._2)) loadUnits.zipWithIndex.map(x => x._1.suggestName("LoadUnit_"+x._2))
...@@ -186,14 +193,14 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer) ...@@ -186,14 +193,14 @@ class MemBlockImp(outer: MemBlock) extends LazyModuleImp(outer)
val stOut = io.writeback.drop(exuParameters.LduCnt).dropRight(exuParameters.StuCnt) val stOut = io.writeback.drop(exuParameters.LduCnt).dropRight(exuParameters.StuCnt)
// prefetch to l1 req // prefetch to l1 req
loadUnits.map(load_unit => { loadUnits.foreach(load_unit => {
load_unit.io.prefetch_req.valid <> io.prefetch_req.valid load_unit.io.prefetch_req.valid <> l1_pf_req.valid
load_unit.io.prefetch_req.bits <> io.prefetch_req.bits load_unit.io.prefetch_req.bits <> l1_pf_req.bits
}) })
// when loadUnits(0) stage 0 is busy, hw prefetch will never use that pipeline // when loadUnits(0) stage 0 is busy, hw prefetch will never use that pipeline
loadUnits(0).io.prefetch_req.bits.confidence := 0.U loadUnits(0).io.prefetch_req.bits.confidence := 0.U
io.prefetch_req.ready := (io.prefetch_req.bits.confidence > 0.U) || l1_pf_req.ready := (l1_pf_req.bits.confidence > 0.U) ||
loadUnits.map(!_.io.ldin.valid).reduce(_ || _) loadUnits.map(!_.io.ldin.valid).reduce(_ || _)
// TODO: fast load wakeup // TODO: fast load wakeup
......
...@@ -5,12 +5,13 @@ import chisel3.util._ ...@@ -5,12 +5,13 @@ import chisel3.util._
import chipsalliance.rocketchip.config.Parameters import chipsalliance.rocketchip.config.Parameters
import xiangshan._ import xiangshan._
import xiangshan.cache.mmu.TlbRequestIO import xiangshan.cache.mmu.TlbRequestIO
import xiangshan.mem.LsPipelineBundle import xiangshan.mem.{L1PrefetchReq, LsPipelineBundle}
class PrefetcherIO()(implicit p: Parameters) extends XSBundle { class PrefetcherIO()(implicit p: Parameters) extends XSBundle {
val ld_in = Flipped(Vec(exuParameters.LduCnt, ValidIO(new LsPipelineBundle()))) val ld_in = Flipped(Vec(exuParameters.LduCnt, ValidIO(new LsPipelineBundle())))
val tlb_req = new TlbRequestIO(nRespDups = 2) val tlb_req = new TlbRequestIO(nRespDups = 2)
val pf_addr = ValidIO(UInt(PAddrBits.W)) val pf_addr = ValidIO(UInt(PAddrBits.W))
val l1_req = DecoupledIO(new L1PrefetchReq())
val enable = Input(Bool()) val enable = Input(Bool())
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册