xref: /XiangShan/src/main/scala/device/AXI4Timer.scala (revision ce6a2d5bb7abbcf53184dd04f9c7d597853c6bac)
184226e46SZihao Yu// See LICENSE.SiFive for license details.
284226e46SZihao Yu
384226e46SZihao Yupackage device
484226e46SZihao Yu
584226e46SZihao Yuimport chisel3._
684226e46SZihao Yuimport chisel3.util._
784226e46SZihao Yu
8*ce6a2d5bSZihao Yuimport bus.axi4._
984226e46SZihao Yu
1089b48a46SZihao Yuclass AXI4Timer extends Module {
1184226e46SZihao Yu  val io = IO(new Bundle{
1289b48a46SZihao Yu    val in = Flipped(new AXI4Lite)
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
210ec58e86SZihao Yu  // deal with non-rready master
220ec58e86SZihao Yu  val rInflight = RegInit(false.B)
230ec58e86SZihao Yu  when (in.ar.fire()) { rInflight := true.B }
240ec58e86SZihao Yu  when (in. r.fire()) { rInflight := false.B }
25e2100e14SZihao Yu
260ec58e86SZihao Yu  in.ar.ready := in.r.ready || !rInflight
270ec58e86SZihao Yu  in.r.valid := rInflight
2884226e46SZihao Yu  in.r.bits.data := ms
2984226e46SZihao Yu  in.r.bits.resp := AXI4Parameters.RESP_OKAY
300ec58e86SZihao Yu
310ec58e86SZihao Yu  // deal with non-bready master
320ec58e86SZihao Yu  val wInflight = RegInit(false.B)
330ec58e86SZihao Yu  when (in.aw.fire()) { wInflight := true.B }
340ec58e86SZihao Yu  when (in. b.fire()) { wInflight := false.B }
350ec58e86SZihao Yu
360ec58e86SZihao Yu  in.aw.ready := in.w.valid && (in.b.ready || !wInflight)
370ec58e86SZihao Yu  in.w.ready := in.aw.valid && (in.b.ready || !wInflight)
380ec58e86SZihao Yu  in.b.valid := wInflight
3984226e46SZihao Yu  in.b.bits.resp := AXI4Parameters.RESP_OKAY
4084226e46SZihao Yu}
41