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