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