1980c1bc3SWilliam Wang/*************************************************************************************** 2980c1bc3SWilliam Wang* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3980c1bc3SWilliam Wang* Copyright (c) 2020-2021 Peng Cheng Laboratory 4980c1bc3SWilliam Wang* 5980c1bc3SWilliam Wang* XiangShan is licensed under Mulan PSL v2. 6980c1bc3SWilliam Wang* You can use this software according to the terms and conditions of the Mulan PSL v2. 7980c1bc3SWilliam Wang* You may obtain a copy of Mulan PSL v2 at: 8980c1bc3SWilliam Wang* http://license.coscl.org.cn/MulanPSL2 9980c1bc3SWilliam Wang* 10980c1bc3SWilliam Wang* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11980c1bc3SWilliam Wang* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12980c1bc3SWilliam Wang* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13980c1bc3SWilliam Wang* 14980c1bc3SWilliam Wang* See the Mulan PSL v2 for more details. 15c49ebec8SHaoyuan Feng* 16c49ebec8SHaoyuan Feng* 17c49ebec8SHaoyuan Feng* Acknowledgement 18c49ebec8SHaoyuan Feng* 19c49ebec8SHaoyuan Feng* This implementation is inspired by several key papers: 20c49ebec8SHaoyuan Feng* [1] Richard Kessler. "[The alpha 21264 microprocessor.](https://doi.org/10.1109/40.755465)" IEEE Micro 19.2: 24-36. 21c49ebec8SHaoyuan Feng* 1999. 22980c1bc3SWilliam Wang***************************************************************************************/ 23980c1bc3SWilliam Wang 24980c1bc3SWilliam Wangpackage xiangshan.mem.mdp 25980c1bc3SWilliam Wang 268891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters 27980c1bc3SWilliam Wangimport chisel3._ 28980c1bc3SWilliam Wangimport chisel3.util._ 29980c1bc3SWilliam Wangimport xiangshan._ 30980c1bc3SWilliam Wangimport utils._ 313c02ee8fSwakafaimport utility._ 32980c1bc3SWilliam Wang 33980c1bc3SWilliam Wang// 21264-like wait table, uses 2-bit counter 34980c1bc3SWilliam Wangclass WaitTable(implicit p: Parameters) extends XSModule { 35980c1bc3SWilliam Wang val io = IO(new Bundle { 36980c1bc3SWilliam Wang // to decode 37980c1bc3SWilliam Wang val raddr = Vec(DecodeWidth, Input(UInt(MemPredPCWidth.W))) // decode pc(VaddrBits-1, 1) 38980c1bc3SWilliam Wang val rdata = Vec(DecodeWidth, Output(Bool())) // loadWaitBit 39980c1bc3SWilliam Wang val update = Input(new MemPredUpdateReq) // RegNext should be added outside 40980c1bc3SWilliam Wang val csrCtrl = Input(new CustomCSRCtrlIO) 41980c1bc3SWilliam Wang }) 42980c1bc3SWilliam Wang 43980c1bc3SWilliam Wang require(DecodeWidth == RenameWidth) 44980c1bc3SWilliam Wang 45980c1bc3SWilliam Wang val data = RegInit(VecInit(Seq.fill(WaitTableSize)(0.U(2.W)))) 46980c1bc3SWilliam Wang val resetCounter = RegInit(0.U(ResetTimeMax2Pow.W)) 47980c1bc3SWilliam Wang resetCounter := resetCounter + 1.U 48980c1bc3SWilliam Wang 49980c1bc3SWilliam Wang // read ports 50980c1bc3SWilliam Wang for (i <- 0 until DecodeWidth) { 51980c1bc3SWilliam Wang io.rdata(i) := (data(io.raddr(i))(LWTUse2BitCounter.B.asUInt) || io.csrCtrl.no_spec_load) && !io.csrCtrl.lvpred_disable 52980c1bc3SWilliam Wang } 53980c1bc3SWilliam Wang 54980c1bc3SWilliam Wang // write port 55980c1bc3SWilliam Wang when(io.update.valid){ 56980c1bc3SWilliam Wang data(io.update.waddr) := Cat(data(io.update.waddr)(0), true.B) 57980c1bc3SWilliam Wang } 58980c1bc3SWilliam Wang 59980c1bc3SWilliam Wang // reset period: ResetTimeMax2Pow 60980c1bc3SWilliam Wang when(resetCounter(ResetTimeMax2Pow-1, ResetTimeMin2Pow)(RegNext(io.csrCtrl.lvpred_timeout))) { 61980c1bc3SWilliam Wang for (j <- 0 until WaitTableSize) { 62980c1bc3SWilliam Wang data(j) := 0.U 63980c1bc3SWilliam Wang } 64980c1bc3SWilliam Wang resetCounter:= 0.U 65980c1bc3SWilliam Wang } 66980c1bc3SWilliam Wang 67980c1bc3SWilliam Wang // debug 68*8b33cd30Sklin02 XSDebug(io.update.valid, "%d: waittable update: pc %x data: %x\n", GTimer(), io.update.waddr, io.update.wdata) 69980c1bc3SWilliam Wang 70980c1bc3SWilliam Wang XSPerfAccumulate("wait_table_bit_set", PopCount(data.map(d => d(1)))) 71980c1bc3SWilliam Wang} 72