xref: /XiangShan/src/main/scala/device/AXI4Timer.scala (revision e2100e1468765873ab0e5520db31c80b74487b7e)
184226e46SZihao Yu// See LICENSE.SiFive for license details.
284226e46SZihao Yu
384226e46SZihao Yupackage device
484226e46SZihao Yu
584226e46SZihao Yuimport chisel3._
684226e46SZihao Yuimport chisel3.util._
784226e46SZihao Yu
884226e46SZihao Yuimport memory.{AXI4, AXI4Parameters}
984226e46SZihao Yu
1084226e46SZihao Yuclass AXI4Timer() extends Module {
1184226e46SZihao Yu  val io = IO(new Bundle{
1284226e46SZihao Yu    val in = Flipped(new AXI4)
1384226e46SZihao Yu  })
1484226e46SZihao Yu
1584226e46SZihao Yu  val in = io.in
1684226e46SZihao Yu
1784226e46SZihao Yu  val clk = 50000 // 50MHz / 1000
1884226e46SZihao Yu  val tick = Counter(true.B, clk)._2
1984226e46SZihao Yu  val ms = Counter(tick, 0x40000000)._1
2084226e46SZihao Yu
2184226e46SZihao Yu  in.ar.ready := true.B
2284226e46SZihao Yu  in.aw.ready := true.B
2384226e46SZihao Yu  in.w.ready := true.B
24*e2100e14SZihao Yu
25*e2100e14SZihao Yu  // should deal with non-ready master
26*e2100e14SZihao Yu  in.b.valid := RegNext(in.aw.fire())
27*e2100e14SZihao Yu  in.r.valid := RegNext(in.ar.fire())
2884226e46SZihao Yu
2984226e46SZihao Yu  in.r.bits.data := ms
30*e2100e14SZihao Yu  in.r.bits.id := RegNext(in.ar.bits.id)
31*e2100e14SZihao Yu  in.r.bits.user := RegNext(in.ar.bits.user)
3284226e46SZihao Yu  in.r.bits.resp := AXI4Parameters.RESP_OKAY
3384226e46SZihao Yu  in.r.bits.last := true.B
34*e2100e14SZihao Yu  in.b.bits.id := RegNext(in.aw.bits.id)
35*e2100e14SZihao Yu  in.b.bits.user := RegNext(in.aw.bits.user)
3684226e46SZihao Yu  in.b.bits.resp := AXI4Parameters.RESP_OKAY
3784226e46SZihao Yu}
3884226e46SZihao Yu
3984226e46SZihao Yuobject TopAXI4Timer extends App {
4084226e46SZihao Yu  Driver.execute(args, () => new AXI4Timer)
4184226e46SZihao Yu}
42