Roq.scala 16.4 KB
Newer Older
1 2
package xiangshan.backend.roq

3
import chisel3.ExcitingUtils._
4 5 6
import chisel3._
import chisel3.util._
import xiangshan._
L
LinJiawei 已提交
7
import utils._
8
import chisel3.util.experimental.BoringUtils
L
Opt roq  
LinJiawei 已提交
9
import xiangshan.backend.LSUOpType
L
LinJiawei 已提交
10
import xiangshan.backend.decode.isa.Privileged.WFI
11

Y
Yinan Xu 已提交
12

Y
Yinan Xu 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
class RoqPtr extends CircularQueuePtr(RoqPtr.RoqSize) with HasCircularQueuePtrHelper {
  def needFlush(redirect: Valid[Redirect]): Bool = {
    redirect.valid && (redirect.bits.isException || redirect.bits.isFlushPipe || isAfter(this, redirect.bits.roqIdx))
  }
}

object RoqPtr extends HasXSParameter {
  def apply(f: Bool, v: UInt): RoqPtr = {
    val ptr = Wire(new RoqPtr)
    ptr.flag := f
    ptr.value := v
    ptr
  }
}


class Roq extends XSModule with HasCircularQueuePtrHelper {
30 31
  val io = IO(new Bundle() {
    val brqRedirect = Input(Valid(new Redirect))
W
William Wang 已提交
32
    val memRedirect = Input(Valid(new Redirect))
33
    val dp1Req = Vec(RenameWidth, Flipped(DecoupledIO(new MicroOp)))
Y
Yinan Xu 已提交
34
    val roqIdxs = Output(Vec(RenameWidth, new RoqPtr))
35
    val redirect = Output(Valid(new Redirect))
36
    val exception = Output(new MicroOp)
L
LinJiawei 已提交
37
    // exu + brq
L
LinJiawei 已提交
38
    val exeWbResults = Vec(exuParameters.ExuCnt + 1, Flipped(ValidIO(new ExuOutput)))
39
    val commits = Vec(CommitWidth, Valid(new RoqCommit))
40
    val bcommit = Output(UInt(BrTagWidth.W))
41
    val commitRoqIndex = Output(Valid(new RoqPtr))
Y
Yinan Xu 已提交
42
    val roqDeqPtr = Output(new RoqPtr)
Y
Yinan Xu 已提交
43 44
    val intrBitSet = Input(Bool())
    val trapTarget = Input(UInt(VAddrBits.W))
45
  })
W
William Wang 已提交
46

L
LinJiawei 已提交
47 48
  val numWbPorts = io.exeWbResults.length

49
  val microOp = Mem(RoqSize, new MicroOp)
W
William Wang 已提交
50
  val valid = RegInit(VecInit(List.fill(RoqSize)(false.B)))
W
William Wang 已提交
51
  val flag = RegInit(VecInit(List.fill(RoqSize)(false.B)))
W
William Wang 已提交
52
  val writebacked = Reg(Vec(RoqSize, Bool()))
53 54 55

  val exuData = Reg(Vec(RoqSize, UInt(XLEN.W)))//for debug
  val exuDebug = Reg(Vec(RoqSize, new DebugBundle))//for debug
W
William Wang 已提交
56

Y
Yinan Xu 已提交
57 58 59 60 61 62 63 64 65
  val enqPtrExt = RegInit(0.U.asTypeOf(new RoqPtr))
  val deqPtrExt = RegInit(0.U.asTypeOf(new RoqPtr))
  val walkPtrExt = Reg(new RoqPtr)
  val walkTgtExt = Reg(new RoqPtr)
  val enqPtr = enqPtrExt.value
  val deqPtr = deqPtrExt.value
  val walkPtr = walkPtrExt.value
  val isEmpty = enqPtr === deqPtr && enqPtrExt.flag ===deqPtrExt.flag
  val isFull = enqPtr === deqPtr && enqPtrExt.flag =/= deqPtrExt.flag
L
Opt roq  
LinJiawei 已提交
66
  val notFull = !isFull
W
William Wang 已提交
67

W
William Wang 已提交
68
  val s_idle :: s_walk :: s_extrawalk :: Nil = Enum(3)
W
William Wang 已提交
69 70
  val state = RegInit(s_idle)

L
LinJiawei 已提交
71 72
  io.roqDeqPtr := deqPtrExt

W
William Wang 已提交
73
  // Dispatch
74 75 76
  val noSpecEnq = io.dp1Req.map(i => i.bits.ctrl.noSpecExec)
  val hasNoSpec = RegInit(false.B)
  when(isEmpty){ hasNoSpec:= false.B }
L
Opt roq  
LinJiawei 已提交
77
  val validDispatch = io.dp1Req.map(_.valid)
W
William Wang 已提交
78
  XSDebug("(ready, valid): ")
Y
Yinan Xu 已提交
79
  for (i <- 0 until RenameWidth) {
L
Opt roq  
LinJiawei 已提交
80 81
    val offset = PopCount(validDispatch.take(i))
    val roqIdxExt = enqPtrExt + offset
Y
Yinan Xu 已提交
82
    val roqIdx = roqIdxExt.value
L
Opt roq  
LinJiawei 已提交
83

W
William Wang 已提交
84
    when(io.dp1Req(i).fire()){
L
Opt roq  
LinJiawei 已提交
85 86
      microOp(roqIdx) := io.dp1Req(i).bits
      valid(roqIdx) := true.B
Y
Yinan Xu 已提交
87
      flag(roqIdx) := roqIdxExt.flag
L
Opt roq  
LinJiawei 已提交
88
      writebacked(roqIdx) := false.B
89
      when(noSpecEnq(i)){ hasNoSpec := true.B }
W
William Wang 已提交
90
    }
L
Opt roq  
LinJiawei 已提交
91
    io.dp1Req(i).ready := (notFull && !valid(roqIdx) && state === s_idle) &&
92 93
      (!noSpecEnq(i) || isEmpty) &&
      !hasNoSpec
L
Opt roq  
LinJiawei 已提交
94
    io.roqIdxs(i) := roqIdxExt
Y
Yinan Xu 已提交
95
    XSDebug(false, true.B, "(%d, %d) ", io.dp1Req(i).ready, io.dp1Req(i).valid)
W
William Wang 已提交
96
  }
Y
Yinan Xu 已提交
97
  XSDebug(false, true.B, "\n")
W
William Wang 已提交
98

L
Opt roq  
LinJiawei 已提交
99 100
  val firedDispatch = Cat(io.dp1Req.map(_.fire()))
  val dispatchCnt = PopCount(firedDispatch)
W
William Wang 已提交
101
  when(firedDispatch.orR){
L
Opt roq  
LinJiawei 已提交
102 103
    enqPtrExt := enqPtrExt + dispatchCnt
    XSInfo("dispatched %d insts\n", dispatchCnt)
W
William Wang 已提交
104 105 106
  }

  // Writeback
L
Opt roq  
LinJiawei 已提交
107
  val firedWriteback = io.exeWbResults.map(_.fire())
108
  XSInfo(PopCount(firedWriteback) > 0.U, "writebacked %d insts\n", PopCount(firedWriteback))
L
LinJiawei 已提交
109
  for(i <- 0 until numWbPorts){
W
William Wang 已提交
110
    when(io.exeWbResults(i).fire()){
L
Opt roq  
LinJiawei 已提交
111
      val wbIdxExt = io.exeWbResults(i).bits.uop.roqIdx
Y
Yinan Xu 已提交
112
      val wbIdx = wbIdxExt.value
L
Opt roq  
LinJiawei 已提交
113 114
      writebacked(wbIdx) := true.B
      microOp(wbIdx).cf.exceptionVec := io.exeWbResults(i).bits.uop.cf.exceptionVec
L
LinJiawei 已提交
115
      microOp(wbIdx).lsroqIdx := io.exeWbResults(i).bits.uop.lsroqIdx
116 117
      microOp(wbIdx).lqIdx := io.exeWbResults(i).bits.uop.lqIdx
      microOp(wbIdx).sqIdx := io.exeWbResults(i).bits.uop.sqIdx
Y
Yinan Xu 已提交
118
      microOp(wbIdx).ctrl.flushPipe := io.exeWbResults(i).bits.uop.ctrl.flushPipe
A
Allen 已提交
119
      microOp(wbIdx).diffTestDebugLrScValid := io.exeWbResults(i).bits.uop.diffTestDebugLrScValid
L
Opt roq  
LinJiawei 已提交
120 121 122 123
      exuData(wbIdx) := io.exeWbResults(i).bits.data
      exuDebug(wbIdx) := io.exeWbResults(i).bits.debug

      val debugUop = microOp(wbIdx)
Y
Yinan Xu 已提交
124 125 126 127
      XSInfo(true.B,
        p"writebacked pc 0x${Hexadecimal(debugUop.cf.pc)} wen ${debugUop.ctrl.rfWen} " +
        p"data 0x${Hexadecimal(io.exeWbResults(i).bits.data)} ldst ${debugUop.ctrl.ldest} pdst ${debugUop.ctrl.ldest} " +
        p"skip ${io.exeWbResults(i).bits.debug.isMMIO} roqIdx: ${wbIdxExt}\n"
128
      )
W
William Wang 已提交
129 130 131
    }
  }

132
  // roq redirect only used for exception
Y
Yinan Xu 已提交
133 134 135 136
  // val intrBitSet = WireInit(false.B)
  // ExcitingUtils.addSink(intrBitSet, "intrBitSetIDU")
  // val trapTarget = WireInit(0.U(VAddrBits.W))
  // ExcitingUtils.addSink(trapTarget, "trapTarget")
L
Opt roq  
LinJiawei 已提交
137 138

  val deqUop = microOp(deqPtr)
139
  val deqPtrWritebacked = writebacked(deqPtr) && valid(deqPtr)
Y
Yinan Xu 已提交
140
  val intrEnable = io.intrBitSet && !isEmpty && !hasNoSpec &&
141
    deqUop.ctrl.commitType =/= CommitType.STORE && deqUop.ctrl.commitType =/= CommitType.LOAD// TODO: wanna check why has hasCsr(hasNoSpec)
142 143
  val exceptionEnable = deqPtrWritebacked && Cat(deqUop.cf.exceptionVec).orR()
  val isFlushPipe = deqPtrWritebacked && deqUop.ctrl.flushPipe
144
  io.redirect := DontCare
145
  io.redirect.valid := (state === s_idle) && (intrEnable || exceptionEnable || isFlushPipe)// TODO: add fence flush to flush the whole pipe
146
  io.redirect.bits.isException := intrEnable || exceptionEnable
147 148
  // reuse isFlushPipe to represent interrupt for CSR
  io.redirect.bits.isFlushPipe := isFlushPipe || intrEnable
Y
Yinan Xu 已提交
149
  io.redirect.bits.target := Mux(isFlushPipe, deqUop.cf.pc + 4.U, io.trapTarget)
L
Opt roq  
LinJiawei 已提交
150
  io.exception := deqUop
Y
Yinan Xu 已提交
151
  XSDebug(io.redirect.valid, "generate redirect: pc 0x%x intr %d excp %d flushpp %d target:0x%x Traptarget 0x%x exceptionVec %b\n", io.exception.cf.pc, intrEnable, exceptionEnable, isFlushPipe, io.redirect.bits.target, io.trapTarget, Cat(microOp(deqPtr).cf.exceptionVec))
152

L
Opt roq  
LinJiawei 已提交
153
  // Commit uop to Rename (walk)
W
William Wang 已提交
154
  val shouldWalkVec = Wire(Vec(CommitWidth, Bool()))
L
Opt roq  
LinJiawei 已提交
155
  val walkPtrMatchVec  = Wire(Vec(CommitWidth, Bool()))
Y
Yinan Xu 已提交
156
  val walkPtrVec = Wire(Vec(CommitWidth, new RoqPtr))
L
Opt roq  
LinJiawei 已提交
157 158 159 160 161 162 163
  for(i <- shouldWalkVec.indices){
    walkPtrVec(i) := walkPtrExt - i.U
    walkPtrMatchVec(i) := walkPtrVec(i) === walkTgtExt
    if(i == 0) shouldWalkVec(i) := !walkPtrMatchVec(i)
    else shouldWalkVec(i) := shouldWalkVec(i-1) && !walkPtrMatchVec(i)
  }
  val walkFinished = Cat(walkPtrMatchVec).orR()
W
William Wang 已提交
164

W
William Wang 已提交
165
  // extra space is used weh roq has no enough space, but mispredict recovery needs such info to walk regmap
L
Opt roq  
LinJiawei 已提交
166 167 168
  val needExtraSpaceForMPR = WireInit(VecInit(
    List.tabulate(RenameWidth)(i => io.brqRedirect.valid && io.dp1Req(i).valid && !io.dp1Req(i).ready)
  ))
W
William Wang 已提交
169 170 171
  val extraSpaceForMPR = Reg(Vec(RenameWidth, new MicroOp))
  val usedSpaceForMPR = Reg(Vec(RenameWidth, Bool()))

L
Opt roq  
LinJiawei 已提交
172 173
  val storeCommitVec = WireInit(VecInit(Seq.fill(CommitWidth)(false.B)))
  val cfiCommitVec = WireInit(VecInit(Seq.fill(CommitWidth)(false.B)))
W
William Wang 已提交
174
  for(i <- 0 until CommitWidth){
W
William Wang 已提交
175 176 177
    io.commits(i) := DontCare
    switch(state){
      is(s_idle){
L
Opt roq  
LinJiawei 已提交
178 179 180
        val commitIdx = deqPtr + i.U
        val commitUop = microOp(commitIdx)
        val hasException = Cat(commitUop.cf.exceptionVec).orR() || intrEnable
181
        val canCommit = if(i!=0) (io.commits(i-1).valid && !io.commits(i-1).bits.uop.ctrl.flushPipe) else true.B
L
Opt roq  
LinJiawei 已提交
182 183 184 185 186 187
        val v = valid(commitIdx)
        val w = writebacked(commitIdx)
        io.commits(i).valid := v && w && canCommit && !hasException
        io.commits(i).bits.uop := commitUop

        storeCommitVec(i) := io.commits(i).valid &&
188
          commitUop.ctrl.commitType === CommitType.STORE
L
Opt roq  
LinJiawei 已提交
189 190 191 192 193

        cfiCommitVec(i) := io.commits(i).valid &&
          !commitUop.cf.brUpdate.pd.notCFI

        when(io.commits(i).valid){v := false.B}
W
William Wang 已提交
194
        XSInfo(io.commits(i).valid,
195
          "retired pc %x wen %d ldest %d pdest %x old_pdest %x data %x\n",
L
Opt roq  
LinJiawei 已提交
196 197 198
          commitUop.cf.pc,
          commitUop.ctrl.rfWen,
          commitUop.ctrl.ldest,
199 200
          commitUop.pdest,
          commitUop.old_pdest,
L
Opt roq  
LinJiawei 已提交
201
          exuData(commitIdx)
W
William Wang 已提交
202
        )
L
Opt roq  
LinJiawei 已提交
203
        XSInfo(io.commits(i).valid && exuDebug(commitIdx).isMMIO,
W
William Wang 已提交
204
          "difftest skiped pc0x%x\n",
L
Opt roq  
LinJiawei 已提交
205
          commitUop.cf.pc
W
William Wang 已提交
206 207 208 209
        )
      }

      is(s_walk){
Y
Yinan Xu 已提交
210
        val idx = walkPtrVec(i).value
L
Opt roq  
LinJiawei 已提交
211 212 213 214
        val v = valid(idx)
        val walkUop = microOp(idx)
        io.commits(i).valid := v && shouldWalkVec(i)
        io.commits(i).bits.uop := walkUop
W
William Wang 已提交
215
        when(shouldWalkVec(i)){
L
Opt roq  
LinJiawei 已提交
216
          v := false.B
W
William Wang 已提交
217
        }
L
Opt roq  
LinJiawei 已提交
218 219 220 221 222
        XSInfo(io.commits(i).valid && shouldWalkVec(i), "walked pc %x wen %d ldst %d data %x\n",
          walkUop.cf.pc,
          walkUop.ctrl.rfWen,
          walkUop.ctrl.ldest,
          exuData(idx)
W
William Wang 已提交
223 224 225 226
        )
      }

      is(s_extrawalk){
L
Opt roq  
LinJiawei 已提交
227 228 229 230
        val idx = RenameWidth-i-1
        val walkUop = extraSpaceForMPR(idx)
        io.commits(i).valid := usedSpaceForMPR(idx)
        io.commits(i).bits.uop := walkUop
W
William Wang 已提交
231
        state := s_walk
L
Opt roq  
LinJiawei 已提交
232 233 234 235
        XSInfo(io.commits(i).valid, "use extra space walked pc %x wen %d ldst %d\n",
          walkUop.cf.pc,
          walkUop.ctrl.rfWen,
          walkUop.ctrl.ldest
W
William Wang 已提交
236
        )
237
      }
W
William Wang 已提交
238
    }
W
William Wang 已提交
239
    io.commits(i).bits.isWalk := state =/= s_idle
W
William Wang 已提交
240
  }
W
William Wang 已提交
241

L
Opt roq  
LinJiawei 已提交
242
  val validCommit = io.commits.map(_.valid)
W
William Wang 已提交
243 244 245 246 247
  when(state===s_walk) {
    //exit walk state when all roq entry is commited
    when(walkFinished) {
      state := s_idle
    }
L
Opt roq  
LinJiawei 已提交
248
    walkPtrExt := walkPtrExt - CommitWidth.U
W
William Wang 已提交
249
    // ringBufferWalkExtended := ringBufferWalkExtended - validCommit
Y
Yinan Xu 已提交
250
    XSInfo("rolling back: enqPtr %d deqPtr %d walk %d:%d\n", enqPtr, deqPtr, walkPtrExt.flag, walkPtr)
251
  }
W
William Wang 已提交
252

W
William Wang 已提交
253
  // move tail ptr
L
Opt roq  
LinJiawei 已提交
254
  val commitCnt = PopCount(validCommit)
W
William Wang 已提交
255
  when(state === s_idle){
L
Opt roq  
LinJiawei 已提交
256
    deqPtrExt := deqPtrExt + commitCnt
W
William Wang 已提交
257
  }
L
Opt roq  
LinJiawei 已提交
258
  val retireCounter = Mux(state === s_idle, commitCnt, 0.U)
W
William Wang 已提交
259
  XSInfo(retireCounter > 0.U, "retired %d insts\n", retireCounter)
260 261 262
  val commitOffset = PriorityEncoder((validCommit :+ false.B).map(!_))
  io.commitRoqIndex.valid := io.commits(0).valid && !io.commits(0).bits.isWalk
  io.commitRoqIndex.bits := deqPtrExt + commitOffset
W
William Wang 已提交
263

264
  // commit branch to brq
L
Opt roq  
LinJiawei 已提交
265
  io.bcommit := PopCount(cfiCommitVec)
266

W
William Wang 已提交
267
  // when redirect, walk back roq entries
268
  when(io.brqRedirect.valid){ // TODO: need check if consider exception redirect?
W
William Wang 已提交
269
    state := s_walk
270
    walkPtrExt := Mux(state === s_walk && !walkFinished, walkPtrExt - CommitWidth.U, Mux(state === s_extrawalk, walkPtrExt, enqPtrExt - 1.U + dispatchCnt))
L
Opt roq  
LinJiawei 已提交
271 272
    walkTgtExt := io.brqRedirect.bits.roqIdx
    enqPtrExt := io.brqRedirect.bits.roqIdx + 1.U
W
William Wang 已提交
273
  }
W
William Wang 已提交
274

W
William Wang 已提交
275
  // no enough space for walk, allocate extra space
W
William Wang 已提交
276 277
  when(needExtraSpaceForMPR.asUInt.orR && io.brqRedirect.valid){
    usedSpaceForMPR := needExtraSpaceForMPR
L
Opt roq  
LinJiawei 已提交
278
    (0 until RenameWidth).foreach(i => extraSpaceForMPR(i) := io.dp1Req(i).bits)
W
William Wang 已提交
279 280
    state := s_extrawalk
    XSDebug("roq full, switched to s_extrawalk. needExtraSpaceForMPR: %b\n", needExtraSpaceForMPR.asUInt)
W
William Wang 已提交
281 282
  }

W
William Wang 已提交
283
  // when rollback, reset writebacked entry to valid
284
  when(io.memRedirect.valid) { // TODO: opt timing
W
William Wang 已提交
285
    for (i <- 0 until RoqSize) {
Y
Yinan Xu 已提交
286 287
      val recRoqIdx = RoqPtr(flag(i), i.U)
      when (valid(i) && isAfter(recRoqIdx, io.memRedirect.bits.roqIdx)) {
W
William Wang 已提交
288 289 290 291 292
        writebacked(i) := false.B
      }
    }
  }

293
  // when exception occurs, cancels all
294
  when (io.redirect.valid) { // TODO: need check for flushPipe
Y
Yinan Xu 已提交
295 296
    enqPtrExt := 0.U.asTypeOf(new RoqPtr)
    deqPtrExt := 0.U.asTypeOf(new RoqPtr)
Y
Yinan Xu 已提交
297 298 299
    for (i <- 0 until RoqSize) {
      valid(i) := false.B
    }
300
  }
301

W
William Wang 已提交
302
  // debug info
Y
Yinan Xu 已提交
303
  XSDebug(p"enqPtr ${enqPtrExt} deqPtr ${deqPtrExt}\n")
W
William Wang 已提交
304
  XSDebug("")
Y
Yinan Xu 已提交
305 306 307 308
  for(i <- 0 until RoqSize){
    XSDebug(false, !valid(i), "-")
    XSDebug(false, valid(i) && writebacked(i), "w")
    XSDebug(false, valid(i) && !writebacked(i), "v")
W
William Wang 已提交
309
  }
Y
Yinan Xu 已提交
310 311 312 313 314 315 316 317 318
  XSDebug(false, true.B, "\n")

  for(i <- 0 until RoqSize){
    if(i % 4 == 0) XSDebug("")
    XSDebug(false, true.B, "%x ", microOp(i).cf.pc)
    XSDebug(false, !valid(i), "- ")
    XSDebug(false, valid(i) && writebacked(i), "w ")
    XSDebug(false, valid(i) && !writebacked(i), "v ")
    if(i % 4 == 3) XSDebug(false, true.B, "\n")
W
William Wang 已提交
319
  }
W
William Wang 已提交
320

321
  //difftest signals
L
Opt roq  
LinJiawei 已提交
322
  val firstValidCommit = deqPtr + PriorityMux(validCommit, VecInit(List.tabulate(CommitWidth)(_.U)))
323

324 325 326 327
  val skip = Wire(Vec(CommitWidth, Bool()))
  val wen = Wire(Vec(CommitWidth, Bool()))
  val wdata = Wire(Vec(CommitWidth, UInt(XLEN.W)))
  val wdst = Wire(Vec(CommitWidth, UInt(32.W)))
A
Allen 已提交
328
  val diffTestDebugLrScValid = Wire(Vec(CommitWidth, Bool()))
329
  val wpc = Wire(Vec(CommitWidth, UInt(XLEN.W)))
330
  val trapVec = Wire(Vec(CommitWidth, Bool()))
331
  val isRVC = Wire(Vec(CommitWidth, Bool()))
332
  for(i <- 0 until CommitWidth){
333
    // io.commits(i).valid
L
Opt roq  
LinJiawei 已提交
334 335
    val idx = deqPtr+i.U
    val uop = io.commits(i).bits.uop
A
Allen 已提交
336
    val DifftestSkipSC = false
W
William Wang 已提交
337 338 339 340 341 342 343 344 345
    if(!DifftestSkipSC){
      skip(i) := exuDebug(idx).isMMIO && io.commits(i).valid
    }else{
      skip(i) := (
          exuDebug(idx).isMMIO || 
          uop.ctrl.fuType === FuType.mou && uop.ctrl.fuOpType === LSUOpType.sc_d ||
          uop.ctrl.fuType === FuType.mou && uop.ctrl.fuOpType === LSUOpType.sc_w
        ) && io.commits(i).valid
    }
346 347 348
    wen(i) := io.commits(i).valid && uop.ctrl.rfWen && uop.ctrl.ldest =/= 0.U
    wdata(i) := exuData(idx)
    wdst(i) := uop.ctrl.ldest
A
Allen 已提交
349
    diffTestDebugLrScValid(i) := uop.diffTestDebugLrScValid
350
    wpc(i) := SignExt(uop.cf.pc, XLEN)
351
    trapVec(i) := io.commits(i).valid && (state===s_idle) && uop.ctrl.isXSTrap
352
    isRVC(i) := uop.cf.brUpdate.pd.isRVC
353
  }
354 355 356 357 358

  val scFailed = !diffTestDebugLrScValid(0) && 
    io.commits(0).bits.uop.ctrl.fuType === FuType.mou &&
    (io.commits(0).bits.uop.ctrl.fuOpType === LSUOpType.sc_d || io.commits(0).bits.uop.ctrl.fuOpType === LSUOpType.sc_w)

359 360
  val instrCnt = RegInit(0.U(64.W))
  instrCnt := instrCnt + retireCounter
361

362
  val difftestIntrNO = WireInit(0.U(XLEN.W))
363
  val difftestCause = WireInit(0.U(XLEN.W))
364
  ExcitingUtils.addSink(difftestIntrNO, "difftestIntrNOfromCSR")
365 366
  ExcitingUtils.addSink(difftestCause, "difftestCausefromCSR")

Y
Yinan Xu 已提交
367 368
  XSDebug(difftestIntrNO =/= 0.U, "difftest intrNO set %x\n", difftestIntrNO)
  val retireCounterFix = Mux(io.redirect.valid, 1.U, retireCounter)
369
  val retirePCFix = SignExt(Mux(io.redirect.valid, microOp(deqPtr).cf.pc, microOp(firstValidCommit).cf.pc), XLEN)
L
Opt roq  
LinJiawei 已提交
370
  val retireInstFix = Mux(io.redirect.valid, microOp(deqPtr).cf.instr, microOp(firstValidCommit).cf.instr)
L
LinJiawei 已提交
371
  if(!env.FPGAPlatform){
Y
Yinan Xu 已提交
372 373 374
    BoringUtils.addSource(RegNext(retireCounterFix), "difftestCommit")
    BoringUtils.addSource(RegNext(retirePCFix), "difftestThisPC")//first valid PC
    BoringUtils.addSource(RegNext(retireInstFix), "difftestThisINST")//first valid inst
375
    BoringUtils.addSource(RegNext(skip.asUInt), "difftestSkip")
376 377
    // BoringUtils.addSource(RegNext(false.B), "difftestIsRVC")//FIXIT
    BoringUtils.addSource(RegNext(isRVC.asUInt), "difftestIsRVC")
378 379 380 381
    BoringUtils.addSource(RegNext(wen.asUInt), "difftestWen")
    BoringUtils.addSource(RegNext(wpc), "difftestWpc")
    BoringUtils.addSource(RegNext(wdata), "difftestWdata")
    BoringUtils.addSource(RegNext(wdst), "difftestWdst")
382
    BoringUtils.addSource(RegNext(scFailed), "difftestScFailed")
383
    BoringUtils.addSource(RegNext(difftestIntrNO), "difftestIntrNO")
384
    BoringUtils.addSource(RegNext(difftestCause), "difftestCause")
385

L
LinJiawei 已提交
386 387
    val hitTrap = trapVec.reduce(_||_)
    val trapCode = PriorityMux(wdata.zip(trapVec).map(x => x._2 -> x._1))
388
    val trapPC = SignExt(PriorityMux(wpc.zip(trapVec).map(x => x._2 ->x._1)), XLEN)
389

390 391 392 393 394
    ExcitingUtils.addSource(RegNext(hitTrap), "trapValid")
    ExcitingUtils.addSource(RegNext(trapCode), "trapCode")
    ExcitingUtils.addSource(RegNext(trapPC), "trapPC")
    ExcitingUtils.addSource(RegNext(GTimer()), "trapCycleCnt")
    ExcitingUtils.addSource(RegNext(instrCnt), "trapInstrCnt")
395
    ExcitingUtils.addSource(state === s_walk || state === s_extrawalk, "perfCntCondRoqWalk", Perf)
Y
Yinan Xu 已提交
396 397 398 399 400 401
    val deqNotWritebacked = valid(deqPtr) && !writebacked(deqPtr)
    val deqUopCommitType = deqUop.ctrl.commitType
    ExcitingUtils.addSource(deqNotWritebacked && deqUopCommitType === CommitType.INT,   "perfCntCondRoqWaitInt",   Perf)
    ExcitingUtils.addSource(deqNotWritebacked && deqUopCommitType === CommitType.FP,    "perfCntCondRoqWaitFp",    Perf)
    ExcitingUtils.addSource(deqNotWritebacked && deqUopCommitType === CommitType.LOAD,  "perfCntCondRoqWaitLoad",  Perf)
    ExcitingUtils.addSource(deqNotWritebacked && deqUopCommitType === CommitType.STORE, "perfCntCondRoqWaitStore", Perf)
Z
ZhangZifei 已提交
402

J
jinyue110 已提交
403
    if(EnableBPU){
404
      ExcitingUtils.addSource(hitTrap, "XSTRAP", ConnectionType.Debug)
J
jinyue110 已提交
405
    }
406
  }
407
}