xref: /XiangShan/src/main/scala/xiangshan/mem/prefetch/L1PrefetchInterface.scala (revision 5bd65c56355db1d4f5b92a3815df78273c01b892)
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