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, 11*725e8ddcSchengguanghui val TraceGroupNum : Int, 12*725e8ddcSchengguanghui val PrivWidth : Int, 13*725e8ddcSchengguanghui val ItypeWidth : Int, 14*725e8ddcSchengguanghui val IlastsizeWidth : Int, 154907ec88Schengguanghui) 164907ec88Schengguanghui 174907ec88Schengguanghuiclass TraceIO(implicit val p: Parameters) extends Bundle with HasXSParameter { 184907ec88Schengguanghui val fromEncoder = Input(new FromEncoder) 194907ec88Schengguanghui val fromRob = Flipped(new TraceBundle(hasIaddr = false, CommitWidth, IretireWidthInPipe)) 204907ec88Schengguanghui val blockRobCommit = Output(Bool()) 214907ec88Schengguanghui val toPcMem = Vec(TraceGroupNum, ValidIO(new TraceBlock(false, IretireWidthCompressed))) 224907ec88Schengguanghui val fromPcMem = Input(Vec(TraceGroupNum, UInt(IaddrWidth.W))) 234907ec88Schengguanghui val toEncoder = new TraceBundle(hasIaddr = true, TraceGroupNum, IretireWidthCompressed) 244907ec88Schengguanghui} 254907ec88Schengguanghui 264907ec88Schengguanghuiclass Trace(implicit val p: Parameters) extends Module with HasXSParameter { 274907ec88Schengguanghui val io = IO(new TraceIO) 284907ec88Schengguanghui val (fromEncoder, fromRob, toPcMem, fromPcMem, toEncoder) = (io.fromEncoder, io.fromRob, io.toPcMem, io.fromPcMem, io.toEncoder) 294907ec88Schengguanghui 304907ec88Schengguanghui /** 314907ec88Schengguanghui * stage 0: CommitInfo from rob 324907ec88Schengguanghui */ 334907ec88Schengguanghui val blockCommit = Wire(Bool()) 344907ec88Schengguanghui io.blockRobCommit := blockCommit 354907ec88Schengguanghui 364907ec88Schengguanghui /** 374907ec88Schengguanghui * stage 1: regNext(robCommitInfo) 384907ec88Schengguanghui */ 394907ec88Schengguanghui val s1_in = fromRob 404907ec88Schengguanghui val s1_out = WireInit(0.U.asTypeOf(s1_in)) 414907ec88Schengguanghui 424907ec88Schengguanghui for(i <- 0 until CommitWidth) { 43*725e8ddcSchengguanghui // Trap only occor in block(0). 44*725e8ddcSchengguanghui 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)) 45*725e8ddcSchengguanghui s1_out.blocks(i).valid := RegEnable(s1_in.blocks(i).valid, 0.U.asTypeOf(s1_in.blocks(i).valid), !blockCommit) 46*725e8ddcSchengguanghui 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 564907ec88Schengguanghui val s2_out_trap = traceBuffer.io.out.groups.trap 574907ec88Schengguanghui val s2_out_block = traceBuffer.io.out.groups.blocks 584907ec88Schengguanghui blockCommit := traceBuffer.io.out.blockCommit 594907ec88Schengguanghui 604907ec88Schengguanghui /** 614907ec88Schengguanghui * stage 3: groups with iaddr from pcMem(ftqidx & ftqOffset -> iaddr) -> encoder 624907ec88Schengguanghui */ 634907ec88Schengguanghui val s3_in_trap = s2_out_trap 644907ec88Schengguanghui val s3_in_block = s2_out_block 654907ec88Schengguanghui 664907ec88Schengguanghui val s3_out_trap = RegNext(s3_in_trap) 674907ec88Schengguanghui val s3_out_block = RegNext(s3_in_block) 684907ec88Schengguanghui 694907ec88Schengguanghui toPcMem := s3_in_block 704907ec88Schengguanghui 714907ec88Schengguanghui for(i <- 0 until TraceGroupNum) { 724907ec88Schengguanghui toEncoder.trap := s3_out_trap 734907ec88Schengguanghui toEncoder.blocks(i).valid := s3_out_block(i).valid 74*725e8ddcSchengguanghui toEncoder.blocks(i).bits.iaddr.foreach(_ := Mux(s3_out_block(i).valid, fromPcMem(i), 0.U)) 754907ec88Schengguanghui toEncoder.blocks(i).bits.tracePipe := s3_out_block(i).bits.tracePipe 764907ec88Schengguanghui } 774907ec88Schengguanghui if(backendParams.debugEn){ 784907ec88Schengguanghui dontTouch(io.toEncoder) 794907ec88Schengguanghui } 804907ec88Schengguanghui} 814907ec88Schengguanghui 824907ec88Schengguanghui 834907ec88Schengguanghui 844907ec88Schengguanghui 854907ec88Schengguanghui 864907ec88Schengguanghui 87