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""" 18bf1f0a15SZihao 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 34*d18aeea6SLinJiaweiclass UARTPutc extends BlackBox with HasBlackBoxInline { 35*d18aeea6SLinJiawei val io = IO(new Bundle { 36*d18aeea6SLinJiawei val clk = Input(Clock()) 37*d18aeea6SLinJiawei val putc = Input(Bool()) 38*d18aeea6SLinJiawei val ch = Input(UInt(8.W)) 39*d18aeea6SLinJiawei }) 40*d18aeea6SLinJiawei 41*d18aeea6SLinJiawei setInline("UARTPutc.v", 42*d18aeea6SLinJiawei """ 43*d18aeea6SLinJiawei |module UARTPutc ( 44*d18aeea6SLinJiawei | input clk, 45*d18aeea6SLinJiawei | input putc, 46*d18aeea6SLinJiawei | input [7:0] ch 47*d18aeea6SLinJiawei |); 48*d18aeea6SLinJiawei | 49*d18aeea6SLinJiawei | always@(posedge clk) begin 50*d18aeea6SLinJiawei | if (putc) begin 51*d18aeea6SLinJiawei | $fwrite(32'h80000001, "%c", ch); 52*d18aeea6SLinJiawei | end 53*d18aeea6SLinJiawei | end 54*d18aeea6SLinJiawei | 55*d18aeea6SLinJiawei |endmodule 56*d18aeea6SLinJiawei """.stripMargin) 57*d18aeea6SLinJiawei} 58*d18aeea6SLinJiawei 59d7763dc0SZihao Yuclass AXI4UART extends AXI4SlaveModule(new AXI4Lite) { 60d7763dc0SZihao Yu val rxfifo = RegInit(0.U(32.W)) 61d7763dc0SZihao Yu val txfifo = Reg(UInt(32.W)) 62d7763dc0SZihao Yu val stat = RegInit(1.U(32.W)) 63d7763dc0SZihao Yu val ctrl = RegInit(0.U(32.W)) 64d7763dc0SZihao Yu 65b65ec060SZihao Yu val getcHelper = Module(new UARTGetc) 66b65ec060SZihao Yu getcHelper.io.clk := clock 67b65ec060SZihao Yu getcHelper.io.getc := (raddr(3,0) === 0.U && ren) 68b65ec060SZihao Yu 69*d18aeea6SLinJiawei val putcHelper = Module(new UARTPutc) 70*d18aeea6SLinJiawei putcHelper.io.clk := clock 71*d18aeea6SLinJiawei putcHelper.io.putc := waddr(3, 0)===4.U && in.w.fire() 72*d18aeea6SLinJiawei putcHelper.io.ch := in.w.bits.data(7, 0) 73*d18aeea6SLinJiawei 74*d18aeea6SLinJiawei// def putc(c: UInt): UInt = { printf("%c", c(7,0)); c } 758171fe6aSZihao Yu def getc = getcHelper.io.ch 76d7763dc0SZihao Yu 77d7763dc0SZihao Yu val mapping = Map( 788171fe6aSZihao Yu RegMap(0x0, getc, RegMap.Unwritable), 79*d18aeea6SLinJiawei RegMap(0x4, txfifo), 80d7763dc0SZihao Yu RegMap(0x8, stat), 81d7763dc0SZihao Yu RegMap(0xc, ctrl) 82d7763dc0SZihao Yu ) 83d7763dc0SZihao Yu 84d7763dc0SZihao Yu RegMap.generate(mapping, raddr(3,0), in.r.bits.data, 8599de3230SZihao Yu waddr(3,0), in.w.fire(), in.w.bits.data, MaskExpand(in.w.bits.strb >> waddr(2,0))) 86d7763dc0SZihao Yu} 87