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