14907ec88Schengguanghuipackage xiangshan.backend.trace 24907ec88Schengguanghui 34907ec88Schengguanghuiimport chisel3._ 44907ec88Schengguanghuiimport chisel3.util.{RegEnable, ValidIO, log2Up} 54907ec88Schengguanghuiimport org.chipsalliance.cde.config.Parameters 64907ec88Schengguanghuiimport xiangshan.HasXSParameter 74907ec88Schengguanghui 84907ec88Schengguanghuiclass TraceParams( 9725e8ddcSchengguanghui val TraceGroupNum : Int, 10551cc696Schengguanghui val IaddrWidth : Int, 11725e8ddcSchengguanghui val PrivWidth : Int, 12725e8ddcSchengguanghui val ItypeWidth : Int, 13725e8ddcSchengguanghui val IlastsizeWidth : Int, 144907ec88Schengguanghui) 154907ec88Schengguanghui 164907ec88Schengguanghuiclass TraceIO(implicit val p: Parameters) extends Bundle with HasXSParameter { 17c308d936Schengguanghui val in = new Bundle { 184907ec88Schengguanghui val fromEncoder = Input(new FromEncoder) 194907ec88Schengguanghui val fromRob = Flipped(new TraceBundle(hasIaddr = false, CommitWidth, IretireWidthInPipe)) 20c308d936Schengguanghui } 21c308d936Schengguanghui val out = new Bundle { 22c308d936Schengguanghui val toPcMem = new TraceBundle(hasIaddr = false, TraceGroupNum, IretireWidthCompressed) 23*fd448a9dSchengguanghui val toEncoder = new TraceBundle(hasIaddr = false, TraceGroupNum, IretireWidthCompressed) 24c308d936Schengguanghui val blockRobCommit = Output(Bool()) 25c308d936Schengguanghui } 264907ec88Schengguanghui} 274907ec88Schengguanghui 284907ec88Schengguanghuiclass Trace(implicit val p: Parameters) extends Module with HasXSParameter { 294907ec88Schengguanghui val io = IO(new TraceIO) 30*fd448a9dSchengguanghui val (fromEncoder, fromRob, toPcMem, toEncoder) = (io.in.fromEncoder, io.in.fromRob, io.out.toPcMem, io.out.toEncoder) 314907ec88Schengguanghui 324907ec88Schengguanghui /** 334907ec88Schengguanghui * stage 0: CommitInfo from rob 344907ec88Schengguanghui */ 354907ec88Schengguanghui val blockCommit = Wire(Bool()) 36c308d936Schengguanghui io.out.blockRobCommit := blockCommit 374907ec88Schengguanghui 384907ec88Schengguanghui /** 394907ec88Schengguanghui * stage 1: regNext(robCommitInfo) 404907ec88Schengguanghui */ 414907ec88Schengguanghui val s1_in = fromRob 424907ec88Schengguanghui val s1_out = WireInit(0.U.asTypeOf(s1_in)) 434907ec88Schengguanghui for(i <- 0 until CommitWidth) { 44c308d936Schengguanghui s1_out.blocks(i).valid := RegEnable(s1_in.blocks(i).valid, false.B, !blockCommit) 45725e8ddcSchengguanghui s1_out.blocks(i).bits := RegEnable(s1_in.blocks(i).bits, 0.U.asTypeOf(s1_in.blocks(i).bits), s1_in.blocks(i).valid) 464907ec88Schengguanghui } 474907ec88Schengguanghui 484907ec88Schengguanghui /** 494907ec88Schengguanghui * stage 2: compress, s2_out(deq from traceBuffer) -> pcMem 504907ec88Schengguanghui */ 514907ec88Schengguanghui val s2_in = s1_out 524907ec88Schengguanghui val traceBuffer = Module(new TraceBuffer) 534907ec88Schengguanghui traceBuffer.io.in.fromEncoder := fromEncoder 544907ec88Schengguanghui traceBuffer.io.in.fromRob := s2_in 55c308d936Schengguanghui val s2_out_groups = traceBuffer.io.out.groups 564907ec88Schengguanghui blockCommit := traceBuffer.io.out.blockCommit 574907ec88Schengguanghui 584907ec88Schengguanghui /** 594907ec88Schengguanghui * stage 3: groups with iaddr from pcMem(ftqidx & ftqOffset -> iaddr) -> encoder 604907ec88Schengguanghui */ 61c308d936Schengguanghui val s3_in_groups = s2_out_groups 62c308d936Schengguanghui val s3_out_groups = RegNext(s3_in_groups) 63c308d936Schengguanghui toPcMem := s3_in_groups 64*fd448a9dSchengguanghui io.out.toEncoder := s3_out_groups 654907ec88Schengguanghui} 66