xref: /XiangShan/src/main/scala/xiangshan/backend/trace/Trace.scala (revision 551cc69652871252ca515869e1e2446093fa62bb)
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(
94907ec88Schengguanghui  val HasEncoder     : Boolean,
104907ec88Schengguanghui  val TraceEnable    : Boolean,
11725e8ddcSchengguanghui  val TraceGroupNum  : Int,
12*551cc696Schengguanghui  val IaddrWidth     : Int,
13725e8ddcSchengguanghui  val PrivWidth      : Int,
14725e8ddcSchengguanghui  val ItypeWidth     : Int,
15725e8ddcSchengguanghui  val IlastsizeWidth : Int,
164907ec88Schengguanghui)
174907ec88Schengguanghui
184907ec88Schengguanghuiclass TraceIO(implicit val p: Parameters) extends Bundle with HasXSParameter {
194907ec88Schengguanghui  val fromEncoder    = Input(new FromEncoder)
204907ec88Schengguanghui  val fromRob        = Flipped(new TraceBundle(hasIaddr = false, CommitWidth, IretireWidthInPipe))
214907ec88Schengguanghui  val blockRobCommit = Output(Bool())
224907ec88Schengguanghui  val toPcMem        = Vec(TraceGroupNum, ValidIO(new TraceBlock(false, IretireWidthCompressed)))
234907ec88Schengguanghui  val fromPcMem      = Input(Vec(TraceGroupNum, UInt(IaddrWidth.W)))
244907ec88Schengguanghui  val toEncoder      = new TraceBundle(hasIaddr = true, TraceGroupNum, IretireWidthCompressed)
254907ec88Schengguanghui}
264907ec88Schengguanghui
274907ec88Schengguanghuiclass Trace(implicit val p: Parameters) extends Module with HasXSParameter {
284907ec88Schengguanghui  val io = IO(new TraceIO)
294907ec88Schengguanghui  val (fromEncoder, fromRob, toPcMem, fromPcMem, toEncoder) = (io.fromEncoder, io.fromRob, io.toPcMem, io.fromPcMem, io.toEncoder)
304907ec88Schengguanghui
314907ec88Schengguanghui  /**
324907ec88Schengguanghui   * stage 0: CommitInfo from rob
334907ec88Schengguanghui   */
344907ec88Schengguanghui  val blockCommit = Wire(Bool())
354907ec88Schengguanghui  io.blockRobCommit := blockCommit
364907ec88Schengguanghui
374907ec88Schengguanghui  /**
384907ec88Schengguanghui   * stage 1: regNext(robCommitInfo)
394907ec88Schengguanghui   */
404907ec88Schengguanghui  val s1_in = fromRob
414907ec88Schengguanghui  val s1_out = WireInit(0.U.asTypeOf(s1_in))
424907ec88Schengguanghui
434907ec88Schengguanghui  for(i <- 0 until CommitWidth) {
44725e8ddcSchengguanghui    // Trap only occor in block(0).
45725e8ddcSchengguanghui    s1_out.trap := RegEnable(s1_in.trap, 0.U.asTypeOf(s1_in.trap), s1_in.blocks(0).valid && Itype.isTrap(s1_in.blocks(0).bits.tracePipe.itype))
46725e8ddcSchengguanghui    s1_out.blocks(i).valid := RegEnable(s1_in.blocks(i).valid, 0.U.asTypeOf(s1_in.blocks(i).valid), !blockCommit)
47725e8ddcSchengguanghui    s1_out.blocks(i).bits := RegEnable(s1_in.blocks(i).bits, 0.U.asTypeOf(s1_in.blocks(i).bits), s1_in.blocks(i).valid)
484907ec88Schengguanghui  }
494907ec88Schengguanghui
504907ec88Schengguanghui  /**
514907ec88Schengguanghui   * stage 2: compress, s2_out(deq from traceBuffer) -> pcMem
524907ec88Schengguanghui   */
534907ec88Schengguanghui  val s2_in = s1_out
544907ec88Schengguanghui  val traceBuffer = Module(new TraceBuffer)
554907ec88Schengguanghui  traceBuffer.io.in.fromEncoder := fromEncoder
564907ec88Schengguanghui  traceBuffer.io.in.fromRob := s2_in
574907ec88Schengguanghui  val s2_out_trap = traceBuffer.io.out.groups.trap
584907ec88Schengguanghui  val s2_out_block = traceBuffer.io.out.groups.blocks
594907ec88Schengguanghui  blockCommit := traceBuffer.io.out.blockCommit
604907ec88Schengguanghui
614907ec88Schengguanghui  /**
624907ec88Schengguanghui   * stage 3: groups with iaddr from pcMem(ftqidx & ftqOffset -> iaddr) -> encoder
634907ec88Schengguanghui   */
644907ec88Schengguanghui  val s3_in_trap = s2_out_trap
654907ec88Schengguanghui  val s3_in_block = s2_out_block
664907ec88Schengguanghui
674907ec88Schengguanghui  val s3_out_trap  = RegNext(s3_in_trap)
684907ec88Schengguanghui  val s3_out_block = RegNext(s3_in_block)
694907ec88Schengguanghui
704907ec88Schengguanghui  toPcMem := s3_in_block
714907ec88Schengguanghui
724907ec88Schengguanghui  for(i <- 0 until TraceGroupNum) {
734907ec88Schengguanghui    toEncoder.trap := s3_out_trap
744907ec88Schengguanghui    toEncoder.blocks(i).valid := s3_out_block(i).valid
75725e8ddcSchengguanghui    toEncoder.blocks(i).bits.iaddr.foreach(_ := Mux(s3_out_block(i).valid, fromPcMem(i), 0.U))
764907ec88Schengguanghui    toEncoder.blocks(i).bits.tracePipe := s3_out_block(i).bits.tracePipe
774907ec88Schengguanghui  }
784907ec88Schengguanghui  if(backendParams.debugEn){
794907ec88Schengguanghui    dontTouch(io.toEncoder)
804907ec88Schengguanghui  }
814907ec88Schengguanghui}
824907ec88Schengguanghui
834907ec88Schengguanghui
844907ec88Schengguanghui
854907ec88Schengguanghui
864907ec88Schengguanghui
874907ec88Schengguanghui
88