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