xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/Debug.scala (revision 075d493727e8b112c3e7bd97b06b5e1d167aba73)
14ac3bf33Schengguanghuipackage xiangshan.backend.fu.NewCSR
24ac3bf33Schengguanghui
34ac3bf33Schengguanghuiimport chisel3._
44ac3bf33Schengguanghuiimport chisel3.util._
54ac3bf33Schengguanghuiimport org.chipsalliance.cde.config.Parameters
6*3c808de0SAnzoimport xiangshan.cache.HasDCacheParameters
74ac3bf33Schengguanghuiimport xiangshan.backend.fu.NewCSR.CSRBundles.PrivState
804b415dbSchengguanghuiimport xiangshan.backend.fu.util.SdtrigExt
94ac3bf33Schengguanghuiimport xiangshan._
10*3c808de0SAnzoimport utils._
114ac3bf33Schengguanghui
124ac3bf33Schengguanghuiclass Debug(implicit val p: Parameters) extends Module with HasXSParameter {
134ac3bf33Schengguanghui  val io = IO(new DebugIO)
144ac3bf33Schengguanghui
154ac3bf33Schengguanghui  private val trapInfo        = io.in.trapInfo
164ac3bf33Schengguanghui  private val hasTrap         = trapInfo.valid
174ac3bf33Schengguanghui  private val trapIsInterrupt = trapInfo.bits.isInterrupt
1822872cfdSsinceforYy  private val isDebugIntr     = trapInfo.bits.isDebugIntr
194ac3bf33Schengguanghui  private val trapVec         = trapInfo.bits.trapVec
204ac3bf33Schengguanghui  private val singleStep      = trapInfo.bits.singleStep
217e0f64b0SGuanghui Cheng  private val trigger         = io.in.trapInfo.bits.trigger
224ac3bf33Schengguanghui
234ac3bf33Schengguanghui  private val privState = io.in.privState
244ac3bf33Schengguanghui  private val debugMode = io.in.debugMode
254ac3bf33Schengguanghui
264ac3bf33Schengguanghui  private val dcsr = io.in.dcsr
274ac3bf33Schengguanghui  private val tselect = io.in.tselect
284ac3bf33Schengguanghui  private val tdata1Selected = io.in.tdata1Selected
294ac3bf33Schengguanghui  private val tdata2Selected = io.in.tdata2Selected
304ac3bf33Schengguanghui  private val tdata1Vec = io.in.tdata1Vec
314ac3bf33Schengguanghui
324ac3bf33Schengguanghui  private val tdata1Update  = io.in.tdata1Update
334ac3bf33Schengguanghui  private val tdata2Update  = io.in.tdata2Update
344ac3bf33Schengguanghui  private val tdata1Wdata   = io.in.tdata1Wdata
354ac3bf33Schengguanghui
364ac3bf33Schengguanghui  /**
374ac3bf33Schengguanghui   * ways to entry Dmode:
384ac3bf33Schengguanghui   *    1. debug intr(from external debug module)
394ac3bf33Schengguanghui   *    2. ebreak inst in nonDmode
404ac3bf33Schengguanghui   *    3. trigger fire in nonDmode
414ac3bf33Schengguanghui   *    4. single step(debug module set dcsr.step before hart resume)
42a751b11aSchengguanghui   *    5. critical error state(when dcsr.cetrig assert)
434ac3bf33Schengguanghui   */
444ac3bf33Schengguanghui  // debug_intr
454ac3bf33Schengguanghui  val hasIntr = hasTrap && trapIsInterrupt
4622872cfdSsinceforYy  val hasDebugIntr = hasIntr && isDebugIntr
474ac3bf33Schengguanghui
484ac3bf33Schengguanghui  // debug_exception_ebreak
494ac3bf33Schengguanghui  val hasExp = hasTrap && !trapIsInterrupt
504ac3bf33Schengguanghui  val breakPoint = trapVec(ExceptionNO.breakPoint).asBool
513a9ac3caSGuanghui Cheng  val isEbreak = hasExp && breakPoint && !TriggerAction.isExp(trigger)
524ac3bf33Schengguanghui  val ebreakEnterDebugMode =
534ac3bf33Schengguanghui    (privState.isModeM && dcsr.EBREAKM.asBool) ||
544ac3bf33Schengguanghui      (privState.isModeHS && dcsr.EBREAKS.asBool) ||
554ac3bf33Schengguanghui      (privState.isModeHU && dcsr.EBREAKU.asBool) ||
564ac3bf33Schengguanghui      (privState.isModeVS && dcsr.EBREAKVS.asBool) ||
574ac3bf33Schengguanghui      (privState.isModeVU && dcsr.EBREAKVU.asBool)
583a9ac3caSGuanghui Cheng  val hasDebugEbreakException = isEbreak && ebreakEnterDebugMode
594ac3bf33Schengguanghui
604ac3bf33Schengguanghui  // debug_exception_trigger
61cc6e4cb5Schengguanghui  val mcontrol6WireVec = tdata1Vec.map{ mod => {
62cc6e4cb5Schengguanghui    val mcontrol6Wire = Wire(new Mcontrol6)
63cc6e4cb5Schengguanghui    mcontrol6Wire := mod.DATA.asUInt
64cc6e4cb5Schengguanghui    mcontrol6Wire
654ac3bf33Schengguanghui  }}
664ac3bf33Schengguanghui
67c08f49a0Schengguanghui  val triggerCanRaiseBpExp = io.in.triggerCanRaiseBpExp
687e0f64b0SGuanghui Cheng  val triggerEnterDebugMode = hasExp && TriggerAction.isDmode(trigger)
694ac3bf33Schengguanghui
704ac3bf33Schengguanghui  // debug_exception_single
714ac3bf33Schengguanghui  val hasSingleStep = hasExp && singleStep
724ac3bf33Schengguanghui
73a751b11aSchengguanghui
74a751b11aSchengguanghui  // critical error state
75a751b11aSchengguanghui  val criticalErrorStateEnterDebug = trapInfo.bits.criticalErrorState && dcsr.CETRIG.asBool
76a751b11aSchengguanghui
77a751b11aSchengguanghui  val hasDebugException = hasDebugEbreakException || triggerEnterDebugMode || hasSingleStep || criticalErrorStateEnterDebug
784ac3bf33Schengguanghui  val hasDebugTrap = hasDebugException || hasDebugIntr
794ac3bf33Schengguanghui
804ac3bf33Schengguanghui  val tselect1H = UIntToOH(tselect.asUInt, TriggerNum).asBools
81cc6e4cb5Schengguanghui  val chainVec = mcontrol6WireVec.map(_.CHAIN.asBool)
824ac3bf33Schengguanghui  val newTriggerChainVec = tselect1H.zip(chainVec).map{case(a, b) => a | b}
834ac3bf33Schengguanghui  val newTriggerChainIsLegal = TriggerUtil.TriggerCheckChainLegal(newTriggerChainVec, TriggerChainMaxLength)
844ac3bf33Schengguanghui
854ac3bf33Schengguanghui  val triggerUpdate = tdata1Update || tdata2Update
864ac3bf33Schengguanghui
87cc6e4cb5Schengguanghui  val mcontrol6Wdata = Wire(new Mcontrol6)
88cc6e4cb5Schengguanghui  mcontrol6Wdata := tdata1Wdata.DATA.asUInt
894ac3bf33Schengguanghui  val tdata1TypeWdata = tdata1Wdata.TYPE
904ac3bf33Schengguanghui
91cc6e4cb5Schengguanghui  val mcontrol6Selected = Wire(new Mcontrol6)
92cc6e4cb5Schengguanghui  mcontrol6Selected := tdata1Selected.DATA.asUInt
934ac3bf33Schengguanghui
944ac3bf33Schengguanghui  val frontendTriggerUpdate =
95cc6e4cb5Schengguanghui    tdata1Update && tdata1TypeWdata.isLegal && mcontrol6Wdata.isFetchTrigger ||
96cc6e4cb5Schengguanghui      mcontrol6Selected.isFetchTrigger && triggerUpdate
974ac3bf33Schengguanghui
984ac3bf33Schengguanghui  val memTriggerUpdate =
99cc6e4cb5Schengguanghui    tdata1Update && tdata1TypeWdata.isLegal && mcontrol6Wdata.isMemAccTrigger ||
100cc6e4cb5Schengguanghui      mcontrol6Selected.isMemAccTrigger && triggerUpdate
1014ac3bf33Schengguanghui
102cc6e4cb5Schengguanghui  val triggerEnableVec = tdata1Vec.zip(mcontrol6WireVec).map { case(tdata1, mcontrol6) =>
1034ac3bf33Schengguanghui    tdata1.TYPE.isLegal && (
104cc6e4cb5Schengguanghui      mcontrol6.M && privState.isModeM  ||
105cc6e4cb5Schengguanghui        mcontrol6.S && privState.isModeHS ||
106cc6e4cb5Schengguanghui        mcontrol6.U && privState.isModeHU ||
107cc6e4cb5Schengguanghui        mcontrol6.VS && privState.isModeVS ||
108cc6e4cb5Schengguanghui        mcontrol6.VU && privState.isModeVU)
1094ac3bf33Schengguanghui  }
1104ac3bf33Schengguanghui
111cc6e4cb5Schengguanghui  val fetchTriggerEnableVec = triggerEnableVec.zip(mcontrol6WireVec).map {
1124ac3bf33Schengguanghui    case (tEnable, mod) => tEnable && mod.isFetchTrigger
1134ac3bf33Schengguanghui  }
114cc6e4cb5Schengguanghui  val memAccTriggerEnableVec = triggerEnableVec.zip(mcontrol6WireVec).map {
1154ac3bf33Schengguanghui    case (tEnable, mod) => tEnable && mod.isMemAccTrigger
1164ac3bf33Schengguanghui  }
1174ac3bf33Schengguanghui
1184ac3bf33Schengguanghui  io.out.frontendTrigger.tUpdate.valid        := RegNext(RegNext(frontendTriggerUpdate))
1194ac3bf33Schengguanghui  io.out.frontendTrigger.tUpdate.bits.addr    := tselect.asUInt
1204ac3bf33Schengguanghui  io.out.frontendTrigger.tUpdate.bits.tdata.GenTdataDistribute(tdata1Selected, tdata2Selected)
1214ac3bf33Schengguanghui  io.out.frontendTrigger.tEnableVec           := fetchTriggerEnableVec
1227e0f64b0SGuanghui Cheng  io.out.frontendTrigger.triggerCanRaiseBpExp := triggerCanRaiseBpExp
1237e0f64b0SGuanghui Cheng  io.out.frontendTrigger.debugMode            := debugMode
12404b415dbSchengguanghui
1254ac3bf33Schengguanghui  io.out.memTrigger.tUpdate.valid            := RegNext(RegNext(memTriggerUpdate))
1264ac3bf33Schengguanghui  io.out.memTrigger.tUpdate.bits.addr        := tselect.asUInt
1274ac3bf33Schengguanghui  io.out.memTrigger.tUpdate.bits.tdata.GenTdataDistribute(tdata1Selected, tdata2Selected)
1284ac3bf33Schengguanghui  io.out.memTrigger.tEnableVec               := memAccTriggerEnableVec
12904b415dbSchengguanghui  io.out.memTrigger.triggerCanRaiseBpExp     := triggerCanRaiseBpExp
1307e0f64b0SGuanghui Cheng  io.out.memTrigger.debugMode                := debugMode
1314ac3bf33Schengguanghui
1324ac3bf33Schengguanghui  io.out.triggerFrontendChange  := frontendTriggerUpdate
1334ac3bf33Schengguanghui  io.out.newTriggerChainIsLegal := newTriggerChainIsLegal
1344ac3bf33Schengguanghui
1354ac3bf33Schengguanghui  io.out.hasDebugTrap                 := hasDebugTrap
1364ac3bf33Schengguanghui  io.out.hasDebugIntr                 := hasDebugIntr
1374ac3bf33Schengguanghui  io.out.hasSingleStep                := hasSingleStep
1387e0f64b0SGuanghui Cheng  io.out.triggerEnterDebugMode        := triggerEnterDebugMode
1394ac3bf33Schengguanghui  io.out.hasDebugEbreakException      := hasDebugEbreakException
1404ac3bf33Schengguanghui  io.out.breakPoint                   := breakPoint
141a751b11aSchengguanghui  io.out.criticalErrorStateEnterDebug := criticalErrorStateEnterDebug
1424ac3bf33Schengguanghui}
1434ac3bf33Schengguanghui
1444ac3bf33Schengguanghuiclass DebugIO(implicit val p: Parameters) extends Bundle with HasXSParameter {
1454ac3bf33Schengguanghui  val in = Input(new Bundle {
1464ac3bf33Schengguanghui    val trapInfo = ValidIO(new Bundle {
1474ac3bf33Schengguanghui      val trapVec = UInt(64.W)
14822872cfdSsinceforYy      val isDebugIntr = Bool()
1494ac3bf33Schengguanghui      val isInterrupt = Bool()
1504ac3bf33Schengguanghui      val singleStep = Bool()
1517e0f64b0SGuanghui Cheng      val trigger = TriggerAction()
152a751b11aSchengguanghui      val criticalErrorState = Bool()
1534ac3bf33Schengguanghui    })
1544ac3bf33Schengguanghui
1554ac3bf33Schengguanghui    val privState = new PrivState
1564ac3bf33Schengguanghui    val debugMode = Bool()
1574ac3bf33Schengguanghui
1584ac3bf33Schengguanghui    val dcsr = new DcsrBundle
1594ac3bf33Schengguanghui    val tselect = new TselectBundle(TriggerNum)
1604ac3bf33Schengguanghui    val tdata1Selected = new Tdata1Bundle
1614ac3bf33Schengguanghui    val tdata2Selected = new Tdata2Bundle
1624ac3bf33Schengguanghui    val tdata1Vec = Vec(TriggerNum, new Tdata1Bundle)
163c08f49a0Schengguanghui    val triggerCanRaiseBpExp = Bool()
1644ac3bf33Schengguanghui
1654ac3bf33Schengguanghui    val tdata1Update = Bool()
1664ac3bf33Schengguanghui    val tdata2Update = Bool()
1674ac3bf33Schengguanghui    val tdata1Wdata = new Tdata1Bundle
1684ac3bf33Schengguanghui  })
1694ac3bf33Schengguanghui
1704ac3bf33Schengguanghui  val out = Output(new Bundle{
1714ac3bf33Schengguanghui    // trigger
1724ac3bf33Schengguanghui    val triggerFrontendChange = Bool()
1734ac3bf33Schengguanghui    val newTriggerChainIsLegal = Bool()
1744ac3bf33Schengguanghui    val memTrigger = new MemTdataDistributeIO()
1754ac3bf33Schengguanghui    val frontendTrigger = new FrontendTdataDistributeIO()
1764ac3bf33Schengguanghui
1774ac3bf33Schengguanghui    val hasDebugTrap = Bool()
1784ac3bf33Schengguanghui    val hasDebugIntr = Bool()
1794ac3bf33Schengguanghui    val hasSingleStep = Bool()
1807e0f64b0SGuanghui Cheng    val triggerEnterDebugMode = Bool()
1814ac3bf33Schengguanghui    val hasDebugEbreakException = Bool()
1824ac3bf33Schengguanghui    val breakPoint = Bool()
183a751b11aSchengguanghui    val criticalErrorStateEnterDebug = Bool()
1844ac3bf33Schengguanghui  })
1854ac3bf33Schengguanghui}
18604b415dbSchengguanghui
18704b415dbSchengguanghuiclass CsrTriggerBundle(implicit val p: Parameters) extends Bundle with HasXSParameter {
18804b415dbSchengguanghui  val tdataVec = Vec(TriggerNum, new MatchTriggerIO)
18904b415dbSchengguanghui  val tEnableVec = Vec(TriggerNum, Bool())
1907e0f64b0SGuanghui Cheng  val debugMode = Bool()
19104b415dbSchengguanghui  val triggerCanRaiseBpExp = Bool()
19204b415dbSchengguanghui}
19394998b06Shappy-lx
19494998b06Shappy-lxobject MemType {
19594998b06Shappy-lx  val LOAD  = true
19694998b06Shappy-lx  val STORE = false
19794998b06Shappy-lx}
19894998b06Shappy-lx
199726c5ee8SAnzooooo
200726c5ee8SAnzoooooclass BaseTriggerIO(implicit p: Parameters) extends XSBundle{
20104b415dbSchengguanghui  val fromCsrTrigger = Input(new CsrTriggerBundle)
20204b415dbSchengguanghui
20394998b06Shappy-lx  val fromLoadStore = Input(new Bundle {
20404b415dbSchengguanghui    val vaddr = UInt(VAddrBits.W)
205506ca2a3SAnzooooo    val isVectorUnitStride = Bool()
206506ca2a3SAnzooooo    val mask = UInt((VLEN/8).W)
20704b415dbSchengguanghui  })
20804b415dbSchengguanghui
20994998b06Shappy-lx  val toLoadStore = Output(new Bundle{
2107e0f64b0SGuanghui Cheng    val triggerAction = TriggerAction()
211506ca2a3SAnzooooo    val triggerVaddr  = UInt(VAddrBits.W)
212d0d2c22dSAnzooooo    val triggerMask  = UInt((VLEN/8).W)
21304b415dbSchengguanghui  })
214726c5ee8SAnzooooo}
215726c5ee8SAnzooooo
216726c5ee8SAnzooooo
217*3c808de0SAnzoabstract class BaseTrigger()(implicit val p: Parameters) extends Module with HasXSParameter with SdtrigExt with HasDCacheParameters {
218726c5ee8SAnzooooo  lazy val io = IO(new BaseTriggerIO)
219726c5ee8SAnzooooo
220726c5ee8SAnzooooo  def getTriggerHitVec(): Vec[Bool]
221726c5ee8SAnzooooo  def highBitsEq(): Vec[Bool]
222*3c808de0SAnzo  def DcacheLineBitsEq(): (Bool, Vec[Bool])
223726c5ee8SAnzooooo
22404b415dbSchengguanghui  val tdataVec      = io.fromCsrTrigger.tdataVec
22504b415dbSchengguanghui  val tEnableVec    = io.fromCsrTrigger.tEnableVec
22604b415dbSchengguanghui  val triggerCanRaiseBpExp = io.fromCsrTrigger.triggerCanRaiseBpExp
2277e0f64b0SGuanghui Cheng  val debugMode = io.fromCsrTrigger.debugMode
22894998b06Shappy-lx  val vaddr = io.fromLoadStore.vaddr
22904b415dbSchengguanghui
23004b415dbSchengguanghui  val triggerTimingVec = VecInit(tdataVec.map(_.timing))
23104b415dbSchengguanghui  val triggerChainVec = VecInit(tdataVec.map(_.chain))
23204b415dbSchengguanghui
2337e0f64b0SGuanghui Cheng  // Trigger can't hit/fire in debug mode.
234726c5ee8SAnzooooo  val triggerHitVec = getTriggerHitVec()
235726c5ee8SAnzooooo  val triggerCanFireVec = WireInit(VecInit(Seq.fill(TriggerNum)(false.B)))
236506ca2a3SAnzooooo  // for vector unit-stride, match Type only support equal
237506ca2a3SAnzooooo  val lowBitWidth = log2Up(VLEN/8)
238506ca2a3SAnzooooo  val isVectorStride = io.fromLoadStore.isVectorUnitStride
239506ca2a3SAnzooooo  val mask = io.fromLoadStore.mask
240506ca2a3SAnzooooo
241*3c808de0SAnzo  val (isCacheLine, cacheLineEq) = DcacheLineBitsEq()
242*3c808de0SAnzo
243726c5ee8SAnzooooo  val highEq = highBitsEq()
244506ca2a3SAnzooooo
245506ca2a3SAnzooooo  val lowMatch = tdataVec.map(tdata => UIntToOH(tdata.tdata2(lowBitWidth-1, 0)) & mask)
246506ca2a3SAnzooooo  val lowEq  = VecInit(lowMatch.map(lm => lm.orR))
247506ca2a3SAnzooooo
248506ca2a3SAnzooooo  val hitVecVectorStride  = VecInit(highEq.zip(lowEq).map{case(hi, lo) => hi && lo})
249506ca2a3SAnzooooo
250*3c808de0SAnzo  val tiggerVaddrHit = Mux(isCacheLine, cacheLineEq, Mux(isVectorStride, hitVecVectorStride, triggerHitVec))
251*3c808de0SAnzo  TriggerCheckCanFire(TriggerNum, triggerCanFireVec, tiggerVaddrHit, triggerTimingVec, triggerChainVec)
252506ca2a3SAnzooooo  val triggerFireOH = PriorityEncoderOH(triggerCanFireVec)
253506ca2a3SAnzooooo  val triggerVaddr  = PriorityMux(triggerFireOH, VecInit(tdataVec.map(_.tdata2))).asUInt
254d0d2c22dSAnzooooo  val triggerMask   = PriorityMux(triggerFireOH, VecInit(tdataVec.map(x => UIntToOH(x.tdata2(lowBitWidth-1, 0))))).asUInt
25504b415dbSchengguanghui
2567e0f64b0SGuanghui Cheng  val actionVec = VecInit(tdataVec.map(_.action))
2577e0f64b0SGuanghui Cheng  val triggerAction = Wire(TriggerAction())
2587e0f64b0SGuanghui Cheng  TriggerUtil.triggerActionGen(triggerAction, triggerCanFireVec, actionVec, triggerCanRaiseBpExp)
25904b415dbSchengguanghui
26094998b06Shappy-lx  io.toLoadStore.triggerAction := triggerAction
261506ca2a3SAnzooooo  io.toLoadStore.triggerVaddr  := triggerVaddr
262d0d2c22dSAnzooooo  io.toLoadStore.triggerMask   := triggerMask
26304b415dbSchengguanghui}
264726c5ee8SAnzooooo
265726c5ee8SAnzooooo
266726c5ee8SAnzoooooclass MemTrigger(memType: Boolean = MemType.LOAD)(override implicit val p: Parameters) extends BaseTrigger {
267726c5ee8SAnzooooo
268*3c808de0SAnzo  class MemTriggerIO extends BaseTriggerIO{
269*3c808de0SAnzo    val isCbo = OptionWrapper(memType == MemType.STORE, Input(Bool()))
270*3c808de0SAnzo  }
271*3c808de0SAnzo
272*3c808de0SAnzo  override lazy val io = IO(new MemTriggerIO)
273*3c808de0SAnzo
274726c5ee8SAnzooooo  override def getTriggerHitVec(): Vec[Bool] = {
275726c5ee8SAnzooooo    val triggerHitVec = WireInit(VecInit(Seq.fill(TriggerNum)(false.B)))
276726c5ee8SAnzooooo    for (i <- 0 until TriggerNum) {
277726c5ee8SAnzooooo      triggerHitVec(i) := !tdataVec(i).select && !debugMode && TriggerCmp(
278726c5ee8SAnzooooo      vaddr,
279726c5ee8SAnzooooo      tdataVec(i).tdata2,
280726c5ee8SAnzooooo      tdataVec(i).matchType,
281726c5ee8SAnzooooo      tEnableVec(i) && (if(memType == MemType.LOAD) tdataVec(i).load else tdataVec(i).store)
282726c5ee8SAnzooooo      )
283726c5ee8SAnzooooo    }
284726c5ee8SAnzooooo    triggerHitVec
285726c5ee8SAnzooooo  }
286726c5ee8SAnzooooo
287726c5ee8SAnzooooo  override def highBitsEq(): Vec[Bool] = {
288726c5ee8SAnzooooo    VecInit(tdataVec.zip(tEnableVec).map{ case(tdata, en) =>
289726c5ee8SAnzooooo      !tdata.select && !debugMode && en &&
290726c5ee8SAnzooooo        (if(memType == MemType.LOAD) tdata.load else tdata.store) &&
291726c5ee8SAnzooooo        (vaddr >> lowBitWidth) === (tdata.tdata2 >> lowBitWidth)
292726c5ee8SAnzooooo    })
293726c5ee8SAnzooooo  }
294*3c808de0SAnzo
295*3c808de0SAnzo  def DcacheLineBitsEq(): (Bool, Vec[Bool])= {
296*3c808de0SAnzo    (
297*3c808de0SAnzo    io.isCbo.getOrElse(false.B),
298*3c808de0SAnzo    VecInit(tdataVec.zip(tEnableVec).map{ case(tdata, en) =>
299*3c808de0SAnzo      !tdata.select && !debugMode && en &&
300*3c808de0SAnzo        tdata.store && io.isCbo.getOrElse(false.B) &&
301*3c808de0SAnzo        (vaddr >> DCacheLineOffset) === (tdata.tdata2 >> DCacheLineOffset)
302*3c808de0SAnzo    })
303*3c808de0SAnzo    )
304*3c808de0SAnzo  }
305*3c808de0SAnzo
306726c5ee8SAnzooooo}
307726c5ee8SAnzooooo
308726c5ee8SAnzoooooclass VSegmentTrigger(override implicit val p: Parameters) extends BaseTrigger {
309726c5ee8SAnzooooo
310726c5ee8SAnzooooo  class VSegmentTriggerIO extends BaseTriggerIO{
311726c5ee8SAnzooooo    val memType = Input(Bool())
312726c5ee8SAnzooooo  }
313726c5ee8SAnzooooo
314726c5ee8SAnzooooo  override lazy val io = IO(new VSegmentTriggerIO)
315726c5ee8SAnzooooo
316726c5ee8SAnzooooo  override def getTriggerHitVec(): Vec[Bool] = {
317726c5ee8SAnzooooo    val triggerHitVec = WireInit(VecInit(Seq.fill(TriggerNum)(false.B)))
318726c5ee8SAnzooooo    for (i <- 0 until TriggerNum) {
319726c5ee8SAnzooooo      triggerHitVec(i) := !tdataVec(i).select && !debugMode && TriggerCmp(
320726c5ee8SAnzooooo        vaddr,
321726c5ee8SAnzooooo        tdataVec(i).tdata2,
322726c5ee8SAnzooooo        tdataVec(i).matchType,
323726c5ee8SAnzooooo        tEnableVec(i) && Mux(io.memType === MemType.LOAD.asBool, tdataVec(i).load, tdataVec(i).store)
324726c5ee8SAnzooooo      )
325726c5ee8SAnzooooo    }
326726c5ee8SAnzooooo    triggerHitVec
327726c5ee8SAnzooooo  }
328726c5ee8SAnzooooo
329726c5ee8SAnzooooo  override def highBitsEq(): Vec[Bool] = {
330726c5ee8SAnzooooo    VecInit(tdataVec.zip(tEnableVec).map{ case(tdata, en) =>
331726c5ee8SAnzooooo      !tdata.select && !debugMode && en &&
332726c5ee8SAnzooooo        Mux(io.memType === MemType.LOAD.asBool, tdata.load, tdata.store) &&
333726c5ee8SAnzooooo        (vaddr >> lowBitWidth) === (tdata.tdata2 >> lowBitWidth)
334726c5ee8SAnzooooo    })
335726c5ee8SAnzooooo  }
336*3c808de0SAnzo
337*3c808de0SAnzo  // vector segment does not have a cbo
338*3c808de0SAnzo  def DcacheLineBitsEq(): (Bool, Vec[Bool]) = {
339*3c808de0SAnzo    (false.B, VecInit(Seq.fill(tdataVec.length)(false.B)))
340*3c808de0SAnzo  }
341726c5ee8SAnzooooo}