xref: /XiangShan/src/main/scala/xiangshan/backend/rename/Snapshot.scala (revision 870f462d572cd0ef6bf86c91dcda5a5fab6e99d3)
1package xiangshan.backend.rename
2
3import chipsalliance.rocketchip.config.Parameters
4import chisel3._
5import utility.{CircularQueuePtr, HasCircularQueuePtrHelper}
6import utils.XSError
7import xiangshan.{XSCoreParamsKey, XSModule}
8
9
10class SnapshotPtr(implicit p: Parameters) extends CircularQueuePtr[SnapshotPtr](
11  p => p(XSCoreParamsKey).RenameSnapshotNum
12)
13
14object SnapshotGenerator extends HasCircularQueuePtrHelper {
15  def apply[T <: Data](enqData: T, enq: Bool, deq: Bool, flush: Bool)(implicit p: Parameters): Vec[T] = {
16    val snapshotGen = Module(new SnapshotGenerator(enqData))
17    snapshotGen.io.enq := enq
18    snapshotGen.io.enqData.head := enqData
19    snapshotGen.io.deq := deq
20    snapshotGen.io.flush := flush
21    snapshotGen.io.snapshots
22  }
23}
24
25class SnapshotGenerator[T <: Data](dataType: T)(implicit p: Parameters) extends XSModule
26  with HasCircularQueuePtrHelper {
27
28  class SnapshotGeneratorIO extends Bundle {
29    val enq = Input(Bool())
30    val enqData = Input(Vec(1, chiselTypeOf(dataType))) // make chisel happy
31    val deq = Input(Bool())
32    val flush = Input(Bool())
33    val snapshots = Output(Vec(RenameSnapshotNum, chiselTypeOf(dataType)))
34    val enqPtr = Output(new SnapshotPtr)
35    val deqPtr = Output(new SnapshotPtr)
36    val valids = Output(Vec(RenameSnapshotNum, Bool()))
37  }
38
39  val io = IO(new SnapshotGeneratorIO)
40
41  val snapshots = Reg(Vec(RenameSnapshotNum, chiselTypeOf(dataType)))
42  val snptEnqPtr = RegInit(0.U.asTypeOf(new SnapshotPtr))
43  val snptDeqPtr = RegInit(0.U.asTypeOf(new SnapshotPtr))
44  val snptValids = RegInit(VecInit.fill(RenameSnapshotNum)(false.B))
45
46  io.snapshots := snapshots
47  io.enqPtr := snptEnqPtr
48  io.deqPtr := snptDeqPtr
49  io.valids := snptValids
50
51  when(!isFull(snptEnqPtr, snptDeqPtr) && io.enq) {
52    snapshots(snptEnqPtr.value) := io.enqData.head
53    snptValids(snptEnqPtr.value) := true.B
54    snptEnqPtr := snptEnqPtr + 1.U
55  }
56  when(io.deq) {
57    snptValids(snptDeqPtr.value) := false.B
58    snptDeqPtr := snptDeqPtr + 1.U
59    XSError(isEmpty(snptEnqPtr, snptDeqPtr), "snapshots should not be empty when dequeue!\n")
60  }
61  when(io.flush) {
62    snptValids := 0.U.asTypeOf(snptValids)
63    snptEnqPtr := 0.U.asTypeOf(new SnapshotPtr)
64    snptDeqPtr := 0.U.asTypeOf(new SnapshotPtr)
65  }
66}
67