1package device 2 3import chisel3._ 4import chisel3.util._ 5 6import bus.axi4._ 7import utils._ 8 9class UARTGetc extends BlackBox with HasBlackBoxInline { 10 val io = IO(new Bundle { 11 val clk = Input(Clock()) 12 val getc = Input(Bool()) 13 val ch = Output(UInt(8.W)) 14 }) 15 16 setInline("UARTGetc.v", 17 s""" 18 |import "DPI-C" function void uart_getc(output byte ch); 19 | 20 |module UARTGetc ( 21 | input clk, 22 | input getc, 23 | output reg [7:0] ch 24 |); 25 | 26 | always@(posedge clk) begin 27 | if (getc) uart_getc(ch); 28 | end 29 | 30 |endmodule 31 """.stripMargin) 32} 33 34class UARTPutc extends BlackBox with HasBlackBoxInline { 35 val io = IO(new Bundle { 36 val clk = Input(Clock()) 37 val putc = Input(Bool()) 38 val ch = Input(UInt(8.W)) 39 }) 40 41 setInline("UARTPutc.v", 42 """ 43 |module UARTPutc ( 44 | input clk, 45 | input putc, 46 | input [7:0] ch 47 |); 48 | 49 | always@(posedge clk) begin 50 | if (putc) begin 51 | $fwrite(32'h80000001, "%c", ch); 52 | end 53 | end 54 | 55 |endmodule 56 """.stripMargin) 57} 58 59class AXI4UART extends AXI4SlaveModule(new AXI4Lite) { 60 val rxfifo = RegInit(0.U(32.W)) 61 val txfifo = Reg(UInt(32.W)) 62 val stat = RegInit(1.U(32.W)) 63 val ctrl = RegInit(0.U(32.W)) 64 65 val getcHelper = Module(new UARTGetc) 66 getcHelper.io.clk := clock 67 getcHelper.io.getc := (raddr(3,0) === 0.U && ren) 68 69 val putcHelper = Module(new UARTPutc) 70 putcHelper.io.clk := clock 71 putcHelper.io.putc := waddr(3, 0)===4.U && in.w.fire() 72 putcHelper.io.ch := in.w.bits.data(7, 0) 73 74// def putc(c: UInt): UInt = { printf("%c", c(7,0)); c } 75 def getc = getcHelper.io.ch 76 77 val mapping = Map( 78 RegMap(0x0, getc, RegMap.Unwritable), 79 RegMap(0x4, txfifo), 80 RegMap(0x8, stat), 81 RegMap(0xc, ctrl) 82 ) 83 84 RegMap.generate(mapping, raddr(3,0), in.r.bits.data, 85 waddr(3,0), in.w.fire(), in.w.bits.data, MaskExpand(in.w.bits.strb >> waddr(2,0))) 86} 87