1*bc063562SLemover/*************************************************************************************** 2*bc063562SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3*bc063562SLemover* Copyright (c) 2020-2021 Peng Cheng Laboratory 4*bc063562SLemover* 5*bc063562SLemover* XiangShan is licensed under Mulan PSL v2. 6*bc063562SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7*bc063562SLemover* You may obtain a copy of Mulan PSL v2 at: 8*bc063562SLemover* http://license.coscl.org.cn/MulanPSL2 9*bc063562SLemover* 10*bc063562SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11*bc063562SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12*bc063562SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13*bc063562SLemover* 14*bc063562SLemover* See the Mulan PSL v2 for more details. 15*bc063562SLemover***************************************************************************************/ 16*bc063562SLemoverpackage xiangshan.cache.mmu 17*bc063562SLemover 18*bc063562SLemoverimport chisel3._ 19*bc063562SLemoverimport chisel3.util._ 20*bc063562SLemoverimport chipsalliance.rocketchip.config.Parameters 21*bc063562SLemoverimport xiangshan.{SfenceBundle, XSModule} 22*bc063562SLemoverimport utils._ 23*bc063562SLemover 24*bc063562SLemoverclass L2TlbPrefetchIO(implicit p: Parameters) extends PtwBundle { 25*bc063562SLemover val in = Flipped(ValidIO(new Bundle { 26*bc063562SLemover val vpn = UInt(vpnLen.W) 27*bc063562SLemover })) 28*bc063562SLemover val out = DecoupledIO(new Bundle { 29*bc063562SLemover val vpn = UInt(vpnLen.W) 30*bc063562SLemover val source = UInt(bSourceWidth.W) 31*bc063562SLemover }) 32*bc063562SLemover val sfence = Input(new SfenceBundle()) 33*bc063562SLemover} 34*bc063562SLemover 35*bc063562SLemoverclass L2TlbPrefetch(implicit p: Parameters) extends XSModule with HasPtwConst { 36*bc063562SLemover val io = IO(new L2TlbPrefetchIO()) 37*bc063562SLemover 38*bc063562SLemover val next_vpn = get_next_line(io.in.bits.vpn) 39*bc063562SLemover val next_line = RegEnable(next_vpn, io.in.valid) 40*bc063562SLemover val v = ValidHold(io.in.valid && !io.sfence.valid && same_l2entry(next_vpn, io.in.bits.vpn), io.out.fire(), io.sfence.valid) 41*bc063562SLemover 42*bc063562SLemover io.out.valid := v 43*bc063562SLemover io.out.bits.vpn := next_line 44*bc063562SLemover io.out.bits.source := prefetchID.U 45*bc063562SLemover} 46