xref: /XiangShan/src/main/scala/device/AXI4Timer.scala (revision f10a0bcb08d0830442e584a49ac59359f910dd54)
184226e46SZihao Yu// See LICENSE.SiFive for license details.
284226e46SZihao Yu
384226e46SZihao Yupackage device
484226e46SZihao Yu
584226e46SZihao Yuimport chisel3._
684226e46SZihao Yuimport chisel3.util._
784226e46SZihao Yu
8ce6a2d5bSZihao Yuimport bus.axi4._
9*f10a0bcbSZihao Yuimport utils._
1084226e46SZihao Yu
1189b48a46SZihao Yuclass AXI4Timer extends Module {
1284226e46SZihao Yu  val io = IO(new Bundle{
1389b48a46SZihao Yu    val in = Flipped(new AXI4Lite)
1484226e46SZihao Yu  })
1584226e46SZihao Yu
1684226e46SZihao Yu  val in = io.in
1784226e46SZihao Yu
1884226e46SZihao Yu  val clk = 50000 // 50MHz / 1000
1984226e46SZihao Yu  val tick = Counter(true.B, clk)._2
2084226e46SZihao Yu  val ms = Counter(tick, 0x40000000)._1
2184226e46SZihao Yu
220ec58e86SZihao Yu  // deal with non-rready master
23*f10a0bcbSZihao Yu  val rInflight = BoolStopWatch(in.ar.fire(), in.r.fire(), startHighPriority = true)
240ec58e86SZihao Yu  in.ar.ready := in.r.ready || !rInflight
250ec58e86SZihao Yu  in.r.valid := rInflight
2684226e46SZihao Yu  in.r.bits.data := ms
2784226e46SZihao Yu  in.r.bits.resp := AXI4Parameters.RESP_OKAY
280ec58e86SZihao Yu
290ec58e86SZihao Yu  // deal with non-bready master
30*f10a0bcbSZihao Yu  val wInflight = BoolStopWatch(in.aw.fire(), in.b.fire(), startHighPriority = true)
310ec58e86SZihao Yu  in.aw.ready := in.w.valid && (in.b.ready || !wInflight)
320ec58e86SZihao Yu  in.w.ready := in.aw.valid && (in.b.ready || !wInflight)
330ec58e86SZihao Yu  in.b.valid := wInflight
3484226e46SZihao Yu  in.b.bits.resp := AXI4Parameters.RESP_OKAY
3584226e46SZihao Yu}
36