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