xref: /XiangShan/src/main/scala/xiangshan/backend/rename/RenameTable.scala (revision b034d3b9b313380c68bd9cdbacc1e01112f00085)
1*b034d3b9SLinJiaweipackage xiangshan.backend.rename
2*b034d3b9SLinJiawei
3*b034d3b9SLinJiaweiimport chisel3._
4*b034d3b9SLinJiaweiimport chisel3.util._
5*b034d3b9SLinJiaweiimport xiangshan._
6*b034d3b9SLinJiawei
7*b034d3b9SLinJiaweiclass RatReadPort extends XSBundle {
8*b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
9*b034d3b9SLinJiawei  val rdata = Output(UInt(XLEN.W))
10*b034d3b9SLinJiawei}
11*b034d3b9SLinJiawei
12*b034d3b9SLinJiaweiclass RatWritePort extends XSBundle {
13*b034d3b9SLinJiawei  val wen = Input(Bool())
14*b034d3b9SLinJiawei  val addr = Input(UInt(5.W))
15*b034d3b9SLinJiawei  val wdata = Input(UInt(XLEN.W))
16*b034d3b9SLinJiawei}
17*b034d3b9SLinJiawei
18*b034d3b9SLinJiaweiclass RenameTable(float: Boolean) extends XSModule {
19*b034d3b9SLinJiawei  val io = IO(new Bundle() {
20*b034d3b9SLinJiawei    val flush = Input(Bool())
21*b034d3b9SLinJiawei    val readPorts = Vec({if(float) 4 else 3} * RenameWidth, new RatReadPort)
22*b034d3b9SLinJiawei    val specWritePorts = Vec(RenameWidth, new RatWritePort)
23*b034d3b9SLinJiawei    val archWritePorts = Vec(CommitWidth, new RatWritePort)
24*b034d3b9SLinJiawei  })
25*b034d3b9SLinJiawei
26*b034d3b9SLinJiawei  // speculative rename table
27*b034d3b9SLinJiawei  val spec_table = RegInit(VecInit(Seq.fill(NRPhyRegs)(0.U(PhyRegIdxWidth.W))))
28*b034d3b9SLinJiawei
29*b034d3b9SLinJiawei  // arch state rename table
30*b034d3b9SLinJiawei  val arch_table = RegInit(VecInit(Seq.fill(NRPhyRegs)(0.U(PhyRegIdxWidth.W))))
31*b034d3b9SLinJiawei
32*b034d3b9SLinJiawei  for(w <- io.specWritePorts){
33*b034d3b9SLinJiawei    when(w.wen){ spec_table(w.addr) := w.wdata }
34*b034d3b9SLinJiawei  }
35*b034d3b9SLinJiawei
36*b034d3b9SLinJiawei  for((r, i) <- io.readPorts.zipWithIndex){
37*b034d3b9SLinJiawei    r.rdata := spec_table(r.addr)
38*b034d3b9SLinJiawei    for(w <- io.specWritePorts.take(i/{if(float) 4 else 3})){ // bypass
39*b034d3b9SLinJiawei      when(w.wen && (w.addr === r.addr)){ r.rdata := w.wdata }
40*b034d3b9SLinJiawei    }
41*b034d3b9SLinJiawei  }
42*b034d3b9SLinJiawei
43*b034d3b9SLinJiawei  for(w <- io.archWritePorts){
44*b034d3b9SLinJiawei    when(w.wen){ arch_table(w.addr) := w.wdata }
45*b034d3b9SLinJiawei  }
46*b034d3b9SLinJiawei
47*b034d3b9SLinJiawei  when(io.flush){
48*b034d3b9SLinJiawei    spec_table := arch_table
49*b034d3b9SLinJiawei  }
50*b034d3b9SLinJiawei
51*b034d3b9SLinJiawei}
52*b034d3b9SLinJiawei
53*b034d3b9SLinJiaweiobject Gen extends App {
54*b034d3b9SLinJiawei//  chisel3.Driver.execute(Array[String]("-td", "build"), () => new RenameTable(true))
55*b034d3b9SLinJiawei//  chisel3.Driver.execute(Array[String]("-td", "build"), () => new FreeList)
56*b034d3b9SLinJiawei  //chisel3.Driver.execute(Array[String]("-td", "build"), () => new BusyTable)
57*b034d3b9SLinJiawei  chisel3.Driver.execute(Array[String]("-td", "build"), () => new Rename)
58*b034d3b9SLinJiawei}
59