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}