xref: /XiangShan/src/main/scala/xiangshan/mem/sbuffer/FakeSbuffer.scala (revision 9e12e8edb26ee7dce62315a8f279ea9f61aa239d)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
17024ee227SWilliam Wangpackage xiangshan.mem
18024ee227SWilliam Wang
198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
20024ee227SWilliam Wangimport chisel3._
21024ee227SWilliam Wangimport chisel3.util._
22bb2f3f51STang Haojinimport utility.{XSDebug, XSInfo}
23024ee227SWilliam Wangimport xiangshan._
24*9e12e8edScz4eimport xiangshan.mem.Bundles._
25d2b20d1aSTang Haojinimport xiangshan.cache.{DCacheLineIO, DCacheWordReq, MemoryOpConstants, DCacheWordReqWithVaddr}
26024ee227SWilliam Wang
27024ee227SWilliam Wang// Fake Store buffer for XiangShan Out of Order LSU
28cea88ff8SWilliam Wang//
29cea88ff8SWilliam Wang// Note: fake store buffer is out of date, as store buffer is now
30cea88ff8SWilliam Wang// used as extended dcache miss queue for store
312225d46eSJiawei Linclass FakeSbuffer(implicit p: Parameters) extends XSModule {
32024ee227SWilliam Wang  val io = IO(new Bundle() {
33d2b20d1aSTang Haojin    val in = Vec(StorePipelineWidth, Flipped(Decoupled(new DCacheWordReqWithVaddr)))
34024ee227SWilliam Wang    val dcache = new DCacheLineIO
35024ee227SWilliam Wang    val forward = Vec(LoadPipelineWidth, Flipped(new LoadForwardQueryIO))
36024ee227SWilliam Wang  })
37024ee227SWilliam Wang
38024ee227SWilliam Wang  assert(!(io.in(1).valid && !io.in(0).valid))
39024ee227SWilliam Wang
40024ee227SWilliam Wang  // assign default values to signals
41024ee227SWilliam Wang  io.in(1).ready := false.B
42024ee227SWilliam Wang
43024ee227SWilliam Wang  io.dcache.req.valid := false.B
44024ee227SWilliam Wang  io.dcache.req.bits := DontCare
45024ee227SWilliam Wang  io.dcache.resp.ready := false.B
46024ee227SWilliam Wang
47024ee227SWilliam Wang  val s_invalid :: s_req :: s_resp :: Nil = Enum(3)
48024ee227SWilliam Wang
49024ee227SWilliam Wang  val state = RegInit(s_invalid)
50024ee227SWilliam Wang
51d2b20d1aSTang Haojin  val req = Reg(new DCacheWordReqWithVaddr)
52024ee227SWilliam Wang
53024ee227SWilliam Wang  XSDebug("state: %d\n", state)
54024ee227SWilliam Wang
55024ee227SWilliam Wang  io.in(0).ready := state === s_invalid
56024ee227SWilliam Wang
57024ee227SWilliam Wang  def word_addr(addr: UInt) = (addr >> 3) << 3
58024ee227SWilliam Wang  def block_addr(addr: UInt) = (addr >> 6) << 6
59024ee227SWilliam Wang
60024ee227SWilliam Wang  // --------------------------------------------
61024ee227SWilliam Wang  // s_invalid: receive requests
62024ee227SWilliam Wang  when (state === s_invalid) {
63935edac4STang Haojin    when (io.in(0).fire) {
64024ee227SWilliam Wang      req   := io.in(0).bits
65024ee227SWilliam Wang      state := s_req
66024ee227SWilliam Wang    }
67024ee227SWilliam Wang  }
68024ee227SWilliam Wang
69024ee227SWilliam Wang  val wdataVec = WireInit(VecInit(Seq.fill(8)(0.U(64.W))))
70024ee227SWilliam Wang  val wmaskVec = WireInit(VecInit(Seq.fill(8)(0.U(8.W))))
71024ee227SWilliam Wang  wdataVec(req.addr(5,3)) := req.data
72024ee227SWilliam Wang  wmaskVec(req.addr(5,3)) := req.mask
73024ee227SWilliam Wang
74024ee227SWilliam Wang  when (state === s_req) {
75024ee227SWilliam Wang    val dcache_req = io.dcache.req
76024ee227SWilliam Wang    dcache_req.valid := true.B
77024ee227SWilliam Wang    dcache_req.bits.cmd  := MemoryOpConstants.M_XWR
78024ee227SWilliam Wang    dcache_req.bits.addr := block_addr(req.addr)
79024ee227SWilliam Wang    dcache_req.bits.data := wdataVec.asUInt
80024ee227SWilliam Wang    dcache_req.bits.mask := wmaskVec.asUInt
81743bc277SAllen    dcache_req.bits.id   := DontCare
82024ee227SWilliam Wang
83935edac4STang Haojin    when (dcache_req.fire) {
84024ee227SWilliam Wang      state := s_resp
85024ee227SWilliam Wang    }
86024ee227SWilliam Wang  }
87024ee227SWilliam Wang
88024ee227SWilliam Wang  when (state === s_resp) {
89024ee227SWilliam Wang    io.dcache.resp.ready := true.B
90935edac4STang Haojin    when (io.dcache.resp.fire) {
91024ee227SWilliam Wang      state := s_invalid
92024ee227SWilliam Wang    }
93024ee227SWilliam Wang  }
94024ee227SWilliam Wang
95024ee227SWilliam Wang  // do forwarding here
96024ee227SWilliam Wang  for (i <- 0 until LoadPipelineWidth) {
97024ee227SWilliam Wang    val addr_match = word_addr(io.forward(i).paddr) === word_addr(req.addr)
98024ee227SWilliam Wang    val mask = io.forward(i).mask & req.mask(7, 0)
99024ee227SWilliam Wang    val mask_match = mask =/= 0.U
100024ee227SWilliam Wang    val need_forward = state =/= s_invalid && addr_match && mask_match
101024ee227SWilliam Wang
102024ee227SWilliam Wang    io.forward(i).forwardMask := Mux(need_forward, VecInit(mask.asBools),
103024ee227SWilliam Wang      VecInit(0.U(8.W).asBools))
104024ee227SWilliam Wang    io.forward(i).forwardData := VecInit((0 until 8) map {i => req.data((i + 1) * 8 - 1, i * 8)})
105024ee227SWilliam Wang  }
106024ee227SWilliam Wang
107935edac4STang Haojin  XSInfo(io.in(0).fire, "ensbuffer addr 0x%x wdata 0x%x mask %b\n", io.in(0).bits.addr, io.in(0).bits.data, io.in(0).bits.mask)
108935edac4STang Haojin  XSInfo(io.in(1).fire, "ensbuffer addr 0x%x wdata 0x%x mask %b\n", io.in(1).bits.addr, io.in(1).bits.data, io.in(0).bits.mask)
109935edac4STang Haojin  XSInfo(io.dcache.req.fire, "desbuffer addr 0x%x wdata 0x%x mask %b\n", io.dcache.req.bits.addr, io.dcache.req.bits.data, io.dcache.req.bits.mask)
110024ee227SWilliam Wang}
111