xref: /XiangShan/src/main/scala/xiangshan/backend/trace/Trace.scala (revision 4907ec88f25e7ff79bea521d62f22e5e23b24a21)
1*4907ec88Schengguanghuipackage xiangshan.backend.trace
2*4907ec88Schengguanghui
3*4907ec88Schengguanghuiimport chisel3._
4*4907ec88Schengguanghuiimport chisel3.util.{RegEnable, ValidIO, log2Up}
5*4907ec88Schengguanghuiimport org.chipsalliance.cde.config.Parameters
6*4907ec88Schengguanghuiimport xiangshan.HasXSParameter
7*4907ec88Schengguanghui
8*4907ec88Schengguanghuiclass TraceParams(
9*4907ec88Schengguanghui val TraceGroupNum         : Int,
10*4907ec88Schengguanghui val HasEncoder            : Boolean,
11*4907ec88Schengguanghui val TraceEnable           : Boolean,
12*4907ec88Schengguanghui)
13*4907ec88Schengguanghui
14*4907ec88Schengguanghuiclass TraceIO(implicit val p: Parameters) extends Bundle with HasXSParameter {
15*4907ec88Schengguanghui  val fromEncoder    = Input(new FromEncoder)
16*4907ec88Schengguanghui  val fromRob        = Flipped(new TraceBundle(hasIaddr = false, CommitWidth, IretireWidthInPipe))
17*4907ec88Schengguanghui  val blockRobCommit = Output(Bool())
18*4907ec88Schengguanghui  val toPcMem        = Vec(TraceGroupNum, ValidIO(new TraceBlock(false, IretireWidthCompressed)))
19*4907ec88Schengguanghui  val fromPcMem      = Input(Vec(TraceGroupNum, UInt(IaddrWidth.W)))
20*4907ec88Schengguanghui  val toEncoder      = new TraceBundle(hasIaddr = true, TraceGroupNum, IretireWidthCompressed)
21*4907ec88Schengguanghui}
22*4907ec88Schengguanghui
23*4907ec88Schengguanghuiclass Trace(implicit val p: Parameters) extends Module with HasXSParameter {
24*4907ec88Schengguanghui  val io = IO(new TraceIO)
25*4907ec88Schengguanghui  val (fromEncoder, fromRob, toPcMem, fromPcMem, toEncoder) = (io.fromEncoder, io.fromRob, io.toPcMem, io.fromPcMem, io.toEncoder)
26*4907ec88Schengguanghui
27*4907ec88Schengguanghui  /**
28*4907ec88Schengguanghui   * stage 0: CommitInfo from rob
29*4907ec88Schengguanghui   */
30*4907ec88Schengguanghui  val blockCommit = Wire(Bool())
31*4907ec88Schengguanghui  io.blockRobCommit := blockCommit
32*4907ec88Schengguanghui
33*4907ec88Schengguanghui  /**
34*4907ec88Schengguanghui   * stage 1: regNext(robCommitInfo)
35*4907ec88Schengguanghui   */
36*4907ec88Schengguanghui  val s1_in = fromRob
37*4907ec88Schengguanghui  val s1_out = WireInit(0.U.asTypeOf(s1_in))
38*4907ec88Schengguanghui
39*4907ec88Schengguanghui  for(i <- 0 until CommitWidth) {
40*4907ec88Schengguanghui    if(i == 0){
41*4907ec88Schengguanghui      s1_out.trap := RegEnable(s1_in.trap, s1_in.blocks(i).valid)
42*4907ec88Schengguanghui    }
43*4907ec88Schengguanghui    s1_out.blocks(i).valid := RegEnable(s1_in.blocks(i).valid, !blockCommit)
44*4907ec88Schengguanghui    s1_out.blocks(i).bits := RegEnable(s1_in.blocks(i).bits, s1_in.blocks(i).valid)
45*4907ec88Schengguanghui  }
46*4907ec88Schengguanghui
47*4907ec88Schengguanghui  /**
48*4907ec88Schengguanghui   * stage 2: compress, s2_out(deq from traceBuffer) -> pcMem
49*4907ec88Schengguanghui   */
50*4907ec88Schengguanghui  val s2_in = s1_out
51*4907ec88Schengguanghui  val traceBuffer = Module(new TraceBuffer)
52*4907ec88Schengguanghui  traceBuffer.io.in.fromEncoder := fromEncoder
53*4907ec88Schengguanghui  traceBuffer.io.in.fromRob := s2_in
54*4907ec88Schengguanghui  val s2_out_trap = traceBuffer.io.out.groups.trap
55*4907ec88Schengguanghui  val s2_out_block = traceBuffer.io.out.groups.blocks
56*4907ec88Schengguanghui  blockCommit := traceBuffer.io.out.blockCommit
57*4907ec88Schengguanghui
58*4907ec88Schengguanghui  /**
59*4907ec88Schengguanghui   * stage 3: groups with iaddr from pcMem(ftqidx & ftqOffset -> iaddr) -> encoder
60*4907ec88Schengguanghui   */
61*4907ec88Schengguanghui  val s3_in_trap = s2_out_trap
62*4907ec88Schengguanghui  val s3_in_block = s2_out_block
63*4907ec88Schengguanghui
64*4907ec88Schengguanghui  val s3_out_trap  = RegNext(s3_in_trap)
65*4907ec88Schengguanghui  val s3_out_block = RegNext(s3_in_block)
66*4907ec88Schengguanghui
67*4907ec88Schengguanghui  toPcMem := s3_in_block
68*4907ec88Schengguanghui
69*4907ec88Schengguanghui  io.toEncoder := DontCare
70*4907ec88Schengguanghui  for(i <- 0 until TraceGroupNum) {
71*4907ec88Schengguanghui    toEncoder.trap := s3_out_trap
72*4907ec88Schengguanghui    toEncoder.blocks(i).bits.iaddr.foreach(_ := fromPcMem(i))
73*4907ec88Schengguanghui    toEncoder.blocks(i).valid := s3_out_block(i).valid
74*4907ec88Schengguanghui    toEncoder.blocks(i).bits.tracePipe := s3_out_block(i).bits.tracePipe
75*4907ec88Schengguanghui  }
76*4907ec88Schengguanghui  if(backendParams.debugEn){
77*4907ec88Schengguanghui    dontTouch(io.toEncoder)
78*4907ec88Schengguanghui  }
79*4907ec88Schengguanghui}
80*4907ec88Schengguanghui
81*4907ec88Schengguanghui
82*4907ec88Schengguanghui
83*4907ec88Schengguanghui
84*4907ec88Schengguanghui
85*4907ec88Schengguanghui
86