1720dd621STang Haojin/*************************************************************************************** 2720dd621STang Haojin* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC) 3720dd621STang Haojin* Copyright (c) 2024 Institute of Computing Technology, Chinese Academy of Sciences 4720dd621STang Haojin* 5720dd621STang Haojin* XiangShan is licensed under Mulan PSL v2. 6720dd621STang Haojin* You can use this software according to the terms and conditions of the Mulan PSL v2. 7720dd621STang Haojin* You may obtain a copy of Mulan PSL v2 at: 8720dd621STang Haojin* http://license.coscl.org.cn/MulanPSL2 9720dd621STang Haojin* 10720dd621STang Haojin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11720dd621STang Haojin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12720dd621STang Haojin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13720dd621STang Haojin* 14720dd621STang Haojin* See the Mulan PSL v2 for more details. 15720dd621STang Haojin***************************************************************************************/ 16720dd621STang Haojin 17720dd621STang Haojinpackage device 18720dd621STang Haojin 19720dd621STang Haojinimport chisel3._ 20720dd621STang Haojinimport chisel3.util._ 21720dd621STang Haojinimport chisel3.experimental.dataview._ 22720dd621STang Haojinimport org.chipsalliance.cde.config.Parameters 23720dd621STang Haojinimport freechips.rocketchip.diplomacy._ 24720dd621STang Haojinimport freechips.rocketchip.amba.axi4._ 25720dd621STang Haojinimport freechips.rocketchip.tilelink._ 26720dd621STang Haojinimport utils.{AXI4LiteBundle, VerilogAXI4LiteRecord} 27720dd621STang Haojin 28720dd621STang Haojinclass imsic_axi_top( 29720dd621STang Haojin AXI_ID_WIDTH: Int = 5, 30720dd621STang Haojin AXI_ADDR_WIDTH: Int = 32, 31720dd621STang Haojin NR_INTP_FILES: Int = 7, 32720dd621STang Haojin NR_HARTS: Int = 1, 33720dd621STang Haojin NR_SRC: Int = 256, 34720dd621STang Haojin SETIP_KEEP_CYCLES: Int = 8 35720dd621STang Haojin) extends BlackBox(Map( 36720dd621STang Haojin "AXI_ID_WIDTH" -> AXI_ID_WIDTH, 37720dd621STang Haojin "AXI_ADDR_WIDTH" -> AXI_ADDR_WIDTH, 38720dd621STang Haojin "NR_INTP_FILES" -> NR_INTP_FILES, 39720dd621STang Haojin "NR_HARTS" -> NR_HARTS, 40720dd621STang Haojin "NR_SRC" -> NR_SRC, 41720dd621STang Haojin "SETIP_KEEP_CYCLES" -> SETIP_KEEP_CYCLES 42720dd621STang Haojin)) with HasBlackBoxResource { 43720dd621STang Haojin private val NR_SRC_WIDTH = log2Ceil(NR_SRC) 44720dd621STang Haojin private val NR_HARTS_WIDTH = if (NR_HARTS == 1) 1 else log2Ceil(NR_HARTS) 45720dd621STang Haojin private val INTP_FILE_WIDTH = log2Ceil(NR_INTP_FILES) 46720dd621STang Haojin private val MSI_INFO_WIDTH = NR_HARTS_WIDTH + INTP_FILE_WIDTH + NR_SRC_WIDTH 47720dd621STang Haojin val io = IO(new Bundle { 48720dd621STang Haojin // crg 49720dd621STang Haojin val axi_clk = Input(Clock()) 50720dd621STang Haojin val axi_rstn = Input(AsyncReset()) 51720dd621STang Haojin val fifo_rstn = Input(AsyncReset()) 52720dd621STang Haojin // bus to access the m interrupt file 53720dd621STang Haojin val m_s = Flipped(new VerilogAXI4LiteRecord(AXI_ADDR_WIDTH, 32, AXI_ID_WIDTH)) 54720dd621STang Haojin // bus to access the s interrupt file 55720dd621STang Haojin val s_s = Flipped(new VerilogAXI4LiteRecord(AXI_ADDR_WIDTH, 32, AXI_ID_WIDTH)) 56720dd621STang Haojin // imsic_csr_top 57720dd621STang Haojin val o_msi_info = Output(UInt(MSI_INFO_WIDTH.W)) 58720dd621STang Haojin val o_msi_info_vld = Output(Bool()) 59720dd621STang Haojin }) 60*f835884fSHaojin Tang addResource("/aia/src/rtl/imsic/imsic_axi_top.sv") 61*f835884fSHaojin Tang addResource("/aia/src/rtl/imsic/imsic_axi2reg.sv") 62*f835884fSHaojin Tang addResource("/aia/src/rtl/imsic/imsic_regmap.sv") 63*f835884fSHaojin Tang addResource("/aia/src/rtl/imsic/common/generic_fifo_dc_gray.sv") 64*f835884fSHaojin Tang addResource("/aia/src/rtl/imsic/common/generic_dpram.sv") 65720dd621STang Haojin} 66720dd621STang Haojin 67720dd621STang Haojinclass imsic_bus_top( 68720dd621STang Haojin useTL: Boolean = false, 69720dd621STang Haojin AXI_ID_WIDTH: Int = 5, 70720dd621STang Haojin AXI_ADDR_WIDTH: Int = 32, 71720dd621STang Haojin NR_INTP_FILES: Int = 7, 72720dd621STang Haojin NR_HARTS: Int = 1, 73720dd621STang Haojin NR_SRC: Int = 256, 74720dd621STang Haojin SETIP_KEEP_CYCLES: Int = 8 75720dd621STang Haojin)(implicit p: Parameters) extends LazyModule { 76720dd621STang Haojin private val NR_SRC_WIDTH = log2Ceil(NR_SRC) 77720dd621STang Haojin private val NR_HARTS_WIDTH = if (NR_HARTS == 1) 1 else log2Ceil(NR_HARTS) 78720dd621STang Haojin private val INTP_FILE_WIDTH = log2Ceil(NR_INTP_FILES) 79720dd621STang Haojin private val MSI_INFO_WIDTH = NR_HARTS_WIDTH + INTP_FILE_WIDTH + NR_SRC_WIDTH 80720dd621STang Haojin 81720dd621STang Haojin private val tuple_axi4_tl = Option.when(useTL) { 82720dd621STang Haojin val tlnodes = Seq.fill(2)(TLClientNode(Seq(TLMasterPortParameters.v1( 83720dd621STang Haojin clients = Seq(TLMasterParameters.v1( 84720dd621STang Haojin "tl", 85720dd621STang Haojin sourceId = IdRange(0, 1) 86720dd621STang Haojin )) 87720dd621STang Haojin )))) 88720dd621STang Haojin val axi4nodes = Seq.fill(2)(AXI4SlaveNode(Seq(AXI4SlavePortParameters( 89720dd621STang Haojin Seq(AXI4SlaveParameters( 90720dd621STang Haojin Seq(AddressSet(0x0, (1L << AXI_ADDR_WIDTH) - 1)), 91720dd621STang Haojin regionType = RegionType.UNCACHED, 92720dd621STang Haojin supportsWrite = TransferSizes(1, 4), 93720dd621STang Haojin supportsRead = TransferSizes(1, 4), 94720dd621STang Haojin interleavedId = Some(0) 95720dd621STang Haojin )), 96720dd621STang Haojin beatBytes = 4 97720dd621STang Haojin )))) 98720dd621STang Haojin axi4nodes zip tlnodes foreach { case (axi4node, tlnode) => 99720dd621STang Haojin axi4node := 100720dd621STang Haojin AXI4IdIndexer(AXI_ID_WIDTH) := 101720dd621STang Haojin AXI4Buffer() := 102720dd621STang Haojin AXI4Buffer() := 103720dd621STang Haojin AXI4UserYanker(Some(1)) := 104720dd621STang Haojin TLToAXI4() := 105720dd621STang Haojin TLWidthWidget(4) := 106720dd621STang Haojin TLFIFOFixer() := 107720dd621STang Haojin tlnode 108720dd621STang Haojin } 109720dd621STang Haojin 110720dd621STang Haojin (axi4nodes, tlnodes) 111720dd621STang Haojin } 112720dd621STang Haojin 113720dd621STang Haojin val axi4 = tuple_axi4_tl.map(_._1) 114720dd621STang Haojin private val tl = tuple_axi4_tl.map(_._2) 115720dd621STang Haojin val tl_m = tl.map(x => InModuleBody(x(0).makeIOs())) 116720dd621STang Haojin val tl_s = tl.map(x => InModuleBody(x(1).makeIOs())) 117720dd621STang Haojin 118720dd621STang Haojin class imsic_bus_top_imp(wrapper: imsic_bus_top) extends LazyModuleImp(wrapper) { 119720dd621STang Haojin // imsic csr top io 120720dd621STang Haojin val o_msi_info = IO(Output(UInt(MSI_INFO_WIDTH.W))) 121720dd621STang Haojin val o_msi_info_vld = IO(Output(Bool())) 122720dd621STang Haojin 123720dd621STang Haojin // axi4lite io 124720dd621STang Haojin val m_s = Option.when(!useTL)(IO(Flipped(new VerilogAXI4LiteRecord(AXI_ADDR_WIDTH, 32, AXI_ID_WIDTH)))) 125720dd621STang Haojin val s_s = Option.when(!useTL)(IO(Flipped(new VerilogAXI4LiteRecord(AXI_ADDR_WIDTH, 32, AXI_ID_WIDTH)))) 126720dd621STang Haojin 127720dd621STang Haojin // imsic axi top 128720dd621STang Haojin val u_imsic_axi_top = Module(new imsic_axi_top) 129720dd621STang Haojin 130720dd621STang Haojin // connection: crg 131720dd621STang Haojin u_imsic_axi_top.io.axi_clk := clock 132720dd621STang Haojin u_imsic_axi_top.io.axi_rstn := (~reset.asBool).asAsyncReset 133720dd621STang Haojin u_imsic_axi_top.io.fifo_rstn := (~reset.asBool).asAsyncReset // TODO: axi_rstn & sw_rstn 134720dd621STang Haojin 135720dd621STang Haojin // connection: imsic csr top 136720dd621STang Haojin o_msi_info := u_imsic_axi_top.io.o_msi_info 137720dd621STang Haojin o_msi_info_vld := u_imsic_axi_top.io.o_msi_info_vld 138720dd621STang Haojin 139720dd621STang Haojin // connection: axi4lite 140720dd621STang Haojin m_s.foreach(_ <> u_imsic_axi_top.io.m_s) 141720dd621STang Haojin s_s.foreach(_ <> u_imsic_axi_top.io.s_s) 142720dd621STang Haojin 143720dd621STang Haojin // connection: axi4 144720dd621STang Haojin wrapper.axi4.foreach { axi4 => 145720dd621STang Haojin axi4.map(_.in.head._1) zip Seq(u_imsic_axi_top.io.m_s, u_imsic_axi_top.io.s_s) foreach { 146720dd621STang Haojin case (axi4, axi4lite) => axi4lite.viewAs[AXI4LiteBundle].connectFromAXI4(axi4) 147720dd621STang Haojin } 148720dd621STang Haojin } 149720dd621STang Haojin } 150720dd621STang Haojin 151720dd621STang Haojin lazy val module = new imsic_bus_top_imp(this) 152720dd621STang Haojin} 153