xref: /XiangShan/src/main/scala/xiangshan/backend/rename/BusyTable.scala (revision 39c59369af6e7d78fa72e13aae3735f1a6e98f5c)
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