1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 17b034d3b9SLinJiaweipackage xiangshan.backend.rename 18b034d3b9SLinJiawei 192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters 20b034d3b9SLinJiaweiimport chisel3._ 21b034d3b9SLinJiaweiimport chisel3.util._ 22b034d3b9SLinJiaweiimport xiangshan._ 23d479a3a8SYinan Xuimport utils._ 243c02ee8fSwakafaimport utility._ 25b034d3b9SLinJiawei 262225d46eSJiawei Linclass BusyTableReadIO(implicit p: Parameters) extends XSBundle { 278af95560SYinan Xu val req = Input(UInt(PhyRegIdxWidth.W)) 288af95560SYinan Xu val resp = Output(Bool()) 298af95560SYinan Xu} 308af95560SYinan Xu 31*39c59369SXuan Huclass BusyTable(numReadPorts: Int, numWritePorts: Int, numPhyPregs: Int)(implicit p: Parameters) extends XSModule with HasPerfEvents { 32b034d3b9SLinJiawei val io = IO(new Bundle() { 33b034d3b9SLinJiawei // set preg state to busy 34b034d3b9SLinJiawei val allocPregs = Vec(RenameWidth, Flipped(ValidIO(UInt(PhyRegIdxWidth.W)))) 359aca92b9SYinan Xu // set preg state to ready (write back regfile + rob walk) 366624015fSLinJiawei val wbPregs = Vec(numWritePorts, Flipped(ValidIO(UInt(PhyRegIdxWidth.W)))) 37b034d3b9SLinJiawei // read preg state 388af95560SYinan Xu val read = Vec(numReadPorts, new BusyTableReadIO) 39b034d3b9SLinJiawei }) 40b034d3b9SLinJiawei 41*39c59369SXuan Hu val table = RegInit(0.U(numPhyPregs.W)) 42767bd21fSLinJiawei 4360deaca2SLinJiawei def reqVecToMask(rVec: Vec[Valid[UInt]]): UInt = { 4460deaca2SLinJiawei ParallelOR(rVec.map(v => Mux(v.valid, UIntToOH(v.bits), 0.U))) 4560deaca2SLinJiawei } 4660deaca2SLinJiawei 4760deaca2SLinJiawei val wbMask = reqVecToMask(io.wbPregs) 4860deaca2SLinJiawei val allocMask = reqVecToMask(io.allocPregs) 49767bd21fSLinJiawei 5084a015b1Slinjiawei val tableAfterWb = table & (~wbMask).asUInt 5184a015b1Slinjiawei val tableAfterAlloc = tableAfterWb | allocMask 52b034d3b9SLinJiawei 530c2f5c4aSYinan Xu io.read.foreach(r => r.resp := !table(r.req)) 54b034d3b9SLinJiawei 5543913318SYinan Xu table := tableAfterAlloc 56b034d3b9SLinJiawei 570c2f5c4aSYinan Xu val oddTable = table.asBools.zipWithIndex.filter(_._2 % 2 == 1).map(_._1) 580c2f5c4aSYinan Xu val evenTable = table.asBools.zipWithIndex.filter(_._2 % 2 == 0).map(_._1) 590c2f5c4aSYinan Xu val busyCount = RegNext(RegNext(PopCount(oddTable)) + RegNext(PopCount(evenTable))) 600c2f5c4aSYinan Xu 61767bd21fSLinJiawei XSDebug(p"table : ${Binary(table)}\n") 6284a015b1Slinjiawei XSDebug(p"tableNext: ${Binary(tableAfterAlloc)}\n") 63767bd21fSLinJiawei XSDebug(p"allocMask: ${Binary(allocMask)}\n") 64767bd21fSLinJiawei XSDebug(p"wbMask : ${Binary(wbMask)}\n") 65*39c59369SXuan Hu for (i <- 0 until numPhyPregs) { 66a6ad6ca2SYinan Xu XSDebug(table(i), "%d is busy\n", i.U) 67a6ad6ca2SYinan Xu } 68d479a3a8SYinan Xu 69408a32b7SAllen XSPerfAccumulate("busy_count", PopCount(table)) 70cd365d4cSrvcoresjw 711ca0e4f3SYinan Xu val perfEvents = Seq( 72*39c59369SXuan Hu ("std_freelist_1_4_valid", busyCount < (numPhyPregs / 4).U ), 73*39c59369SXuan Hu ("std_freelist_2_4_valid", busyCount > (numPhyPregs / 4).U && busyCount <= (numPhyPregs / 2).U ), 74*39c59369SXuan Hu ("std_freelist_3_4_valid", busyCount > (numPhyPregs / 2).U && busyCount <= (numPhyPregs * 3 / 4).U), 75*39c59369SXuan Hu ("std_freelist_4_4_valid", busyCount > (numPhyPregs * 3 / 4).U ) 761ca0e4f3SYinan Xu ) 771ca0e4f3SYinan Xu generatePerfEvent() 78b034d3b9SLinJiawei} 79