1d7763dc0SZihao Yupackage device 2d7763dc0SZihao Yu 3d7763dc0SZihao Yuimport chisel3._ 4d7763dc0SZihao Yuimport chisel3.util._ 5d7763dc0SZihao Yu 6d7763dc0SZihao Yuimport bus.axi4._ 7d7763dc0SZihao Yuimport utils._ 8d7763dc0SZihao Yu 9b65ec060SZihao Yuclass UARTGetc extends BlackBox with HasBlackBoxInline { 10b65ec060SZihao Yu val io = IO(new Bundle { 11b65ec060SZihao Yu val clk = Input(Clock()) 12b65ec060SZihao Yu val getc = Input(Bool()) 13b65ec060SZihao Yu val ch = Output(UInt(8.W)) 14b65ec060SZihao Yu }) 15b65ec060SZihao Yu 16b65ec060SZihao Yu setInline("UARTGetc.v", 17b65ec060SZihao Yu s""" 18*bf1f0a15SZihao Yu |import "DPI-C" function void uart_getc(output byte ch); 19b65ec060SZihao Yu | 20b65ec060SZihao Yu |module UARTGetc ( 21b65ec060SZihao Yu | input clk, 22b65ec060SZihao Yu | input getc, 23b65ec060SZihao Yu | output reg [7:0] ch 24b65ec060SZihao Yu |); 25b65ec060SZihao Yu | 26b65ec060SZihao Yu | always@(posedge clk) begin 27b65ec060SZihao Yu | if (getc) uart_getc(ch); 28b65ec060SZihao Yu | end 29b65ec060SZihao Yu | 30b65ec060SZihao Yu |endmodule 31b65ec060SZihao Yu """.stripMargin) 32b65ec060SZihao Yu} 33b65ec060SZihao Yu 34d7763dc0SZihao Yuclass AXI4UART extends AXI4SlaveModule(new AXI4Lite) { 35d7763dc0SZihao Yu val rxfifo = RegInit(0.U(32.W)) 36d7763dc0SZihao Yu val txfifo = Reg(UInt(32.W)) 37d7763dc0SZihao Yu val stat = RegInit(1.U(32.W)) 38d7763dc0SZihao Yu val ctrl = RegInit(0.U(32.W)) 39d7763dc0SZihao Yu 40b65ec060SZihao Yu val getcHelper = Module(new UARTGetc) 41b65ec060SZihao Yu getcHelper.io.clk := clock 42b65ec060SZihao Yu getcHelper.io.getc := (raddr(3,0) === 0.U && ren) 43b65ec060SZihao Yu 44d7763dc0SZihao Yu def putc(c: UInt): UInt = { printf("%c", c(7,0)); c } 458171fe6aSZihao Yu def getc = getcHelper.io.ch 46d7763dc0SZihao Yu 47d7763dc0SZihao Yu val mapping = Map( 488171fe6aSZihao Yu RegMap(0x0, getc, RegMap.Unwritable), 49d7763dc0SZihao Yu RegMap(0x4, txfifo, putc), 50d7763dc0SZihao Yu RegMap(0x8, stat), 51d7763dc0SZihao Yu RegMap(0xc, ctrl) 52d7763dc0SZihao Yu ) 53d7763dc0SZihao Yu 54d7763dc0SZihao Yu RegMap.generate(mapping, raddr(3,0), in.r.bits.data, 5599de3230SZihao Yu waddr(3,0), in.w.fire(), in.w.bits.data, MaskExpand(in.w.bits.strb >> waddr(2,0))) 56d7763dc0SZihao Yu} 57