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