xref: /XiangShan/src/main/scala/device/AXI4UART.scala (revision d18aeea69faedce0e5925dcce26c667312a50967)
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