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