1d7763dc0SZihao Yupackage device 2d7763dc0SZihao Yu 3d7763dc0SZihao Yuimport chisel3._ 4d7763dc0SZihao Yuimport chisel3.util._ 5d7763dc0SZihao Yu 6d7763dc0SZihao Yuimport bus.axi4._ 7d7763dc0SZihao Yuimport utils._ 8d7763dc0SZihao Yu 9*b65ec060SZihao Yuclass UARTGetc extends BlackBox with HasBlackBoxInline { 10*b65ec060SZihao Yu val io = IO(new Bundle { 11*b65ec060SZihao Yu val clk = Input(Clock()) 12*b65ec060SZihao Yu val getc = Input(Bool()) 13*b65ec060SZihao Yu val ch = Output(UInt(8.W)) 14*b65ec060SZihao Yu }) 15*b65ec060SZihao Yu 16*b65ec060SZihao Yu setInline("UARTGetc.v", 17*b65ec060SZihao Yu s""" 18*b65ec060SZihao Yu |import "DPI-C" function byte uart_getc(output byte ch); 19*b65ec060SZihao Yu | 20*b65ec060SZihao Yu |module UARTGetc ( 21*b65ec060SZihao Yu | input clk, 22*b65ec060SZihao Yu | input getc, 23*b65ec060SZihao Yu | output reg [7:0] ch 24*b65ec060SZihao Yu |); 25*b65ec060SZihao Yu | 26*b65ec060SZihao Yu | always@(posedge clk) begin 27*b65ec060SZihao Yu | if (getc) uart_getc(ch); 28*b65ec060SZihao Yu | end 29*b65ec060SZihao Yu | 30*b65ec060SZihao Yu |endmodule 31*b65ec060SZihao Yu """.stripMargin) 32*b65ec060SZihao Yu} 33*b65ec060SZihao 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 40*b65ec060SZihao Yu val getcHelper = Module(new UARTGetc) 41*b65ec060SZihao Yu getcHelper.io.clk := clock 42*b65ec060SZihao Yu getcHelper.io.getc := (raddr(3,0) === 0.U && ren) 43*b65ec060SZihao Yu when (getcHelper.io.getc) { rxfifo := getcHelper.io.ch } 44*b65ec060SZihao Yu 45d7763dc0SZihao Yu def putc(c: UInt): UInt = { printf("%c", c(7,0)); c } 46d7763dc0SZihao Yu 47d7763dc0SZihao Yu val mapping = Map( 48d7763dc0SZihao Yu RegMap(0x0, rxfifo), 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, 55d7763dc0SZihao Yu waddr(3,0), in.w.fire(), in.w.bits.data, MaskExpand(in.w.bits.strb)) 56d7763dc0SZihao Yu} 57