BusyTable.scala 1.8 KB
Newer Older
1 2 3 4 5
package xiangshan.backend.rename

import chisel3._
import chisel3.util._
import xiangshan._
L
LinJiawei 已提交
6
import utils.{ParallelOR, XSDebug}
7

8
class BusyTable(numReadPorts: Int, numWritePorts: Int) extends XSModule {
9 10 11 12
  val io = IO(new Bundle() {
    val flush = Input(Bool())
    // set preg state to busy
    val allocPregs = Vec(RenameWidth, Flipped(ValidIO(UInt(PhyRegIdxWidth.W))))
L
linjiawei 已提交
13
    // set preg state to ready (write back regfile + roq walk)
14
    val wbPregs = Vec(numWritePorts, Flipped(ValidIO(UInt(PhyRegIdxWidth.W))))
15
    // read preg state
16 17
    val rfReadAddr = Vec(numReadPorts, Input(UInt(PhyRegIdxWidth.W)))
    val pregRdy = Vec(numReadPorts, Output(Bool()))
18 19
  })

20 21
  val table = RegInit(0.U(NRPhyRegs.W))

22 23 24 25 26 27
  def reqVecToMask(rVec: Vec[Valid[UInt]]): UInt = {
    ParallelOR(rVec.map(v => Mux(v.valid, UIntToOH(v.bits), 0.U)))
  }

  val wbMask = reqVecToMask(io.wbPregs)
  val allocMask = reqVecToMask(io.allocPregs)
28

L
linjiawei 已提交
29 30
  val tableAfterWb = table & (~wbMask).asUInt
  val tableAfterAlloc = tableAfterWb | allocMask
31 32

  for((raddr, rdy) <- io.rfReadAddr.zip(io.pregRdy)){
L
linjiawei 已提交
33
    rdy := !tableAfterWb(raddr)
34 35
  }

Y
Yinan Xu 已提交
36
  table := tableAfterAlloc
37

38 39 40 41 42 43 44 45 46 47 48 49 50 51
//  for((alloc, i) <- io.allocPregs.zipWithIndex){
//    when(alloc.valid){
//      table(alloc.bits) := true.B
//    }
//    XSDebug(alloc.valid, "Allocate %d\n", alloc.bits)
//  }


//  for((wb, i) <- io.wbPregs.zipWithIndex){
//    when(wb.valid){
//      table(wb.bits) := false.B
//    }
//    XSDebug(wb.valid, "writeback %d\n", wb.bits)
//  }
52 53

  when(io.flush){
54
    table := 0.U(NRPhyRegs.W)
55
  }
Y
Yinan Xu 已提交
56

57
  XSDebug(p"table    : ${Binary(table)}\n")
L
linjiawei 已提交
58
  XSDebug(p"tableNext: ${Binary(tableAfterAlloc)}\n")
59
  XSDebug(p"allocMask: ${Binary(allocMask)}\n")
60
  XSDebug(p"wbMask   : ${Binary(wbMask)}\n")
Y
Yinan Xu 已提交
61 62 63
  for (i <- 0 until NRPhyRegs) {
    XSDebug(table(i), "%d is busy\n", i.U)
  }
64
}