1/*************************************************************************************** 2* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC) 3* Copyright (c) 2020-2024 Institute of Computing Technology, Chinese Academy of Sciences 4* Copyright (c) 2020-2021 Peng Cheng Laboratory 5* 6* XiangShan is licensed under Mulan PSL v2. 7* You can use this software according to the terms and conditions of the Mulan PSL v2. 8* You may obtain a copy of Mulan PSL v2 at: 9* http://license.coscl.org.cn/MulanPSL2 10* 11* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 12* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 13* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 14* 15* See the Mulan PSL v2 for more details. 16***************************************************************************************/ 17 18package xiangshan.frontend.icache 19 20import chisel3._ 21import chisel3.util._ 22import freechips.rocketchip.tilelink.ClientMetadata 23import freechips.rocketchip.tilelink.TLPermissions 24import org.chipsalliance.cde.config.Parameters 25import utility._ 26import utils._ 27import xiangshan._ 28 29class ICacheReadBundle(implicit p: Parameters) extends ICacheBundle { 30 val vSetIdx = Vec(2, UInt(log2Ceil(nSets).W)) 31 val wayMask = Vec(2, Vec(nWays, Bool())) 32 val blkOffset = UInt(log2Ceil(blockBytes).W) 33 val isDoubleLine = Bool() 34} 35 36class ICacheMetaWriteBundle(implicit p: Parameters) extends ICacheBundle { 37 val virIdx = UInt(idxBits.W) 38 val phyTag = UInt(tagBits.W) 39 val waymask = UInt(nWays.W) 40 val bankIdx = Bool() 41 42 def generate(tag: UInt, idx: UInt, waymask: UInt, bankIdx: Bool): Unit = { 43 this.virIdx := idx 44 this.phyTag := tag 45 this.waymask := waymask 46 this.bankIdx := bankIdx 47 } 48 49} 50 51class ICacheDataWriteBundle(implicit p: Parameters) extends ICacheBundle { 52 val virIdx = UInt(idxBits.W) 53 val data = UInt(blockBits.W) 54 val waymask = UInt(nWays.W) 55 val bankIdx = Bool() 56 57 def generate(data: UInt, idx: UInt, waymask: UInt, bankIdx: Bool): Unit = { 58 this.virIdx := idx 59 this.data := data 60 this.waymask := waymask 61 this.bankIdx := bankIdx 62 } 63 64} 65 66class ICacheMetaRespBundle(implicit p: Parameters) extends ICacheBundle { 67 val metas = Vec(PortNumber, Vec(nWays, new ICacheMetadata)) 68 val codes = Vec(PortNumber, Vec(nWays, UInt(ICacheMetaCodeBits.W))) 69 val entryValid = Vec(PortNumber, Vec(nWays, Bool())) 70 71 // for compatibility 72 def tags = VecInit(metas.map(port => VecInit(port.map(way => way.tag)))) 73} 74 75class ICacheDataRespBundle(implicit p: Parameters) extends ICacheBundle { 76 val datas = Vec(ICacheDataBanks, UInt(ICacheDataBits.W)) 77 val codes = Vec(ICacheDataBanks, UInt(ICacheDataCodeBits.W)) 78} 79 80class ICacheMetaReadBundle(implicit p: Parameters) extends ICacheBundle { 81 val req = Flipped(DecoupledIO(new ICacheReadBundle)) 82 val resp = Output(new ICacheMetaRespBundle) 83} 84 85class ReplacerTouch(implicit p: Parameters) extends ICacheBundle { 86 val vSetIdx = UInt(log2Ceil(nSets).W) 87 val way = UInt(log2Ceil(nWays).W) 88} 89 90class ReplacerVictim(implicit p: Parameters) extends ICacheBundle { 91 val vSetIdx = ValidIO(UInt(log2Ceil(nSets).W)) 92 val way = Input(UInt(log2Ceil(nWays).W)) 93} 94