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