11f0e2dc7SJiawei Lin/*************************************************************************************** 21f0e2dc7SJiawei Lin* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 31f0e2dc7SJiawei Lin* Copyright (c) 2020-2021 Peng Cheng Laboratory 41f0e2dc7SJiawei Lin* 51f0e2dc7SJiawei Lin* XiangShan is licensed under Mulan PSL v2. 61f0e2dc7SJiawei Lin* You can use this software according to the terms and conditions of the Mulan PSL v2. 71f0e2dc7SJiawei Lin* You may obtain a copy of Mulan PSL v2 at: 81f0e2dc7SJiawei Lin* http://license.coscl.org.cn/MulanPSL2 91f0e2dc7SJiawei Lin* 101f0e2dc7SJiawei Lin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 111f0e2dc7SJiawei Lin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 121f0e2dc7SJiawei Lin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 131f0e2dc7SJiawei Lin* 141f0e2dc7SJiawei Lin* See the Mulan PSL v2 for more details. 151f0e2dc7SJiawei Lin***************************************************************************************/ 161f0e2dc7SJiawei Lin 171f0e2dc7SJiawei Linpackage xiangshan.cache 181f0e2dc7SJiawei Lin 191f0e2dc7SJiawei Linimport chisel3._ 201f0e2dc7SJiawei Linimport chisel3.util._ 211f0e2dc7SJiawei Linimport chipsalliance.rocketchip.config.Parameters 2237225120Ssfencevmaimport utils._ 23*3c02ee8fSwakafaimport utility._ 2437225120Ssfencevmaimport xiangshan._ 251f0e2dc7SJiawei Linimport freechips.rocketchip.diplomacy.{IdRange, LazyModule, LazyModuleImp, TransferSizes} 261f0e2dc7SJiawei Linimport freechips.rocketchip.tilelink.{TLArbiter, TLBundleA, TLBundleD, TLClientNode, TLEdgeOut, TLMasterParameters, TLMasterPortParameters} 2737225120Ssfencevma 2837225120Ssfencevmaclass UncachePtr(implicit p: Parameters) extends CircularQueuePtr[UncachePtr]( 2937225120Ssfencevma p => p(XSCoreParamsKey).UncacheBufferSize 3037225120Ssfencevma){ 3137225120Ssfencevma 3237225120Ssfencevma} 3337225120Ssfencevma 3437225120Ssfencevmaobject UncachePtr { 3537225120Ssfencevma def apply(f: Bool, v: UInt)(implicit p: Parameters): UncachePtr = { 3637225120Ssfencevma val ptr = Wire(new UncachePtr) 3737225120Ssfencevma ptr.flag := f 3837225120Ssfencevma ptr.value := v 3937225120Ssfencevma ptr 4037225120Ssfencevma } 4137225120Ssfencevma} 4237225120Ssfencevma 4337225120Ssfencevmaclass UncacheFlushBundle extends Bundle { 4437225120Ssfencevma val valid = Output(Bool()) 4537225120Ssfencevma val empty = Input(Bool()) 4637225120Ssfencevma} 471f0e2dc7SJiawei Lin 481f0e2dc7SJiawei Lin// One miss entry deals with one mmio request 491f0e2dc7SJiawei Linclass MMIOEntry(edge: TLEdgeOut)(implicit p: Parameters) extends DCacheModule 501f0e2dc7SJiawei Lin{ 511f0e2dc7SJiawei Lin val io = IO(new Bundle { 521f0e2dc7SJiawei Lin // MSHR ID 5337225120Ssfencevma val hartId = Input(UInt()) 5437225120Ssfencevma // Control IO 5537225120Ssfencevma val enableOutstanding = Input(Bool()) 561f0e2dc7SJiawei Lin 5737225120Ssfencevma // Client requests 5837225120Ssfencevma val req = Flipped(DecoupledIO(new UncacheWordReq)) 596786cfb7SWilliam Wang val resp = DecoupledIO(new DCacheWordRespWithError) 601f0e2dc7SJiawei Lin 6137225120Ssfencevma // TileLink 621f0e2dc7SJiawei Lin val mem_acquire = DecoupledIO(new TLBundleA(edge.bundle)) 631f0e2dc7SJiawei Lin val mem_grant = Flipped(DecoupledIO(new TLBundleD(edge.bundle))) 6437225120Ssfencevma 6537225120Ssfencevma // This entry is selected. 6637225120Ssfencevma val select = Input(Bool()) 6737225120Ssfencevma val atomic = Output(Bool()) 681f0e2dc7SJiawei Lin }) 6937225120Ssfencevma // ================================================ 7037225120Ssfencevma // FSM state description: 7137225120Ssfencevma // s_invalid : Entry is invalid. 7237225120Ssfencevma // s_refill_req : Send Acquire request. 7337225120Ssfencevma // s_refill_resp : Wait for Grant response. 7437225120Ssfencevma // s_send_resp : Send Uncache response. 751f0e2dc7SJiawei Lin val s_invalid :: s_refill_req :: s_refill_resp :: s_send_resp :: Nil = Enum(4) 761f0e2dc7SJiawei Lin val state = RegInit(s_invalid) 771f0e2dc7SJiawei Lin 7837225120Ssfencevma val req = Reg(new UncacheWordReq) 791f0e2dc7SJiawei Lin val resp_data = Reg(UInt(DataBits.W)) 8037225120Ssfencevma def storeReq = req.cmd === MemoryOpConstants.M_XWR 811f0e2dc7SJiawei Lin 8237225120Ssfencevma // Assign default values to output signals. 831f0e2dc7SJiawei Lin io.req.ready := false.B 841f0e2dc7SJiawei Lin io.resp.valid := false.B 851f0e2dc7SJiawei Lin io.resp.bits := DontCare 861f0e2dc7SJiawei Lin 871f0e2dc7SJiawei Lin io.mem_acquire.valid := false.B 881f0e2dc7SJiawei Lin io.mem_acquire.bits := DontCare 891f0e2dc7SJiawei Lin io.mem_grant.ready := false.B 901f0e2dc7SJiawei Lin 9137225120Ssfencevma io.atomic := req.atomic 9237225120Ssfencevma // Receive request 931f0e2dc7SJiawei Lin when (state === s_invalid) { 941f0e2dc7SJiawei Lin io.req.ready := true.B 951f0e2dc7SJiawei Lin 9637225120Ssfencevma when (io.req.fire) { 971f0e2dc7SJiawei Lin req := io.req.bits 981f0e2dc7SJiawei Lin req.addr := io.req.bits.addr 991f0e2dc7SJiawei Lin state := s_refill_req 1001f0e2dc7SJiawei Lin } 1011f0e2dc7SJiawei Lin } 1021f0e2dc7SJiawei Lin 10337225120Ssfencevma // Refill 1041f0e2dc7SJiawei Lin // TODO: determine 'lgSize' in memend 1051f0e2dc7SJiawei Lin val size = PopCount(req.mask) 1061f0e2dc7SJiawei Lin val (lgSize, legal) = PriorityMuxWithFlag(Seq( 1071f0e2dc7SJiawei Lin 1.U -> 0.U, 1081f0e2dc7SJiawei Lin 2.U -> 1.U, 1091f0e2dc7SJiawei Lin 4.U -> 2.U, 1101f0e2dc7SJiawei Lin 8.U -> 3.U 1111f0e2dc7SJiawei Lin ).map(m => (size===m._1) -> m._2)) 1121f0e2dc7SJiawei Lin assert(!(io.mem_acquire.valid && !legal)) 1131f0e2dc7SJiawei Lin 1141f0e2dc7SJiawei Lin val load = edge.Get( 11537225120Ssfencevma fromSource = io.hartId, 1161f0e2dc7SJiawei Lin toAddress = req.addr, 1171f0e2dc7SJiawei Lin lgSize = lgSize 1181f0e2dc7SJiawei Lin )._2 1191f0e2dc7SJiawei Lin 1201f0e2dc7SJiawei Lin val store = edge.Put( 12137225120Ssfencevma fromSource = io.hartId, 1221f0e2dc7SJiawei Lin toAddress = req.addr, 1231f0e2dc7SJiawei Lin lgSize = lgSize, 1241f0e2dc7SJiawei Lin data = req.data, 1251f0e2dc7SJiawei Lin mask = req.mask 1261f0e2dc7SJiawei Lin )._2 1271f0e2dc7SJiawei Lin 12837225120Ssfencevma XSDebug("entry: %d state: %d\n", io.hartId, state) 1291f0e2dc7SJiawei Lin 13037225120Ssfencevma when (state === s_refill_req) { 13137225120Ssfencevma io.mem_acquire.valid := true.B && io.select 13237225120Ssfencevma io.mem_acquire.bits := Mux(storeReq, store, load) 13337225120Ssfencevma 13437225120Ssfencevma when (io.mem_acquire.fire) { 1351f0e2dc7SJiawei Lin state := s_refill_resp 1361f0e2dc7SJiawei Lin } 1371f0e2dc7SJiawei Lin } 1381f0e2dc7SJiawei Lin 1391f0e2dc7SJiawei Lin val (_, _, refill_done, _) = edge.addr_inc(io.mem_grant) 1401f0e2dc7SJiawei Lin when (state === s_refill_resp) { 1411f0e2dc7SJiawei Lin io.mem_grant.ready := true.B 1421f0e2dc7SJiawei Lin 14337225120Ssfencevma when (io.mem_grant.fire) { 1441f0e2dc7SJiawei Lin resp_data := io.mem_grant.bits.data 14537225120Ssfencevma assert(refill_done, "Uncache response should be one beat only!") 14637225120Ssfencevma state := Mux(storeReq && io.enableOutstanding, s_invalid, s_send_resp) 1471f0e2dc7SJiawei Lin } 1481f0e2dc7SJiawei Lin } 1491f0e2dc7SJiawei Lin 15037225120Ssfencevma // Response 1511f0e2dc7SJiawei Lin when (state === s_send_resp) { 1521f0e2dc7SJiawei Lin io.resp.valid := true.B 1531f0e2dc7SJiawei Lin io.resp.bits.data := resp_data 1541f0e2dc7SJiawei Lin // meta data should go with the response 1551f0e2dc7SJiawei Lin io.resp.bits.id := req.id 1561f0e2dc7SJiawei Lin io.resp.bits.miss := false.B 1571f0e2dc7SJiawei Lin io.resp.bits.replay := false.B 158a469aa4bSWilliam Wang io.resp.bits.tag_error := false.B 159a469aa4bSWilliam Wang io.resp.bits.error := false.B 1601f0e2dc7SJiawei Lin 1611f0e2dc7SJiawei Lin when (io.resp.fire()) { 1621f0e2dc7SJiawei Lin state := s_invalid 1631f0e2dc7SJiawei Lin } 1641f0e2dc7SJiawei Lin } 16537225120Ssfencevma 16637225120Ssfencevma // End 1671f0e2dc7SJiawei Lin} 1681f0e2dc7SJiawei Lin 1691f0e2dc7SJiawei Linclass UncacheIO(implicit p: Parameters) extends DCacheBundle { 17037225120Ssfencevma val hartId = Input(UInt()) 17137225120Ssfencevma val enableOutstanding = Input(Bool()) 17237225120Ssfencevma val flush = Flipped(new UncacheFlushBundle) 1736786cfb7SWilliam Wang val lsq = Flipped(new UncacheWordIO) 1741f0e2dc7SJiawei Lin} 1751f0e2dc7SJiawei Lin 1761f0e2dc7SJiawei Lin// convert DCacheIO to TileLink 1771f0e2dc7SJiawei Lin// for Now, we only deal with TL-UL 1781f0e2dc7SJiawei Lin 17937225120Ssfencevmaclass Uncache()(implicit p: Parameters) extends LazyModule with HasXSParameter { 18037225120Ssfencevma def idRange: Int = UncacheBufferSize 1811f0e2dc7SJiawei Lin 1821f0e2dc7SJiawei Lin val clientParameters = TLMasterPortParameters.v1( 1831f0e2dc7SJiawei Lin clients = Seq(TLMasterParameters.v1( 1841f0e2dc7SJiawei Lin "uncache", 18537225120Ssfencevma sourceId = IdRange(0, idRange) 1861f0e2dc7SJiawei Lin )) 1871f0e2dc7SJiawei Lin ) 1881f0e2dc7SJiawei Lin val clientNode = TLClientNode(Seq(clientParameters)) 1891f0e2dc7SJiawei Lin 1901f0e2dc7SJiawei Lin lazy val module = new UncacheImp(this) 1911f0e2dc7SJiawei Lin} 1921f0e2dc7SJiawei Lin 19337225120Ssfencevmaclass UncacheImp(outer: Uncache)extends LazyModuleImp(outer) 1941f0e2dc7SJiawei Lin with HasTLDump 19537225120Ssfencevma with HasXSParameter 19637225120Ssfencevma with HasPerfEvents 1971f0e2dc7SJiawei Lin{ 1981f0e2dc7SJiawei Lin val io = IO(new UncacheIO) 1991f0e2dc7SJiawei Lin 2001f0e2dc7SJiawei Lin val (bus, edge) = outer.clientNode.out.head 2011f0e2dc7SJiawei Lin 2021f0e2dc7SJiawei Lin val req = io.lsq.req 2031f0e2dc7SJiawei Lin val resp = io.lsq.resp 2041f0e2dc7SJiawei Lin val mem_acquire = bus.a 2051f0e2dc7SJiawei Lin val mem_grant = bus.d 2061f0e2dc7SJiawei Lin 2071f0e2dc7SJiawei Lin val req_ready = WireInit(false.B) 20837225120Ssfencevma val need_fence = WireInit(false.B) 2091f0e2dc7SJiawei Lin 2101f0e2dc7SJiawei Lin // assign default values to output signals 2111f0e2dc7SJiawei Lin bus.b.ready := false.B 2121f0e2dc7SJiawei Lin bus.c.valid := false.B 2131f0e2dc7SJiawei Lin bus.c.bits := DontCare 2141f0e2dc7SJiawei Lin bus.d.ready := false.B 2151f0e2dc7SJiawei Lin bus.e.valid := false.B 2161f0e2dc7SJiawei Lin bus.e.bits := DontCare 2171f0e2dc7SJiawei Lin 21837225120Ssfencevma val enqPtr = RegInit(0.U.asTypeOf(new UncachePtr)) 21937225120Ssfencevma val issPtr = RegInit(0.U.asTypeOf(new UncachePtr)) 22037225120Ssfencevma val deqPtr = RegInit(0.U.asTypeOf(new UncachePtr)) 22137225120Ssfencevma val fence = RegInit(Bool(), false.B) 2221f0e2dc7SJiawei Lin 22337225120Ssfencevma io.lsq.resp.valid := false.B 22437225120Ssfencevma io.lsq.resp.bits := DontCare 2251f0e2dc7SJiawei Lin 22637225120Ssfencevma val entries = Seq.fill(UncacheBufferSize) { Module(new MMIOEntry(edge)) } 22737225120Ssfencevma for ((entry, i) <- entries.zipWithIndex) { 22837225120Ssfencevma entry.io.hartId := io.hartId 22937225120Ssfencevma entry.io.enableOutstanding := io.enableOutstanding 23037225120Ssfencevma 23137225120Ssfencevma // Enqueue 23237225120Ssfencevma entry.io.req.valid := (i.U === enqPtr.value) && req.valid 2331f0e2dc7SJiawei Lin entry.io.req.bits := req.bits 23437225120Ssfencevma 23537225120Ssfencevma when (i.U === enqPtr.value) { 2361f0e2dc7SJiawei Lin req_ready := entry.io.req.ready 2371f0e2dc7SJiawei Lin } 2381f0e2dc7SJiawei Lin 23937225120Ssfencevma // Acquire 24037225120Ssfencevma entry.io.select := (i.U === issPtr.value) && Mux(entry.io.atomic, issPtr.value === deqPtr.value, !fence) 2411f0e2dc7SJiawei Lin 24237225120Ssfencevma when (i.U === issPtr.value) { 24337225120Ssfencevma need_fence := entry.io.atomic 24437225120Ssfencevma } 24537225120Ssfencevma 24637225120Ssfencevma // Grant 2471f0e2dc7SJiawei Lin entry.io.mem_grant.valid := false.B 2481f0e2dc7SJiawei Lin entry.io.mem_grant.bits := DontCare 24937225120Ssfencevma when (i.U === deqPtr.value) { 2501f0e2dc7SJiawei Lin entry.io.mem_grant <> mem_grant 2511f0e2dc7SJiawei Lin } 25237225120Ssfencevma 25337225120Ssfencevma entry.io.resp.ready := false.B 25437225120Ssfencevma when (i.U === deqPtr.value) { 25537225120Ssfencevma io.lsq.resp <> entry.io.resp 2561f0e2dc7SJiawei Lin } 2571f0e2dc7SJiawei Lin 25837225120Ssfencevma } 2591f0e2dc7SJiawei Lin 26037225120Ssfencevma io.lsq.req.ready := req_ready 26137225120Ssfencevma when (io.enableOutstanding) { 26237225120Ssfencevma // Uncache Buffer is a circular queue, which contains UncacheBufferSize entries. 26337225120Ssfencevma // Description: 26437225120Ssfencevma // enqPtr: Point to an invalid (means that the entry is free) entry. 26537225120Ssfencevma // issPtr: Point to a ready entry, the entry is ready to issue. 26637225120Ssfencevma // deqPtr: Point to the oldest entry, which was issued but has not accepted response (used to keep order with the program order). 26737225120Ssfencevma // 26837225120Ssfencevma // When outstanding disabled, only one read/write request can be accepted at a time. 26937225120Ssfencevma // 27037225120Ssfencevma // Example (Enable outstanding): 27137225120Ssfencevma // 1. enqPtr: 27237225120Ssfencevma // 1) Before enqueue 27337225120Ssfencevma // enqPtr -- 27437225120Ssfencevma // | 27537225120Ssfencevma // | 27637225120Ssfencevma // V 27737225120Ssfencevma // +--+--+--+--+ 27837225120Ssfencevma // | | | | | 27937225120Ssfencevma // | | | | | 28037225120Ssfencevma // | | | | | 28137225120Ssfencevma // +--+--+--+--+ 28237225120Ssfencevma // 28337225120Ssfencevma // 2) After 28437225120Ssfencevma // enqPtr+1 --- 28537225120Ssfencevma // | 28637225120Ssfencevma // | 28737225120Ssfencevma // V 28837225120Ssfencevma // +--+--+--+--+ 28937225120Ssfencevma // | | | | | 29037225120Ssfencevma // | | | | | 29137225120Ssfencevma // | | | | | 29237225120Ssfencevma // +--+--+--+--+ 29337225120Ssfencevma // 29437225120Ssfencevma // 2. issPtr: 29537225120Ssfencevma // 1) Before issue 29637225120Ssfencevma // issPtr -- 29737225120Ssfencevma // | 29837225120Ssfencevma // | 29937225120Ssfencevma // V 30037225120Ssfencevma // +--+--+--+--+ 30137225120Ssfencevma // | | | | | 30237225120Ssfencevma // | | | | | 30337225120Ssfencevma // | | | | | 30437225120Ssfencevma // +--+--+--+--+ 30537225120Ssfencevma // 30637225120Ssfencevma // 2) After issue 30737225120Ssfencevma // issPtr+1 -- 30837225120Ssfencevma // | 30937225120Ssfencevma // | 31037225120Ssfencevma // V 31137225120Ssfencevma // +--+--+--+--+ 31237225120Ssfencevma // | | | | | 31337225120Ssfencevma // | | | | | 31437225120Ssfencevma // | | | | | 31537225120Ssfencevma // +--+--+--+--+ 31637225120Ssfencevma // 31737225120Ssfencevma // 3. deqPtr: 31837225120Ssfencevma // 1) Before dequeue 31937225120Ssfencevma // deqPtr -- 32037225120Ssfencevma // | 32137225120Ssfencevma // | 32237225120Ssfencevma // V 32337225120Ssfencevma // +--+--+--+--+ 32437225120Ssfencevma // | | | | | 32537225120Ssfencevma // | | | | | 32637225120Ssfencevma // | | | | | 32737225120Ssfencevma // +--+--+--+--+ 32837225120Ssfencevma // 32937225120Ssfencevma // 2) After dequeue 33037225120Ssfencevma // deqPtr -- deqPtr+1 -- 33137225120Ssfencevma // | | 33237225120Ssfencevma // | | 33337225120Ssfencevma // V V 33437225120Ssfencevma // +--+--+--+--+ or +--+--+--+--+ 33537225120Ssfencevma // | | | | | | | | | | 33637225120Ssfencevma // | | | | | | | | | | 33737225120Ssfencevma // | | | | | | | | | | 33837225120Ssfencevma // +--+--+--+--+ +--+--+--+--+ 33937225120Ssfencevma // (load) (store) 34037225120Ssfencevma // 34137225120Ssfencevma // 3) After response 34237225120Ssfencevma // deqPtr+1 --- deqPtr-- 34337225120Ssfencevma // | | 34437225120Ssfencevma // | | 34537225120Ssfencevma // V V 34637225120Ssfencevma // +--+--+--+--+ or +--+--+--+--+ 34737225120Ssfencevma // | | | | | | | | | | 34837225120Ssfencevma // | | | | | | | | | | 34937225120Ssfencevma // | | | | | | | | | | 35037225120Ssfencevma // +--+--+--+--+ +--+--+--+--+ 35137225120Ssfencevma // (load) (store) 35237225120Ssfencevma // 35337225120Ssfencevma 35437225120Ssfencevma // Enqueue 35537225120Ssfencevma when (req.fire) { 35637225120Ssfencevma enqPtr := enqPtr + 1.U 35737225120Ssfencevma } 35837225120Ssfencevma 35937225120Ssfencevma // Issue 36037225120Ssfencevma when (mem_acquire.fire) { 36137225120Ssfencevma issPtr := issPtr + 1.U 36237225120Ssfencevma } 36337225120Ssfencevma 36437225120Ssfencevma when (mem_acquire.fire) { 36537225120Ssfencevma fence := need_fence 36637225120Ssfencevma } 36737225120Ssfencevma 36837225120Ssfencevma // Dequeue 36937225120Ssfencevma when (mem_grant.fire) { 37037225120Ssfencevma deqPtr := Mux(edge.hasData(mem_grant.bits), deqPtr /* Load */, deqPtr + 1.U /* Store */) 37137225120Ssfencevma } .elsewhen (io.lsq.resp.fire /* Load */) { 37237225120Ssfencevma deqPtr := deqPtr + 1.U 37337225120Ssfencevma } 37437225120Ssfencevma 37537225120Ssfencevma when (mem_grant.fire && fence) { 37637225120Ssfencevma fence := false.B 37737225120Ssfencevma } 37837225120Ssfencevma } .otherwise { 37937225120Ssfencevma when (io.lsq.resp.fire) { 38037225120Ssfencevma enqPtr := enqPtr + 1.U 38137225120Ssfencevma issPtr := issPtr + 1.U 38237225120Ssfencevma deqPtr := deqPtr + 1.U 38337225120Ssfencevma } 38437225120Ssfencevma } 38537225120Ssfencevma 3861f0e2dc7SJiawei Lin TLArbiter.lowestFromSeq(edge, mem_acquire, entries.map(_.io.mem_acquire)) 38737225120Ssfencevma io.flush.empty := deqPtr === enqPtr 3881f0e2dc7SJiawei Lin 38937225120Ssfencevma println(s"Uncahe Buffer Size: $UncacheBufferSize entries") 3901f0e2dc7SJiawei Lin 3911f0e2dc7SJiawei Lin // print all input/output requests for debug purpose 3921f0e2dc7SJiawei Lin // print req/resp 3931f0e2dc7SJiawei Lin XSDebug(req.fire(), "req cmd: %x addr: %x data: %x mask: %x\n", 3941f0e2dc7SJiawei Lin req.bits.cmd, req.bits.addr, req.bits.data, req.bits.mask) 3951f0e2dc7SJiawei Lin XSDebug(resp.fire(), "data: %x\n", req.bits.data) 3961f0e2dc7SJiawei Lin 3971f0e2dc7SJiawei Lin // print tilelink messages 3981f0e2dc7SJiawei Lin when(mem_acquire.valid){ 3991f0e2dc7SJiawei Lin XSDebug("mem_acquire valid, ready=%d ", mem_acquire.ready) 4001f0e2dc7SJiawei Lin mem_acquire.bits.dump 4011f0e2dc7SJiawei Lin } 4021f0e2dc7SJiawei Lin when (mem_grant.fire()) { 4031f0e2dc7SJiawei Lin XSDebug("mem_grant fire ") 4041f0e2dc7SJiawei Lin mem_grant.bits.dump 4051f0e2dc7SJiawei Lin } 40637225120Ssfencevma 40737225120Ssfencevma // Performance Counters 40837225120Ssfencevma def isStore: Bool = io.lsq.req.bits.cmd === MemoryOpConstants.M_XWR 40937225120Ssfencevma XSPerfAccumulate("mmio_store", io.lsq.req.fire && isStore) 41037225120Ssfencevma XSPerfAccumulate("mmio_load", io.lsq.req.fire && !isStore) 41137225120Ssfencevma XSPerfAccumulate("mmio_outstanding", mem_acquire.fire && (deqPtr =/= issPtr)) 41237225120Ssfencevma val perfEvents = Seq( 41337225120Ssfencevma ("mmio_store", io.lsq.req.fire && isStore), 41437225120Ssfencevma ("mmio_load", io.lsq.req.fire && !isStore), 41537225120Ssfencevma ("mmio_outstanding", mem_acquire.fire && (deqPtr =/= issPtr)) 41637225120Ssfencevma ) 41737225120Ssfencevma 41837225120Ssfencevma generatePerfEvent() 41937225120Ssfencevma // End 4201f0e2dc7SJiawei Lin} 421