xref: /XiangShan/src/main/scala/device/standalone/StandAloneCLINT.scala (revision 2f9ea9542b31fdf8754121721dddb83b21f14e88)
1720dd621STang Haojin/***************************************************************************************
2720dd621STang Haojin* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3720dd621STang Haojin* Copyright (c) 2020-2021 Peng Cheng Laboratory
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.standalone
18720dd621STang Haojin
19720dd621STang Haojinimport chisel3._
205ca12de1SHaojin Tangimport chisel3.util._
21720dd621STang Haojinimport freechips.rocketchip.diplomacy._
22720dd621STang Haojinimport org.chipsalliance.cde.config.Parameters
23720dd621STang Haojinimport freechips.rocketchip.devices.tilelink._
24720dd621STang Haojinimport freechips.rocketchip.interrupts._
25*2f9ea954STang Haojinimport utility.IntBuffer
26720dd621STang Haojin
27720dd621STang Haojinclass StandAloneCLINT (
28720dd621STang Haojin  useTL: Boolean = false,
29720dd621STang Haojin  baseAddress: BigInt,
30720dd621STang Haojin  addrWidth: Int,
31720dd621STang Haojin  dataWidth: Int = 64,
32720dd621STang Haojin  hartNum: Int
33720dd621STang Haojin)(implicit p: Parameters) extends StandAloneDevice(
34720dd621STang Haojin  useTL, baseAddress, addrWidth, dataWidth, hartNum
35720dd621STang Haojin) {
36720dd621STang Haojin
37720dd621STang Haojin  private def clintParam = CLINTParams(baseAddress)
38720dd621STang Haojin  def addressSet: AddressSet = clintParam.address
39720dd621STang Haojin
40720dd621STang Haojin  private val clint = LazyModule(new CLINT(clintParam, dataWidth / 8))
41720dd621STang Haojin  clint.node := xbar
42720dd621STang Haojin
43720dd621STang Haojin  // interrupts
44720dd621STang Haojin  val clintIntNode = IntSinkNode(IntSinkPortSimple(hartNum, 2))
45*2f9ea954STang Haojin  clintIntNode :*= IntBuffer() :*= clint.intnode
46720dd621STang Haojin  val int = InModuleBody(clintIntNode.makeIOs())
47720dd621STang Haojin
48720dd621STang Haojin  class StandAloneCLINTImp(outer: StandAloneCLINT)(implicit p: Parameters) extends StandAloneDeviceImp(outer) {
49720dd621STang Haojin    val io = IO(new Bundle {
50720dd621STang Haojin      val rtcTick = Input(Bool())
515ca12de1SHaojin Tang      val time = Output(ValidIO(UInt(64.W)))
52720dd621STang Haojin    })
53720dd621STang Haojin    outer.clint.module.io.rtcTick := io.rtcTick
545ca12de1SHaojin Tang    io.time := outer.clint.module.io.time
55720dd621STang Haojin  }
56720dd621STang Haojin
57720dd621STang Haojin  override lazy val module = new StandAloneCLINTImp(this)
58720dd621STang Haojin
59720dd621STang Haojin}
60