xref: /XiangShan/src/main/scala/device/AXI4UART.scala (revision 2225d46ebbe2fd16b9b29963c27a7d0385a42709)
1package device
2
3import chisel3._
4import chisel3.util._
5import chipsalliance.rocketchip.config.Parameters
6import freechips.rocketchip.diplomacy.AddressSet
7import utils._
8
9class UARTIO extends Bundle {
10  val out = new Bundle {
11    val valid = Output(Bool())
12    val ch = Output(UInt(8.W))
13  }
14  val in = new Bundle {
15    val valid = Output(Bool())
16    val ch = Input(UInt(8.W))
17  }
18}
19
20class AXI4UART
21(
22  address: Seq[AddressSet]
23)(implicit p: Parameters)
24  extends AXI4SlaveModule(address, executable = false, _extra = new UARTIO)
25{
26  override lazy val module = new AXI4SlaveModuleImp[UARTIO](this){
27    val rxfifo = RegInit(0.U(32.W))
28    val txfifo = Reg(UInt(32.W))
29    val stat = RegInit(1.U(32.W))
30    val ctrl = RegInit(0.U(32.W))
31
32    io.extra.get.out.valid := (waddr(3,0) === 4.U && in.w.fire())
33    io.extra.get.out.ch := in.w.bits.data(7,0)
34    io.extra.get.in.valid := (raddr(3,0) === 0.U && in.r.fire())
35
36    val mapping = Map(
37      RegMap(0x0, io.extra.get.in.ch, RegMap.Unwritable),
38      RegMap(0x4, txfifo),
39      RegMap(0x8, stat),
40      RegMap(0xc, ctrl)
41    )
42
43    RegMap.generate(mapping, raddr(3,0), in.r.bits.data,
44      waddr(3,0), in.w.fire(), in.w.bits.data, MaskExpand(in.w.bits.strb >> waddr(2,0))
45    )
46  }
47}
48