xref: /XiangShan/src/test/scala/top/SimMMIO.scala (revision bbe4506dea963b9c4bf6379d789e413ba6647955)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
177a4f04e7SZihao Yupackage top
187a4f04e7SZihao Yu
197a4f04e7SZihao Yuimport chisel3._
20*bbe4506dSTang Haojinimport org.chipsalliance.cde.config.Parameters
219c43f7c7SZihao Yuimport device._
222225d46eSJiawei Linimport freechips.rocketchip.amba.axi4.{AXI4EdgeParameters, AXI4MasterNode, AXI4Xbar}
232225d46eSJiawei Linimport freechips.rocketchip.diplomacy.{AddressSet, InModuleBody, LazyModule, LazyModuleImp}
24a3e87608SWilliam Wangimport difftest._
25d880df45Szhanglinjuanimport utility.AXI4Error
26*bbe4506dSTang Haojinimport system.{HasPeripheralRanges, HasSoCParameter}
2752fcd981SZihao Yu
28*bbe4506dSTang Haojinclass SimMMIO(edge: AXI4EdgeParameters)(implicit p: Parameters) extends LazyModule
29*bbe4506dSTang Haojin  with HasSoCParameter
30*bbe4506dSTang Haojin  with HasPeripheralRanges
31*bbe4506dSTang Haojin{
322225d46eSJiawei Lin
332225d46eSJiawei Lin  val node = AXI4MasterNode(List(edge.master))
340ccdef88Slinjiawei
35d880df45Szhanglinjuan  // val uartRange = AddressSet(0x40600000, 0x3f) // ?
36d880df45Szhanglinjuan  val flashRange = AddressSet(0x10000000L, 0xfffffff)
37d880df45Szhanglinjuan  val sdRange = AddressSet(0x40002000L, 0xfff)
38d880df45Szhanglinjuan  val intrGenRange = AddressSet(0x40070000L, 0x0000ffffL)
39d880df45Szhanglinjuan
40*bbe4506dSTang Haojin  val illegalRange = (onChipPeripheralRanges.values ++ Seq(
41*bbe4506dSTang Haojin    soc.UARTLiteRange,
42d880df45Szhanglinjuan    flashRange,
43d880df45Szhanglinjuan    sdRange,
44d880df45Szhanglinjuan    intrGenRange
45*bbe4506dSTang Haojin  )).foldLeft(Seq(AddressSet(0x0, 0x7fffffffL)))((acc, x) => acc.flatMap(_.subtract(x)))
46d880df45Szhanglinjuan
474c5b8ec5SYinan Xu  val flash = LazyModule(new AXI4Flash(Seq(AddressSet(0x10000000L, 0xfffffff))))
48*bbe4506dSTang Haojin  val uart = LazyModule(new AXI4UART(Seq(soc.UARTLiteRange)))
49613eddadSYinan Xu  // val vga = LazyModule(new AXI4VGA(
50613eddadSYinan Xu  //   sim = false,
51613eddadSYinan Xu  //   fbAddress = Seq(AddressSet(0x50000000L, 0x3fffffL)),
52613eddadSYinan Xu  //   ctrlAddress = Seq(AddressSet(0x40001000L, 0x7L))
53613eddadSYinan Xu  // ))
54a2e9bde6SAllen  val sd = LazyModule(new AXI4DummySD(Seq(AddressSet(0x40002000L, 0xfff))))
55b6a21a24SYinan Xu  val intrGen = LazyModule(new AXI4IntrGenerator(Seq(AddressSet(0x40070000L, 0x0000ffffL))))
56d880df45Szhanglinjuan  val error = LazyModule(new AXI4Error(illegalRange))
570ccdef88Slinjiawei
580ccdef88Slinjiawei  val axiBus = AXI4Xbar()
590ccdef88Slinjiawei
600ccdef88Slinjiawei  uart.node := axiBus
61613eddadSYinan Xu  // vga.node :*= axiBus
620ccdef88Slinjiawei  flash.node := axiBus
630ccdef88Slinjiawei  sd.node := axiBus
64b6a21a24SYinan Xu  intrGen.node := axiBus
65d880df45Szhanglinjuan  error.node := axiBus
660ccdef88Slinjiawei
672225d46eSJiawei Lin  axiBus := node
682225d46eSJiawei Lin
692225d46eSJiawei Lin  val io_axi4 = InModuleBody {
702225d46eSJiawei Lin    node.makeIOs()
712225d46eSJiawei Lin  }
722225d46eSJiawei Lin
73935edac4STang Haojin  class SimMMIOImp(wrapper: LazyModule) extends LazyModuleImp(wrapper) {
740ccdef88Slinjiawei    val io = IO(new Bundle() {
75a428082bSLinJiawei      val uart = new UARTIO
76b6a21a24SYinan Xu      val interrupt = new IntrGenIO
777a4f04e7SZihao Yu    })
780ccdef88Slinjiawei    io.uart <> uart.module.io.extra.get
79b6a21a24SYinan Xu    io.interrupt <> intrGen.module.io.extra.get
807a4f04e7SZihao Yu  }
810ccdef88Slinjiawei
82935edac4STang Haojin  lazy val module = new SimMMIOImp(this)
830ccdef88Slinjiawei}
84