xref: /XiangShan/src/main/scala/xiangshan/mem/mdp/WaitTable.scala (revision 980c1bc3f05e5b351aee330c03afe66a27b8e99d)
1*980c1bc3SWilliam Wang/***************************************************************************************
2*980c1bc3SWilliam Wang* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3*980c1bc3SWilliam Wang* Copyright (c) 2020-2021 Peng Cheng Laboratory
4*980c1bc3SWilliam Wang*
5*980c1bc3SWilliam Wang* XiangShan is licensed under Mulan PSL v2.
6*980c1bc3SWilliam Wang* You can use this software according to the terms and conditions of the Mulan PSL v2.
7*980c1bc3SWilliam Wang* You may obtain a copy of Mulan PSL v2 at:
8*980c1bc3SWilliam Wang*          http://license.coscl.org.cn/MulanPSL2
9*980c1bc3SWilliam Wang*
10*980c1bc3SWilliam Wang* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11*980c1bc3SWilliam Wang* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12*980c1bc3SWilliam Wang* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13*980c1bc3SWilliam Wang*
14*980c1bc3SWilliam Wang* See the Mulan PSL v2 for more details.
15*980c1bc3SWilliam Wang***************************************************************************************/
16*980c1bc3SWilliam Wang
17*980c1bc3SWilliam Wangpackage xiangshan.mem.mdp
18*980c1bc3SWilliam Wang
19*980c1bc3SWilliam Wangimport chipsalliance.rocketchip.config.Parameters
20*980c1bc3SWilliam Wangimport chisel3._
21*980c1bc3SWilliam Wangimport chisel3.util._
22*980c1bc3SWilliam Wangimport xiangshan._
23*980c1bc3SWilliam Wangimport utils._
24*980c1bc3SWilliam Wang
25*980c1bc3SWilliam Wang// 21264-like wait table, uses 2-bit counter
26*980c1bc3SWilliam Wangclass WaitTable(implicit p: Parameters) extends XSModule {
27*980c1bc3SWilliam Wang  val io = IO(new Bundle {
28*980c1bc3SWilliam Wang    // to decode
29*980c1bc3SWilliam Wang    val raddr = Vec(DecodeWidth, Input(UInt(MemPredPCWidth.W))) // decode pc(VaddrBits-1, 1)
30*980c1bc3SWilliam Wang    val rdata = Vec(DecodeWidth, Output(Bool())) // loadWaitBit
31*980c1bc3SWilliam Wang    val update = Input(new MemPredUpdateReq) // RegNext should be added outside
32*980c1bc3SWilliam Wang    val csrCtrl = Input(new CustomCSRCtrlIO)
33*980c1bc3SWilliam Wang  })
34*980c1bc3SWilliam Wang
35*980c1bc3SWilliam Wang  require(DecodeWidth == RenameWidth)
36*980c1bc3SWilliam Wang
37*980c1bc3SWilliam Wang  val data = RegInit(VecInit(Seq.fill(WaitTableSize)(0.U(2.W))))
38*980c1bc3SWilliam Wang  val resetCounter = RegInit(0.U(ResetTimeMax2Pow.W))
39*980c1bc3SWilliam Wang  resetCounter := resetCounter + 1.U
40*980c1bc3SWilliam Wang
41*980c1bc3SWilliam Wang  // read ports
42*980c1bc3SWilliam Wang  for (i <- 0 until DecodeWidth) {
43*980c1bc3SWilliam Wang    io.rdata(i) := (data(io.raddr(i))(LWTUse2BitCounter.B.asUInt) || io.csrCtrl.no_spec_load) && !io.csrCtrl.lvpred_disable
44*980c1bc3SWilliam Wang  }
45*980c1bc3SWilliam Wang
46*980c1bc3SWilliam Wang  // write port
47*980c1bc3SWilliam Wang  when(io.update.valid){
48*980c1bc3SWilliam Wang    data(io.update.waddr) := Cat(data(io.update.waddr)(0), true.B)
49*980c1bc3SWilliam Wang  }
50*980c1bc3SWilliam Wang
51*980c1bc3SWilliam Wang  // reset period: ResetTimeMax2Pow
52*980c1bc3SWilliam Wang  when(resetCounter(ResetTimeMax2Pow-1, ResetTimeMin2Pow)(RegNext(io.csrCtrl.lvpred_timeout))) {
53*980c1bc3SWilliam Wang    for (j <- 0 until WaitTableSize) {
54*980c1bc3SWilliam Wang      data(j) := 0.U
55*980c1bc3SWilliam Wang    }
56*980c1bc3SWilliam Wang    resetCounter:= 0.U
57*980c1bc3SWilliam Wang  }
58*980c1bc3SWilliam Wang
59*980c1bc3SWilliam Wang  // debug
60*980c1bc3SWilliam Wang  when (io.update.valid) {
61*980c1bc3SWilliam Wang    XSDebug("%d: waittable update: pc %x data: %x\n", GTimer(), io.update.waddr, io.update.wdata)
62*980c1bc3SWilliam Wang  }
63*980c1bc3SWilliam Wang
64*980c1bc3SWilliam Wang  XSPerfAccumulate("wait_table_bit_set", PopCount(data.map(d => d(1))))
65*980c1bc3SWilliam Wang}
66