xref: /XiangShan/src/main/scala/device/imsic_axi_top.scala (revision 8cfc24b28454f1915c339ce79485711f8e438f59)
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