Added buffer to UART signals to interrupt and status register. This should help with some timing issues. Also fixed a bug where the wrong signal was being used for the Rx data available interrupt.
diff --git a/verilog/rtl/Peripherals/UART/UARTDevice.v b/verilog/rtl/Peripherals/UART/UARTDevice.v
index 62a9d5a..07cf361 100644
--- a/verilog/rtl/Peripherals/UART/UARTDevice.v
+++ b/verilog/rtl/Peripherals/UART/UARTDevice.v
@@ -25,6 +25,39 @@
 	localparam RX_BUFFER_SIZE = 32;
 	localparam TX_BUFFER_SIZE = 32;
 
+	// Buffer values used for interrupts and status register
+	wire txDataLost;
+	wire txBufferFull;
+	wire txDataAvailable;
+	wire rxDataLost;
+	wire rxBufferFull;
+	wire rxDataAvailable;
+
+	reg txDataLostBuffered;
+	reg txBufferFullBuffered;
+	reg txDataAvailableBuffered;
+	reg rxDataLostBuffered;
+	reg rxBufferFullBuffered;
+	reg rxDataAvailableBuffered;
+
+	always @(posedge clk) begin
+		if (rst) begin
+			txDataLostBuffered <= 1'b0;
+			txBufferFullBuffered <= 1'b0;
+			txDataAvailableBuffered <= 1'b0;
+			rxDataLostBuffered <= 1'b0;
+			rxBufferFullBuffered <= 1'b0;
+			rxDataAvailableBuffered <= 1'b0;
+		end else begin
+			txDataLostBuffered <= txDataLost;
+			txBufferFullBuffered <= txBufferFull;
+			txDataAvailableBuffered <= txDataAvailable;
+			rxDataLostBuffered <= rxDataLost;
+			rxBufferFullBuffered <= rxBufferFull;
+			rxDataAvailableBuffered <= rxDataAvailable;
+		end
+	end
+
 	// Device select
 	wire[11:0] localAddress;
 	wire deviceEnable;
@@ -98,12 +131,6 @@
 	// b03: txDataAvailable
 	// b04: txBufferFull
 	// b05: txDataLost
-	wire txDataLost;
-	wire txBufferFull;
-	wire txDataAvailable;
-	wire rxDataLost;
-	wire rxBufferFull;
-	wire rxDataAvailable;
 	wire[31:0] statusRegisterOutputData;
 	wire statusRegisterOutputRequest;
 	wire statusRegisterBusBusy_nc;
@@ -125,7 +152,13 @@
 		.writeData(statusRegisterWriteData_nc),
 		.writeData_en(statusRegisterWriteDataEnable_nc),
 		.writeData_busy(1'b0),
-		.readData({ txDataLost, txBufferFull, txDataAvailable, rxDataLost, rxBufferFull, rxDataAvailable }),
+		.readData({ 
+			txDataLostBuffered, 
+			txBufferFullBuffered, 
+			txDataAvailableBuffered, 
+			rxDataLostBuffered, 
+			rxBufferFullBuffered, 
+			rxDataAvailableBuffered }),
 		.readData_en(statusRegisterReadDataEnable_nc),
 		.readData_busy(1'b0));
 
@@ -237,11 +270,11 @@
 	reg sendingData = 1'b0;
 	always @(posedge clk) begin
 		if (rst) sendingData <= 1'b0;
-		else sendingData <= txDataAvailable;
+		else sendingData <= txDataAvailableBuffered;
 	end
 
-	assign uart_irq = (dataLostInterruptEnable && (rxDataLost || txDataLost))
-				   || (rxDataAvaliableInterruptEnable && rxOutAvailable)
-				   || (txDataSentInterruptEnable && sendingData && !txDataAvailable);
+	assign uart_irq = (dataLostInterruptEnable && (rxDataLostBuffered || txDataLostBuffered))
+				   || (rxDataAvaliableInterruptEnable && rxDataAvailableBuffered)
+				   || (txDataSentInterruptEnable && sendingData && !txDataAvailableBuffered);
 
 endmodule
\ No newline at end of file