xref: /XiangShan/src/main/scala/xiangshan/cache/mmu/L2TlbPrefetch.scala (revision 9feb8e87b9aadf4986597036dcf36d34a2762141)
1bc063562SLemover/***************************************************************************************
2bc063562SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3bc063562SLemover* Copyright (c) 2020-2021 Peng Cheng Laboratory
4bc063562SLemover*
5bc063562SLemover* XiangShan is licensed under Mulan PSL v2.
6bc063562SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7bc063562SLemover* You may obtain a copy of Mulan PSL v2 at:
8bc063562SLemover*          http://license.coscl.org.cn/MulanPSL2
9bc063562SLemover*
10bc063562SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11bc063562SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12bc063562SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13bc063562SLemover*
14bc063562SLemover* See the Mulan PSL v2 for more details.
15bc063562SLemover***************************************************************************************/
16bc063562SLemoverpackage xiangshan.cache.mmu
17bc063562SLemover
18bc063562SLemoverimport chisel3._
19bc063562SLemoverimport chisel3.util._
208891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
21bc063562SLemoverimport xiangshan.{SfenceBundle, XSModule}
22bc063562SLemoverimport utils._
233c02ee8fSwakafaimport utility._
24bc063562SLemover
2545f497a4Shappy-lxclass L2TlbPrefetchIO(implicit p: Parameters) extends MMUIOBaseBundle with HasPtwConst {
26bc063562SLemover  val in = Flipped(ValidIO(new Bundle {
27bc063562SLemover    val vpn = UInt(vpnLen.W)
28bc063562SLemover  }))
296967f5d5Speixiaokun  val out = DecoupledIO(new L2TlbWithHptwIdBundle)
30bc063562SLemover}
31bc063562SLemover
32bc063562SLemoverclass L2TlbPrefetch(implicit p: Parameters) extends XSModule with HasPtwConst {
33bc063562SLemover  val io = IO(new L2TlbPrefetchIO())
34bc063562SLemover
357797f035SbugGenerator  val OldRecordSize = 4
367797f035SbugGenerator  val old_reqs = Reg(Vec(OldRecordSize, UInt(vpnLen.W)))
375afdf73cSHaoyuan Feng  val old_v = RegInit(VecInit(Seq.fill(OldRecordSize)(false.B)))
387797f035SbugGenerator  val old_index = RegInit(0.U(log2Ceil(OldRecordSize).W))
397797f035SbugGenerator
407797f035SbugGenerator  def already_have(vpn: UInt): Bool = {
417797f035SbugGenerator    Cat(old_reqs.zip(old_v).map{ case (o,v) => dup(o,vpn) && v}).orR
427797f035SbugGenerator  }
437797f035SbugGenerator
44*9feb8e87SHaoyuan Feng  val flush = io.sfence.valid || io.csr.satp.changed || io.csr.vsatp.changed || io.csr.hgatp.changed
457797f035SbugGenerator  val next_line = get_next_line(io.in.bits.vpn)
467797f035SbugGenerator  val next_req = RegEnable(next_line, io.in.valid)
477797f035SbugGenerator  val input_valid = io.in.valid && !flush && !already_have(next_line)
48935edac4STang Haojin  val v = ValidHold(input_valid, io.out.fire, flush)
49eb4bf3f2Speixiaokun  val s2xlate = Wire(UInt(2.W))
50eb4bf3f2Speixiaokun  s2xlate := MuxCase(noS2xlate, Seq(
51eb4bf3f2Speixiaokun    (io.csr.priv.virt && io.csr.vsatp.mode =/= 0.U && io.csr.hgatp.mode =/= 0.U) -> allStage,
52eb4bf3f2Speixiaokun    (io.csr.priv.virt && io.csr.vsatp.mode =/= 0.U) -> onlyStage1,
53eb4bf3f2Speixiaokun    (io.csr.priv.virt && io.csr.hgatp.mode =/= 0.U) -> onlyStage2
54eb4bf3f2Speixiaokun  ))
55bc063562SLemover  io.out.valid := v
566967f5d5Speixiaokun  io.out.bits.req_info.vpn := next_req
576967f5d5Speixiaokun  io.out.bits.req_info.s2xlate := s2xlate
586967f5d5Speixiaokun  io.out.bits.req_info.source := prefetchID.U
59325f0a4eSpeixiaokun  io.out.bits.isHptwReq := false.B
607f6221c5Speixiaokun  io.out.bits.isLLptw := false.B
616967f5d5Speixiaokun  io.out.bits.hptwId := DontCare
627797f035SbugGenerator
637797f035SbugGenerator  when (io.out.fire) {
647797f035SbugGenerator    old_v(old_index) := true.B
657797f035SbugGenerator    old_reqs(old_index) := next_req
667797f035SbugGenerator    old_index := Mux((old_index === (OldRecordSize-1).U), 0.U, old_index + 1.U)
677797f035SbugGenerator  }
687797f035SbugGenerator
697797f035SbugGenerator  when (flush) {
707797f035SbugGenerator    old_v.map(_ := false.B)
717797f035SbugGenerator  }
727797f035SbugGenerator
735afdf73cSHaoyuan Feng  XSPerfAccumulate("l2tlb_prefetch_input_count", io.in.valid)
745afdf73cSHaoyuan Feng  XSPerfAccumulate("l2tlb_prefetch_valid_count", input_valid)
75935edac4STang Haojin  XSPerfAccumulate("l2tlb_prefetch_output_count", io.out.fire)
76bc063562SLemover}
77