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