1package top 2 3import chisel3._ 4import chisel3.util._ 5 6import bus.simplebus.SimpleBus 7 8class SimMMIO extends Module { 9 val io = IO(new Bundle { 10 val rw = Flipped(new SimpleBus) 11 val mmioTrap = new Bundle { 12 val valid = Output(Bool()) 13 val cmd = Output(UInt(3.W)) 14 val rdata = Input(UInt(32.W)) 15 } 16 }) 17 18 val wen = io.rw.isWrite() 19 val wdataVec = VecInit.tabulate(4) { i => io.rw.req.bits.wdata(8 * (i + 1) - 1, 8 * i) } 20 val wmask = VecInit.tabulate(4) { i => io.rw.req.bits.wmask(i).toBool } 21 22 io.mmioTrap.valid := false.B 23 io.mmioTrap.cmd := 0.U 24 25 when (io.rw.req.valid) { 26 switch (io.rw.req.bits.addr) { 27 is (0x40600008.U) { 28 // read uartlite stat register 29 io.mmioTrap.valid := true.B 30 io.mmioTrap.cmd := 0.U 31 } 32 is (0x4060000c.U) { 33 // read uartlite ctrl register 34 io.mmioTrap.valid := true.B 35 io.mmioTrap.cmd := 0.U 36 } 37 is (0x40600004.U) { 38 io.mmioTrap.valid := true.B 39 io.mmioTrap.cmd := 6.U 40 when (wen) { printf("%c", wdataVec(0)) } 41 } 42 is (0x40700000.U) { 43 // read RTC 44 io.mmioTrap.valid := true.B 45 io.mmioTrap.cmd := 1.U 46 } 47 is (0x40900000.U) { 48 // read key 49 io.mmioTrap.valid := true.B 50 io.mmioTrap.cmd := 2.U 51 } 52 is (0x40800000.U) { 53 // read screen size 54 io.mmioTrap.valid := true.B 55 io.mmioTrap.cmd := 3.U 56 } 57 is (0x40800004.U) { 58 // write vga sync 59 io.mmioTrap.valid := true.B 60 io.mmioTrap.cmd := 4.U 61 } 62 } 63 64 when (io.rw.req.bits.addr >= 0x40000000.U && io.rw.req.bits.addr < 0x40400000.U && wen) { 65 // write to vmem 66 io.mmioTrap.valid := true.B 67 io.mmioTrap.cmd := 5.U 68 } 69 } 70 71 io.rw.req.ready := true.B 72 io.rw.resp.bits.rdata := io.mmioTrap.rdata 73 io.rw.resp.valid := io.mmioTrap.valid 74 75 assert(!io.rw.req.valid || io.mmioTrap.valid, "bad addr = 0x%x", io.rw.req.bits.addr) 76} 77