xref: /XiangShan/src/main/scala/xiangshan/backend/trace/Trace.scala (revision fd448a9d595e5d45a847c41429d2cb838496664e)
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