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