xref: /XiangShan/src/main/scala/device/AXI4Timer.scala (revision 0ec58e86fa3622d4db23bc7fb88fc12fc15e2dfe)
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
21*0ec58e86SZihao Yu  // deal with non-rready master
22*0ec58e86SZihao Yu  val rInflight = RegInit(false.B)
23*0ec58e86SZihao Yu  when (in.ar.fire()) { rInflight := true.B }
24*0ec58e86SZihao Yu  when (in. r.fire()) { rInflight := false.B }
25e2100e14SZihao Yu
26*0ec58e86SZihao Yu  val rId = RegEnable(in.ar.bits.id, in.ar.fire())
27*0ec58e86SZihao Yu  val rUser = RegEnable(in.ar.bits.user, in.ar.fire())
28*0ec58e86SZihao Yu  in.ar.ready := in.r.ready || !rInflight
29*0ec58e86SZihao Yu  in.r.valid := rInflight
30*0ec58e86SZihao Yu  in.r.bits.id := rId
31*0ec58e86SZihao Yu  in.r.bits.user := rUser
3284226e46SZihao Yu  in.r.bits.data := ms
3384226e46SZihao Yu  in.r.bits.resp := AXI4Parameters.RESP_OKAY
3484226e46SZihao Yu  in.r.bits.last := true.B
35*0ec58e86SZihao Yu
36*0ec58e86SZihao Yu  // deal with non-bready master
37*0ec58e86SZihao Yu  val wInflight = RegInit(false.B)
38*0ec58e86SZihao Yu  when (in.aw.fire()) { wInflight := true.B }
39*0ec58e86SZihao Yu  when (in. b.fire()) { wInflight := false.B }
40*0ec58e86SZihao Yu
41*0ec58e86SZihao Yu  val bId = RegEnable(in.aw.bits.id, in.aw.fire())
42*0ec58e86SZihao Yu  val bUser = RegEnable(in.aw.bits.user, in.aw.fire())
43*0ec58e86SZihao Yu  in.aw.ready := in.w.valid && (in.b.ready || !wInflight)
44*0ec58e86SZihao Yu  in.w.ready := in.aw.valid && (in.b.ready || !wInflight)
45*0ec58e86SZihao Yu  in.b.valid := wInflight
46*0ec58e86SZihao Yu  in.b.bits.id := bId
47*0ec58e86SZihao Yu  in.b.bits.user := bUser
4884226e46SZihao Yu  in.b.bits.resp := AXI4Parameters.RESP_OKAY
4984226e46SZihao Yu}
5084226e46SZihao Yu
5184226e46SZihao Yuobject TopAXI4Timer extends App {
5284226e46SZihao Yu  Driver.execute(args, () => new AXI4Timer)
5384226e46SZihao Yu}
54