xref: /XiangShan/src/main/scala/device/TLTimer.scala (revision 8b33cd30e0034914b58520e0dc3c0c4b1aad6a03)
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
17618fb109Slinjiaweipackage device
18618fb109Slinjiawei
19618fb109Slinjiaweiimport chisel3._
20618fb109Slinjiaweiimport chisel3.util._
21618fb109Slinjiaweiimport freechips.rocketchip.tilelink._
228891a219SYinan Xuimport org.chipsalliance.cde.config._
23618fb109Slinjiaweiimport freechips.rocketchip.diplomacy._
241865a66fSlinjiaweiimport freechips.rocketchip.regmapper.RegField
25bb2f3f51STang Haojinimport utils.HasTLDump
26bb2f3f51STang Haojinimport utility.XSDebug
27618fb109Slinjiawei
282225d46eSJiawei Linclass TLTimer(address: Seq[AddressSet], sim: Boolean, numCores: Int)(implicit p: Parameters) extends LazyModule {
29618fb109Slinjiawei
30618fb109Slinjiawei  val device = new SimpleDevice("clint", Seq("XiangShan", "clint"))
31618fb109Slinjiawei  val node = TLRegisterNode(address, device, beatBytes = 8)
32618fb109Slinjiawei
335c5bd416Sljw  lazy val module = new LazyModuleImp(this) with HasTLDump {
34799b61e0SLinJiawei    val io = IO(new Bundle() {
352225d46eSJiawei Lin      val mtip = Output(Vec(numCores, Bool()))
362225d46eSJiawei Lin      val msip = Output(Vec(numCores, Bool()))
37799b61e0SLinJiawei    })
38618fb109Slinjiawei
39618fb109Slinjiawei    val mtime = RegInit(0.U(64.W))  // unit: us
402225d46eSJiawei Lin    val mtimecmp = Seq.fill(numCores)(RegInit(0.U(64.W)))
412225d46eSJiawei Lin    val msip = Seq.fill(numCores)(RegInit(0.U(32.W)))
42618fb109Slinjiawei
43e2b04952SYinan Xu    val clk = (if (!sim) 1000000 /* 40MHz / 1000000 */ else 100)
44298aa395SYinan Xu    val freq = RegInit(clk.U(64.W))
45298aa395SYinan Xu    val inc = RegInit(1.U(64.W))
46618fb109Slinjiawei
47298aa395SYinan Xu    val cnt = RegInit(0.U(64.W))
48618fb109Slinjiawei    val nextCnt = cnt + 1.U
49618fb109Slinjiawei    cnt := Mux(nextCnt < freq, nextCnt, 0.U)
50618fb109Slinjiawei    val tick = (nextCnt === freq)
51618fb109Slinjiawei    when (tick) { mtime := mtime + inc }
52618fb109Slinjiawei
530668d426Swangkaifan    var clintMapping = Seq(
54618fb109Slinjiawei      0x8000 -> RegField.bytes(freq),
55618fb109Slinjiawei      0x8008 -> RegField.bytes(inc),
560668d426Swangkaifan      0xbff8 -> RegField.bytes(mtime))
570668d426Swangkaifan
582225d46eSJiawei Lin    for (i <- 0 until numCores) {
590668d426Swangkaifan      clintMapping = clintMapping ++ Seq(
600668d426Swangkaifan        0x0000 + i*4 -> RegField.bytes(msip(i)),
610668d426Swangkaifan        0x4000 + i*8 -> RegField.bytes(mtimecmp(i))
62618fb109Slinjiawei      )
630668d426Swangkaifan    }
640668d426Swangkaifan
650668d426Swangkaifan    node.regmap( mapping = clintMapping:_* )
66618fb109Slinjiawei
671865a66fSlinjiawei    val in = node.in.head._1
68*8b33cd30Sklin02    XSDebug(in.a.valid, "[A] channel valid ready=%d ", in.a.ready)
69*8b33cd30Sklin02    in.a.bits.dump(in.a.valid)
701865a66fSlinjiawei
712225d46eSJiawei Lin    for (i <- 0 until numCores) {
720668d426Swangkaifan      io.mtip(i) := RegNext(mtime >= mtimecmp(i))
730668d426Swangkaifan      io.msip(i) := RegNext(msip(i) =/= 0.U)
740668d426Swangkaifan    }
75618fb109Slinjiawei  }
76618fb109Slinjiawei}
77