soc/cores/uart: add rx_fifo_rx_we parameter to pulse rx_fifo.source.ready on rxtx...
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Thu, 16 Jan 2020 18:45:41 +0000 (19:45 +0100)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Thu, 16 Jan 2020 18:45:41 +0000 (19:45 +0100)
When UARTCrossover is used over Etherbone, acking data directly with the read avoid the write/read round-trip
and speed up communication a lot (>10x).

litex/soc/cores/uart.py

index f8654c3b63cec3ff2bf650a843a9f649658f3e44..99261f835bff8f02c8278b45223ac9a193405838 100644 (file)
@@ -191,7 +191,8 @@ class UART(Module, AutoCSR, UARTInterface):
     def __init__(self, phy=None,
                  tx_fifo_depth=16,
                  rx_fifo_depth=16,
-                 phy_cd="sys"):
+                 rx_fifo_rx_we=False,
+                 phy_cd="sys",):
         self._rxtx = CSR(8)
         self._txfull = CSRStatus()
         self._rxempty = CSRStatus()
@@ -233,7 +234,7 @@ class UART(Module, AutoCSR, UARTInterface):
             self.sink.connect(rx_fifo.sink),
             self._rxempty.status.eq(~rx_fifo.source.valid),
             self._rxtx.w.eq(rx_fifo.source.data),
-            rx_fifo.source.ready.eq(self.ev.rx.clear),
+            rx_fifo.source.ready.eq(self.ev.rx.clear | (rx_fifo_rx_we & self._rxtx.we)),
             # Generate RX IRQ when tx_fifo becomes non-empty
             self.ev.rx.trigger.eq(~rx_fifo.source.valid)
         ]
@@ -271,7 +272,7 @@ class UARTCrossover(UART):
     def __init__(self, **kwargs):
         assert kwargs.get("phy", None) == None
         UART.__init__(self, **kwargs)
-        self.submodules.xover = UART(tx_fifo_depth=2, rx_fifo_depth=2)
+        self.submodules.xover = UART(tx_fifo_depth=2, rx_fifo_depth=2, rx_fifo_rx_we=False)
         self.comb += [
             self.source.connect(self.xover.sink),
             self.xover.source.connect(self.sink)