1618fb109Slinjiaweipackage device 2618fb109Slinjiawei 3618fb109Slinjiaweiimport chisel3._ 4618fb109Slinjiaweiimport chisel3.util._ 5618fb109Slinjiaweiimport freechips.rocketchip.tilelink._ 6618fb109Slinjiaweiimport chipsalliance.rocketchip.config._ 7618fb109Slinjiaweiimport chisel3.util.experimental.BoringUtils 8618fb109Slinjiaweiimport freechips.rocketchip.diplomacy._ 91865a66fSlinjiaweiimport freechips.rocketchip.regmapper.RegField 101865a66fSlinjiaweiimport utils.{HasTLDump, XSDebug} 111865a66fSlinjiaweiimport xiangshan.HasXSLog 12618fb109Slinjiawei 13618fb109Slinjiaweiclass TLTimer(address: Seq[AddressSet], sim: Boolean)(implicit p: Parameters) extends LazyModule { 14618fb109Slinjiawei 15618fb109Slinjiawei val device = new SimpleDevice("clint", Seq("XiangShan", "clint")) 16618fb109Slinjiawei val node = TLRegisterNode(address, device, beatBytes = 8) 17618fb109Slinjiawei 181865a66fSlinjiawei lazy val module = new LazyModuleImp(this) with HasXSLog with HasTLDump{ 19*799b61e0SLinJiawei val io = IO(new Bundle() { 20*799b61e0SLinJiawei val mtip = Output(Bool()) 21*799b61e0SLinJiawei val msip = Output(Bool()) 22*799b61e0SLinJiawei }) 23618fb109Slinjiawei 24618fb109Slinjiawei val mtime = RegInit(0.U(64.W)) // unit: us 25618fb109Slinjiawei val mtimecmp = RegInit(0.U(64.W)) 26*799b61e0SLinJiawei val msip = RegInit(0.U(64.W)) 27618fb109Slinjiawei 28618fb109Slinjiawei val clk = (if (!sim) 40 /* 40MHz / 1000000 */ else 100) 29618fb109Slinjiawei val freq = RegInit(clk.U(16.W)) 30618fb109Slinjiawei val inc = RegInit(1000.U(16.W)) 31618fb109Slinjiawei 32618fb109Slinjiawei val cnt = RegInit(0.U(16.W)) 33618fb109Slinjiawei val nextCnt = cnt + 1.U 34618fb109Slinjiawei cnt := Mux(nextCnt < freq, nextCnt, 0.U) 35618fb109Slinjiawei val tick = (nextCnt === freq) 36618fb109Slinjiawei when (tick) { mtime := mtime + inc } 37618fb109Slinjiawei 38618fb109Slinjiawei if (sim) { 39618fb109Slinjiawei val isWFI = WireInit(false.B) 40618fb109Slinjiawei BoringUtils.addSink(isWFI, "isWFI") 41618fb109Slinjiawei when (isWFI) { mtime := mtime + 100000.U } 42618fb109Slinjiawei } 43618fb109Slinjiawei 44618fb109Slinjiawei node.regmap( mapping = 45*799b61e0SLinJiawei 0x0000 -> RegField.bytes(msip), 46618fb109Slinjiawei 0x4000 -> RegField.bytes(mtimecmp), 47618fb109Slinjiawei 0x8000 -> RegField.bytes(freq), 48618fb109Slinjiawei 0x8008 -> RegField.bytes(inc), 49618fb109Slinjiawei 0xbff8 -> RegField.bytes(mtime) 50618fb109Slinjiawei ) 51618fb109Slinjiawei 521865a66fSlinjiawei val in = node.in.head._1 531865a66fSlinjiawei when(in.a.valid){ 541865a66fSlinjiawei XSDebug("[A] channel valid ready=%d ", in.a.ready) 551865a66fSlinjiawei in.a.bits.dump 561865a66fSlinjiawei } 571865a66fSlinjiawei 58e2801f97Slinjiawei// val gtime = GTimer() 59e2801f97Slinjiawei// printf(p"[$gtime][Timer] mtime=$mtime cnt=$cnt freq=$freq\n") 60618fb109Slinjiawei 61*799b61e0SLinJiawei io.mtip := RegNext(mtime >= mtimecmp) 62*799b61e0SLinJiawei io.msip := RegNext(msip =/= 0.U) 63618fb109Slinjiawei } 64618fb109Slinjiawei} 65