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 org.chipsalliance.cde.config.Parameters 22720dd621STang Haojinimport freechips.rocketchip.diplomacy._ 23720dd621STang Haojinimport freechips.rocketchip.amba.axi4._ 24720dd621STang Haojinimport freechips.rocketchip.tilelink._ 25*8cfc24b2STang Haojinimport system.HasSoCParameter 26720dd621STang Haojin 27*8cfc24b2STang Haojinobject IMSICBusType extends Enumeration { 28*8cfc24b2STang Haojin val NONE, TL, AXI = Value 29720dd621STang Haojin} 30720dd621STang Haojin 31*8cfc24b2STang Haojinclass imsic_bus_top(implicit p: Parameters) extends LazyModule with HasSoCParameter { 32*8cfc24b2STang Haojin // Tilelink Bus 33*8cfc24b2STang Haojin val tl_reg_imsic = Option.when(soc.IMSICBusType == device.IMSICBusType.TL)(LazyModule(new aia.TLRegIMSIC(soc.IMSICParams, seperateBus = true))) 34720dd621STang Haojin 35*8cfc24b2STang Haojin val tl = tl_reg_imsic.map { tl_reg_imsic => 369143e232SJiuyue Ma val tlnodes = Seq.fill(2)(TLClientNode(Seq(TLMasterPortParameters.v1( 379143e232SJiuyue Ma clients = Seq(TLMasterParameters.v1( 389143e232SJiuyue Ma "tl", 39*8cfc24b2STang Haojin sourceId = IdRange(0, 65536) 409143e232SJiuyue Ma )) 41720dd621STang Haojin )))) 42*8cfc24b2STang Haojin tl_reg_imsic.fromMem zip tlnodes foreach { case (fromMem, tlnode) => 43*8cfc24b2STang Haojin fromMem := 44720dd621STang Haojin TLWidthWidget(4) := 45720dd621STang Haojin TLFIFOFixer() := 4618560912STang Haojin TLBuffer() := 47720dd621STang Haojin tlnode 48720dd621STang Haojin } 499143e232SJiuyue Ma tlnodes 50720dd621STang Haojin } 51720dd621STang Haojin 52720dd621STang Haojin val tl_m = tl.map(x => InModuleBody(x(0).makeIOs())) 53720dd621STang Haojin val tl_s = tl.map(x => InModuleBody(x(1).makeIOs())) 54720dd621STang Haojin 55*8cfc24b2STang Haojin // AXI4 Bus 56*8cfc24b2STang Haojin val axi_reg_imsic = Option.when(soc.IMSICBusType == device.IMSICBusType.AXI)(LazyModule(new aia.AXIRegIMSIC(soc.IMSICParams, seperateBus = false))) 57*8cfc24b2STang Haojin 58*8cfc24b2STang Haojin val axi = axi_reg_imsic.map { axi_reg_imsic => 59*8cfc24b2STang Haojin val axinode = AXI4MasterNode(Seq(AXI4MasterPortParameters( 609143e232SJiuyue Ma Seq(AXI4MasterParameters( 619143e232SJiuyue Ma name = "s_axi_", 62*8cfc24b2STang Haojin id = IdRange(0, 65536) 639143e232SJiuyue Ma )) 649143e232SJiuyue Ma ))) 65*8cfc24b2STang Haojin axi_reg_imsic.axi4tolite.head.node := AXI4Buffer() := axinode 66*8cfc24b2STang Haojin axinode 679143e232SJiuyue Ma } 689143e232SJiuyue Ma 69*8cfc24b2STang Haojin val axi4 = axi.map(x => InModuleBody(x.makeIOs())) 70*8cfc24b2STang Haojin 71720dd621STang Haojin class imsic_bus_top_imp(wrapper: imsic_bus_top) extends LazyModuleImp(wrapper) { 72*8cfc24b2STang Haojin val msiio = IO(Flipped(new aia.MSITransBundle(soc.IMSICParams))) 73720dd621STang Haojin 74*8cfc24b2STang Haojin // No Bus 75*8cfc24b2STang Haojin val msi = Option.when(soc.IMSICBusType == device.IMSICBusType.NONE)( 76*8cfc24b2STang Haojin IO(new aia.MSITransBundle(soc.IMSICParams)) 77*8cfc24b2STang Haojin ) 78720dd621STang Haojin 79*8cfc24b2STang Haojin tl_reg_imsic.foreach(_.module.msiio <> msiio) 80*8cfc24b2STang Haojin axi_reg_imsic.foreach(_.module.msiio <> msiio) 81*8cfc24b2STang Haojin msi.foreach(_ <> msiio) 82720dd621STang Haojin } 83720dd621STang Haojin 84720dd621STang Haojin lazy val module = new imsic_bus_top_imp(this) 85720dd621STang Haojin} 86