184226e46SZihao Yupackage device 284226e46SZihao Yu 384226e46SZihao Yuimport chisel3._ 484226e46SZihao Yuimport chisel3.util._ 584226e46SZihao Yu 6ce6a2d5bSZihao Yuimport bus.axi4._ 7f10a0bcbSZihao Yuimport utils._ 884226e46SZihao Yu 9*891d22aaSZihao Yuclass TimerIO extends Bundle { 10*891d22aaSZihao Yu val mtip = Output(Bool()) 11*891d22aaSZihao Yu} 12*891d22aaSZihao Yu 13*891d22aaSZihao Yuclass AXI4Timer(sim: Boolean = false) extends AXI4SlaveModule(new AXI4Lite, new TimerIO) { 14*891d22aaSZihao Yu val mtime = RegInit(0.U(64.W)) // unit: ms 15*891d22aaSZihao Yu val mtimecmp = RegInit(0.U(64.W)) 16*891d22aaSZihao Yu 17*891d22aaSZihao Yu val clk = (if (!sim) 40000 /* 40MHz / 1000 */ else 2000) 1884226e46SZihao Yu val tick = Counter(true.B, clk)._2 19*891d22aaSZihao Yu when (tick) { mtime := mtime + 1.U } 20*891d22aaSZihao Yu 21*891d22aaSZihao Yu val mapping = Map( 22*891d22aaSZihao Yu RegMap(0x0, mtime), 23*891d22aaSZihao Yu RegMap(0x8, mtimecmp) 24*891d22aaSZihao Yu ) 25*891d22aaSZihao Yu 26*891d22aaSZihao Yu RegMap.generate(mapping, raddr(3,0), in.r.bits.data, 27*891d22aaSZihao Yu waddr(3,0), in.w.fire(), in.w.bits.data, MaskExpand(in.w.bits.strb)) 28*891d22aaSZihao Yu 29*891d22aaSZihao Yu io.extra.get.mtip := mtime >= mtimecmp 3084226e46SZihao Yu} 31