1package xiangshan.backend.trace 2 3import chisel3._ 4import chisel3.util.{RegEnable, ValidIO, log2Up} 5import org.chipsalliance.cde.config.Parameters 6import xiangshan.HasXSParameter 7 8class TraceParams( 9 val TraceGroupNum : Int, 10 val IaddrWidth : Int, 11 val PrivWidth : Int, 12 val ItypeWidth : Int, 13 val IlastsizeWidth : Int, 14) 15 16class TraceIO(implicit val p: Parameters) extends Bundle with HasXSParameter { 17 val in = new Bundle { 18 val fromEncoder = Input(new FromEncoder) 19 val fromRob = Flipped(new TraceBundle(hasIaddr = false, CommitWidth, IretireWidthInPipe)) 20 } 21 val out = new Bundle { 22 val toPcMem = new TraceBundle(hasIaddr = false, TraceGroupNum, IretireWidthCompressed) 23 val toEncoder = new TraceBundle(hasIaddr = false, TraceGroupNum, IretireWidthCompressed) 24 val blockRobCommit = Output(Bool()) 25 } 26} 27 28class Trace(implicit val p: Parameters) extends Module with HasXSParameter { 29 val io = IO(new TraceIO) 30 val (fromEncoder, fromRob, toPcMem, toEncoder) = (io.in.fromEncoder, io.in.fromRob, io.out.toPcMem, io.out.toEncoder) 31 32 /** 33 * stage 0: CommitInfo from rob 34 */ 35 val blockCommit = Wire(Bool()) 36 io.out.blockRobCommit := blockCommit 37 38 /** 39 * stage 1: regNext(robCommitInfo) 40 */ 41 val s1_in = fromRob 42 val s1_out = WireInit(0.U.asTypeOf(s1_in)) 43 for(i <- 0 until CommitWidth) { 44 s1_out.blocks(i).valid := RegEnable(s1_in.blocks(i).valid, false.B, !blockCommit) 45 s1_out.blocks(i).bits := RegEnable(s1_in.blocks(i).bits, 0.U.asTypeOf(s1_in.blocks(i).bits), s1_in.blocks(i).valid) 46 } 47 48 /** 49 * stage 2: compress, s2_out(deq from traceBuffer) -> pcMem 50 */ 51 val s2_in = s1_out 52 val traceBuffer = Module(new TraceBuffer) 53 traceBuffer.io.in.fromEncoder := fromEncoder 54 traceBuffer.io.in.fromRob := s2_in 55 val s2_out_groups = traceBuffer.io.out.groups 56 blockCommit := traceBuffer.io.out.blockCommit 57 58 /** 59 * stage 3: groups with iaddr from pcMem(ftqidx & ftqOffset -> iaddr) -> encoder 60 */ 61 val s3_in_groups = s2_out_groups 62 val s3_out_groups = RegNext(s3_in_groups) 63 toPcMem := s3_in_groups 64 io.out.toEncoder := s3_out_groups 65} 66