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