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 { 17*c308d936Schengguanghui val in = new Bundle { 184907ec88Schengguanghui val fromEncoder = Input(new FromEncoder) 194907ec88Schengguanghui val fromRob = Flipped(new TraceBundle(hasIaddr = false, CommitWidth, IretireWidthInPipe)) 204907ec88Schengguanghui val fromPcMem = Input(Vec(TraceGroupNum, UInt(IaddrWidth.W))) 21*c308d936Schengguanghui } 22*c308d936Schengguanghui val out = new Bundle { 23*c308d936Schengguanghui val toPcMem = new TraceBundle(hasIaddr = false, TraceGroupNum, IretireWidthCompressed) 244907ec88Schengguanghui val toEncoder = new TraceBundle(hasIaddr = true, TraceGroupNum, IretireWidthCompressed) 25*c308d936Schengguanghui val blockRobCommit = Output(Bool()) 26*c308d936Schengguanghui } 274907ec88Schengguanghui} 284907ec88Schengguanghui 294907ec88Schengguanghuiclass Trace(implicit val p: Parameters) extends Module with HasXSParameter { 304907ec88Schengguanghui val io = IO(new TraceIO) 31*c308d936Schengguanghui val (fromEncoder, fromRob, fromPcMem, toPcMem, toEncoder) = (io.in.fromEncoder, io.in.fromRob, io.in.fromPcMem, io.out.toPcMem, io.out.toEncoder) 324907ec88Schengguanghui 334907ec88Schengguanghui /** 344907ec88Schengguanghui * stage 0: CommitInfo from rob 354907ec88Schengguanghui */ 364907ec88Schengguanghui val blockCommit = Wire(Bool()) 37*c308d936Schengguanghui io.out.blockRobCommit := blockCommit 384907ec88Schengguanghui 394907ec88Schengguanghui /** 404907ec88Schengguanghui * stage 1: regNext(robCommitInfo) 414907ec88Schengguanghui */ 424907ec88Schengguanghui val s1_in = fromRob 434907ec88Schengguanghui val s1_out = WireInit(0.U.asTypeOf(s1_in)) 444907ec88Schengguanghui for(i <- 0 until CommitWidth) { 45*c308d936Schengguanghui s1_out.blocks(i).valid := RegEnable(s1_in.blocks(i).valid, false.B, !blockCommit) 46725e8ddcSchengguanghui s1_out.blocks(i).bits := RegEnable(s1_in.blocks(i).bits, 0.U.asTypeOf(s1_in.blocks(i).bits), s1_in.blocks(i).valid) 474907ec88Schengguanghui } 484907ec88Schengguanghui 494907ec88Schengguanghui /** 504907ec88Schengguanghui * stage 2: compress, s2_out(deq from traceBuffer) -> pcMem 514907ec88Schengguanghui */ 524907ec88Schengguanghui val s2_in = s1_out 534907ec88Schengguanghui val traceBuffer = Module(new TraceBuffer) 544907ec88Schengguanghui traceBuffer.io.in.fromEncoder := fromEncoder 554907ec88Schengguanghui traceBuffer.io.in.fromRob := s2_in 56*c308d936Schengguanghui val s2_out_groups = traceBuffer.io.out.groups 574907ec88Schengguanghui blockCommit := traceBuffer.io.out.blockCommit 584907ec88Schengguanghui 594907ec88Schengguanghui /** 604907ec88Schengguanghui * stage 3: groups with iaddr from pcMem(ftqidx & ftqOffset -> iaddr) -> encoder 614907ec88Schengguanghui */ 62*c308d936Schengguanghui val s3_in_groups = s2_out_groups 63*c308d936Schengguanghui val s3_out_groups = RegNext(s3_in_groups) 64*c308d936Schengguanghui toPcMem := s3_in_groups 654907ec88Schengguanghui 664907ec88Schengguanghui for(i <- 0 until TraceGroupNum) { 67*c308d936Schengguanghui toEncoder.blocks(i).valid := s3_out_groups.blocks(i).valid 68*c308d936Schengguanghui toEncoder.blocks(i).bits.iaddr.foreach(_ := Mux(s3_out_groups.blocks(i).valid, fromPcMem(i), 0.U)) 69*c308d936Schengguanghui toEncoder.blocks(i).bits.tracePipe := s3_out_groups.blocks(i).bits.tracePipe 704907ec88Schengguanghui } 714907ec88Schengguanghui if(backendParams.debugEn) { 72*c308d936Schengguanghui dontTouch(io.out.toEncoder) 734907ec88Schengguanghui } 744907ec88Schengguanghui}