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