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