xref: /XiangShan/src/main/scala/xiangshan/cache/dcache/Uncache.scala (revision 3c02ee8f82edea481fa8336c7f54ffc17fafba91)
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