1b52348aeSWilliam Wang/*************************************************************************************** 2b52348aeSWilliam Wang* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3b52348aeSWilliam Wang* Copyright (c) 2020-2021 Peng Cheng Laboratory 4b52348aeSWilliam Wang* 5b52348aeSWilliam Wang* XiangShan is licensed under Mulan PSL v2. 6b52348aeSWilliam Wang* You can use this software according to the terms and conditions of the Mulan PSL v2. 7b52348aeSWilliam Wang* You may obtain a copy of Mulan PSL v2 at: 8b52348aeSWilliam Wang* http://license.coscl.org.cn/MulanPSL2 9b52348aeSWilliam Wang* 10b52348aeSWilliam Wang* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11b52348aeSWilliam Wang* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12b52348aeSWilliam Wang* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13b52348aeSWilliam Wang* 14b52348aeSWilliam Wang* See the Mulan PSL v2 for more details. 15b52348aeSWilliam Wang***************************************************************************************/ 16b52348aeSWilliam Wang 17b52348aeSWilliam Wangpackage xiangshan.mem 18b52348aeSWilliam Wang 198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters 20b52348aeSWilliam Wangimport chisel3._ 21b52348aeSWilliam Wangimport chisel3.util._ 22b52348aeSWilliam Wangimport utils._ 232cdf1575SWilliam Wangimport utility._ 24b52348aeSWilliam Wangimport xiangshan.ExceptionNO._ 25b52348aeSWilliam Wangimport xiangshan._ 26b52348aeSWilliam Wangimport xiangshan.backend.fu.PMPRespBundle 27b52348aeSWilliam Wangimport xiangshan.cache._ 28b52348aeSWilliam Wangimport xiangshan.cache.mmu.{TlbCmd, TlbReq, TlbRequestIO, TlbResp} 29b52348aeSWilliam Wang 300d32f713Shappy-lxtrait HasL1PrefetchSourceParameter { 310d32f713Shappy-lx // l1 prefetch source related 320d32f713Shappy-lx def L1PfSourceBits = 3 330d32f713Shappy-lx def L1_HW_PREFETCH_NULL = 0.U 346070f1e9Shappy-lx def L1_HW_PREFETCH_CLEAR = 1.U // used to be a prefetch, clear by demand request 356070f1e9Shappy-lx def L1_HW_PREFETCH_STRIDE = 2.U 366070f1e9Shappy-lx def L1_HW_PREFETCH_STREAM = 3.U 376070f1e9Shappy-lx def L1_HW_PREFETCH_STORE = 4.U 380d32f713Shappy-lx 396070f1e9Shappy-lx // ------------------------------------------------------------------------------------------------------------------------ 406070f1e9Shappy-lx // timeline: L1_HW_PREFETCH_NULL --(pf by stream)--> L1_HW_PREFETCH_STREAM --(pf hit by load)--> L1_HW_PREFETCH_CLEAR 416070f1e9Shappy-lx // ------------------------------------------------------------------------------------------------------------------------ 426070f1e9Shappy-lx 436070f1e9Shappy-lx def isPrefetchRelated(value: UInt) = value >= L1_HW_PREFETCH_CLEAR 446070f1e9Shappy-lx def isFromL1Prefetch(value: UInt) = value > L1_HW_PREFETCH_CLEAR 450d32f713Shappy-lx def isFromStride(value: UInt) = value === L1_HW_PREFETCH_STRIDE 460d32f713Shappy-lx def isFromStream(value: UInt) = value === L1_HW_PREFETCH_STREAM 470d32f713Shappy-lx} 480d32f713Shappy-lx 490d32f713Shappy-lxclass L1PrefetchSource(implicit p: Parameters) extends XSBundle with HasL1PrefetchSourceParameter { 500d32f713Shappy-lx val value = UInt(L1PfSourceBits.W) 510d32f713Shappy-lx} 520d32f713Shappy-lx 53b52348aeSWilliam Wangclass L1PrefetchReq(implicit p: Parameters) extends XSBundle with HasDCacheParameters { 54b52348aeSWilliam Wang val paddr = UInt(PAddrBits.W) 55b52348aeSWilliam Wang val alias = UInt(2.W) 56b52348aeSWilliam Wang val confidence = UInt(1.W) 57b52348aeSWilliam Wang val is_store = Bool() 580d32f713Shappy-lx val pf_source = new L1PrefetchSource 59b52348aeSWilliam Wang 60b52348aeSWilliam Wang // only index bit is used, do not use tag 61b52348aeSWilliam Wang def getVaddr(): UInt = { 62b52348aeSWilliam Wang Cat(alias, paddr(DCacheSameVPAddrLength-1, 0)) 63b52348aeSWilliam Wang } 64b52348aeSWilliam Wang 65b52348aeSWilliam Wang // when l1 cache prefetch req arrives at load unit: 66b52348aeSWilliam Wang // if (confidence == 1) 67b52348aeSWilliam Wang // override load unit 2 load req 68b52348aeSWilliam Wang // else if (load unit 1/2 is available) 69b52348aeSWilliam Wang // send prefetch req 70b52348aeSWilliam Wang // else 71b52348aeSWilliam Wang // report prefetch !ready 72b52348aeSWilliam Wang} 73b52348aeSWilliam Wang 74b52348aeSWilliam Wangclass L1PrefetchHint(implicit p: Parameters) extends XSBundle with HasDCacheParameters { 75b52348aeSWilliam Wang val loadbusy = Bool() 76b52348aeSWilliam Wang val missqbusy = Bool() 77b52348aeSWilliam Wang} 78b52348aeSWilliam Wang 79b52348aeSWilliam Wangclass L1PrefetchFuzzer(implicit p: Parameters) extends DCacheModule{ 80b52348aeSWilliam Wang val io = IO(new Bundle() { 81b52348aeSWilliam Wang // prefetch req interface 82b52348aeSWilliam Wang val req = Decoupled(new L1PrefetchReq()) 83b52348aeSWilliam Wang // for fuzzer address gen 84b52348aeSWilliam Wang val vaddr = Input(UInt(VAddrBits.W)) 85b52348aeSWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 86b52348aeSWilliam Wang }) 87b52348aeSWilliam Wang 88b52348aeSWilliam Wang // prefetch req queue is not provided, prefetcher must maintain its 89b52348aeSWilliam Wang // own prefetch req queue. 90d463e958SWilliam Wang val rand_offset = LFSR64(seed=Some(123L))(5,0) << 6 917f111a00SWilliam Wang val rand_addr_select = LFSR64(seed=Some(567L))(3,0) === 0.U 92b52348aeSWilliam Wang 93b52348aeSWilliam Wang // use valid vaddr and paddr 94b52348aeSWilliam Wang val rand_vaddr = DelayN(io.vaddr, 2) 95b52348aeSWilliam Wang val rand_paddr = DelayN(io.paddr, 2) 96b52348aeSWilliam Wang 97*5bd65c56STang Haojin io.req.bits.paddr := PmemRanges.map(_.lower).min.U + rand_offset 98dcd58560SWilliam Wang io.req.bits.alias := io.req.bits.paddr(13,12) 997f111a00SWilliam Wang io.req.bits.confidence := LFSR64(seed=Some(789L))(4,0) === 0.U 1007f111a00SWilliam Wang io.req.bits.is_store := LFSR64(seed=Some(890L))(4,0) === 0.U 1017f111a00SWilliam Wang io.req.valid := LFSR64(seed=Some(901L))(3,0) === 0.U 102b52348aeSWilliam Wang} 103