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