1b92f8445Sssszwic/*************************************************************************************** 2*e3da8badSTang Haojin* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC) 3*e3da8badSTang Haojin* Copyright (c) 2020-2024 Institute of Computing Technology, Chinese Academy of Sciences 4b92f8445Sssszwic* Copyright (c) 2020-2021 Peng Cheng Laboratory 5b92f8445Sssszwic* 6b92f8445Sssszwic* XiangShan is licensed under Mulan PSL v2. 7b92f8445Sssszwic* You can use this software according to the terms and conditions of the Mulan PSL v2. 8b92f8445Sssszwic* You may obtain a copy of Mulan PSL v2 at: 9b92f8445Sssszwic* http://license.coscl.org.cn/MulanPSL2 10b92f8445Sssszwic* 11b92f8445Sssszwic* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 12b92f8445Sssszwic* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 13b92f8445Sssszwic* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 14b92f8445Sssszwic* 15b92f8445Sssszwic* See the Mulan PSL v2 for more details. 16b92f8445Sssszwic***************************************************************************************/ 17b92f8445Sssszwic 18b92f8445Sssszwicpackage xiangshan.frontend.icache 19b92f8445Sssszwic 20b92f8445Sssszwicimport chisel3._ 21b92f8445Sssszwicimport chisel3.util._ 22b92f8445Sssszwicimport freechips.rocketchip.diplomacy.{IdRange, LazyModule, LazyModuleImp} 23b92f8445Sssszwicimport freechips.rocketchip.tilelink._ 24b92f8445Sssszwicimport freechips.rocketchip.util.BundleFieldBase 25b92f8445Sssszwicimport huancun.{AliasField, PrefetchField} 26b92f8445Sssszwicimport org.chipsalliance.cde.config.Parameters 27b92f8445Sssszwicimport utility._ 28b92f8445Sssszwicimport utils._ 29b92f8445Sssszwicimport xiangshan._ 30b92f8445Sssszwicimport xiangshan.cache._ 31b92f8445Sssszwicimport xiangshan.cache.mmu.TlbRequestIO 32b92f8445Sssszwicimport xiangshan.frontend._ 33b92f8445Sssszwic 34b92f8445Sssszwic 35b92f8445Sssszwicclass FIFOReg[T <: Data]( 36b92f8445Sssszwic val gen: T, 37b92f8445Sssszwic val entries: Int, 38b92f8445Sssszwic val pipe: Boolean = false, 39b92f8445Sssszwic val hasFlush: Boolean = false 40b92f8445Sssszwic) extends Module() { 41b92f8445Sssszwic require(entries > 0, "Queue must have non-negative number of entries") 42b92f8445Sssszwic 43b92f8445Sssszwic val io = IO(new Bundle { 44b92f8445Sssszwic val enq = Flipped(DecoupledIO(gen)) 45b92f8445Sssszwic val deq = DecoupledIO(gen) 46b92f8445Sssszwic val flush = if (hasFlush) Some(Input(Bool())) else None 47b92f8445Sssszwic }) 48b92f8445Sssszwic val flush = io.flush.getOrElse(false.B) 49b92f8445Sssszwic 50b92f8445Sssszwic class FIFOPtr() extends CircularQueuePtr[FIFOPtr](entries) 51b92f8445Sssszwic 52b92f8445Sssszwic object FIFOPtr { 53*e3da8badSTang Haojin def apply(f: Bool, v: UInt): FIFOPtr = { 54b92f8445Sssszwic val ptr = Wire(new FIFOPtr) 55b92f8445Sssszwic ptr.flag := f 56b92f8445Sssszwic ptr.value := v 57b92f8445Sssszwic ptr 58b92f8445Sssszwic } 59b92f8445Sssszwic } 60b92f8445Sssszwic 61b92f8445Sssszwic val regFiles = RegInit(VecInit(Seq.fill(entries)(0.U.asTypeOf(gen.cloneType)))) 62b92f8445Sssszwic val enq_ptr = RegInit(FIFOPtr(false.B, 0.U)) 63b92f8445Sssszwic val deq_ptr = RegInit(FIFOPtr(false.B, 0.U)) 64b92f8445Sssszwic 65b92f8445Sssszwic val empty = enq_ptr === deq_ptr 66b92f8445Sssszwic val full = (enq_ptr.value === deq_ptr.value) && (enq_ptr.flag ^ deq_ptr.flag) 67b92f8445Sssszwic 68b92f8445Sssszwic when(io.enq.fire) { 69b92f8445Sssszwic enq_ptr := enq_ptr + 1.U 70b92f8445Sssszwic } 71b92f8445Sssszwic when(io.deq.fire) { 72b92f8445Sssszwic deq_ptr := deq_ptr + 1.U 73b92f8445Sssszwic } 74b92f8445Sssszwic when(flush) { 75b92f8445Sssszwic enq_ptr.value := 0.U 76b92f8445Sssszwic enq_ptr.flag := false.B 77b92f8445Sssszwic deq_ptr.value := 0.U 78b92f8445Sssszwic deq_ptr.flag := false.B 79b92f8445Sssszwic } 80b92f8445Sssszwic 81b92f8445Sssszwic when(io.enq.fire) { 82b92f8445Sssszwic regFiles(enq_ptr.value) := io.enq.bits 83b92f8445Sssszwic } 84b92f8445Sssszwic io.deq.bits := regFiles(deq_ptr.value) 85b92f8445Sssszwic 86b92f8445Sssszwic io.deq.valid := !empty 87b92f8445Sssszwic io.enq.ready := !full 88b92f8445Sssszwic if (pipe) { 89b92f8445Sssszwic when(io.deq.ready) { io.enq.ready := true.B } 90b92f8445Sssszwic } 91b92f8445Sssszwic}