xref: /XiangShan/src/main/scala/xiangshan/cache/dcache/data/AbstractDataArray.scala (revision 8b33cd30e0034914b58520e0dc3c0c4b1aad6a03)
11f0e2dc7SJiawei Lin/***************************************************************************************
2e3da8badSTang Haojin* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC)
3e3da8badSTang Haojin* Copyright (c) 2020-2024 Institute of Computing Technology, Chinese Academy of Sciences
41f0e2dc7SJiawei Lin* Copyright (c) 2020-2021 Peng Cheng Laboratory
51f0e2dc7SJiawei Lin*
61f0e2dc7SJiawei Lin* XiangShan is licensed under Mulan PSL v2.
71f0e2dc7SJiawei Lin* You can use this software according to the terms and conditions of the Mulan PSL v2.
81f0e2dc7SJiawei Lin* You may obtain a copy of Mulan PSL v2 at:
91f0e2dc7SJiawei Lin*          http://license.coscl.org.cn/MulanPSL2
101f0e2dc7SJiawei Lin*
111f0e2dc7SJiawei Lin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
121f0e2dc7SJiawei Lin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
131f0e2dc7SJiawei Lin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
141f0e2dc7SJiawei Lin*
151f0e2dc7SJiawei Lin* See the Mulan PSL v2 for more details.
161f0e2dc7SJiawei Lin***************************************************************************************/
171f0e2dc7SJiawei Lin
181f0e2dc7SJiawei Linpackage xiangshan.cache
191f0e2dc7SJiawei Lin
208891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
211f0e2dc7SJiawei Linimport chisel3._
221f0e2dc7SJiawei Linimport chisel3.util._
231f0e2dc7SJiawei Linimport freechips.rocketchip.tilelink.{ClientMetadata, TLClientParameters, TLEdgeOut}
24bb2f3f51STang Haojinimport utility.{Code, ParallelOR, ReplacementPolicy, SRAMTemplate, XSDebug}
2573be64b3SJiawei Linimport xiangshan.L1CacheErrorInfo
261f0e2dc7SJiawei Lin
271f0e2dc7SJiawei Linimport scala.math.max
281f0e2dc7SJiawei Lin
291f0e2dc7SJiawei Lin
301f0e2dc7SJiawei Linclass L1DataReadReq(implicit p: Parameters) extends DCacheBundle {
311f0e2dc7SJiawei Lin  // you can choose which bank to read to save power
321f0e2dc7SJiawei Lin  val rmask = Bits(blockRows.W)
331f0e2dc7SJiawei Lin  val way_en = Bits(nWays.W)
341f0e2dc7SJiawei Lin  val addr = Bits(untagBits.W)
351f0e2dc7SJiawei Lin}
361f0e2dc7SJiawei Lin
371f0e2dc7SJiawei Lin// Now, we can write a cache-block in a single cycle
381f0e2dc7SJiawei Linclass L1DataWriteReq(implicit p: Parameters) extends L1DataReadReq {
391f0e2dc7SJiawei Lin  val wmask = Bits(blockRows.W)
401f0e2dc7SJiawei Lin  val data = Vec(blockRows, Bits(rowBits.W))
411f0e2dc7SJiawei Lin}
421f0e2dc7SJiawei Lin
431f0e2dc7SJiawei Linabstract class AbstractDataArray(implicit p: Parameters) extends DCacheModule {
441f0e2dc7SJiawei Lin  val io = IO(new DCacheBundle {
451f0e2dc7SJiawei Lin    val read = Vec(3, Flipped(DecoupledIO(new L1DataReadReq)))
461f0e2dc7SJiawei Lin    val write = Flipped(DecoupledIO(new L1DataWriteReq))
471f0e2dc7SJiawei Lin    val resp = Output(Vec(3, Vec(blockRows, Bits(encRowBits.W))))
481f0e2dc7SJiawei Lin    val nacks = Output(Vec(3, Bool()))
490184a80eSYanqin Li    val errors = Output(Vec(3, ValidIO(new L1CacheErrorInfo)))
501f0e2dc7SJiawei Lin  })
511f0e2dc7SJiawei Lin
521f0e2dc7SJiawei Lin  def pipeMap[T <: Data](f: Int => T) = VecInit((0 until 3).map(f))
531f0e2dc7SJiawei Lin
54e3da8badSTang Haojin  def dumpRead = {
551f0e2dc7SJiawei Lin    (0 until 3) map { w =>
56*8b33cd30Sklin02      XSDebug(io.read(w).valid,
57*8b33cd30Sklin02        s"DataArray Read channel: $w valid way_en: %x addr: %x\n",
581f0e2dc7SJiawei Lin        io.read(w).bits.way_en, io.read(w).bits.addr)
591f0e2dc7SJiawei Lin    }
601f0e2dc7SJiawei Lin  }
611f0e2dc7SJiawei Lin
62e3da8badSTang Haojin  def dumpWrite = {
63*8b33cd30Sklin02    XSDebug(io.write.valid,
64*8b33cd30Sklin02      s"DataArray Write valid way_en: %x addr: %x\n",
651f0e2dc7SJiawei Lin      io.write.bits.way_en, io.write.bits.addr)
661f0e2dc7SJiawei Lin
671f0e2dc7SJiawei Lin    (0 until blockRows) map { r =>
68*8b33cd30Sklin02      XSDebug(io.write.valid,
69*8b33cd30Sklin02        s"cycle: $r data: %x wmask: %x\n",
701f0e2dc7SJiawei Lin        io.write.bits.data(r), io.write.bits.wmask(r))
711f0e2dc7SJiawei Lin    }
721f0e2dc7SJiawei Lin  }
731f0e2dc7SJiawei Lin
74e3da8badSTang Haojin  def dumpResp = {
751f0e2dc7SJiawei Lin    (0 until 3) map { w =>
761f0e2dc7SJiawei Lin      XSDebug(s"DataArray ReadResp channel: $w\n")
771f0e2dc7SJiawei Lin      (0 until blockRows) map { r =>
781f0e2dc7SJiawei Lin        XSDebug(s"cycle: $r data: %x\n", io.resp(w)(r))
791f0e2dc7SJiawei Lin      }
801f0e2dc7SJiawei Lin    }
811f0e2dc7SJiawei Lin  }
821f0e2dc7SJiawei Lin
83e3da8badSTang Haojin  def dumpNack = {
841f0e2dc7SJiawei Lin    (0 until 3) map { w =>
85*8b33cd30Sklin02      XSDebug(io.nacks(w), s"DataArray NACK channel: $w\n")
861f0e2dc7SJiawei Lin    }
871f0e2dc7SJiawei Lin  }
881f0e2dc7SJiawei Lin
891f0e2dc7SJiawei Lin  def dump() = {
901f0e2dc7SJiawei Lin    dumpRead
911f0e2dc7SJiawei Lin    dumpWrite
921f0e2dc7SJiawei Lin    dumpNack
931f0e2dc7SJiawei Lin    dumpResp
941f0e2dc7SJiawei Lin  }
951f0e2dc7SJiawei Lin}
96