Added buffers to data registers.
diff --git a/verilog/rtl/ExperiarCore/CSR/Traps/Traps.v b/verilog/rtl/ExperiarCore/CSR/Traps/Traps.v
index e9f2d57..db277eb 100644
--- a/verilog/rtl/ExperiarCore/CSR/Traps/Traps.v
+++ b/verilog/rtl/ExperiarCore/CSR/Traps/Traps.v
@@ -46,10 +46,16 @@
reg[31:0] mtvalValue;
reg[31:0] mipValue;
+ reg[15:0] userInterruptsBuffered;
+ always @(posedge clk) begin
+ if (rst) userInterruptsBuffered <= 16'b0;
+ else userInterruptsBuffered <= userInterrupts;
+ end
+
wire[11:0] systemInterrupts = { isMachineExternalInterrupt, 1'b0, 1'b0, 1'b0,
isMachineTimerInterrupt, 1'b0, 1'b0, 1'b0,
isMachineSoftwareInterrupt, 1'b0, 1'b0, 1'b0 };
- wire[31:0] pendingInterrupts = { userInterrupts, 4'b0000, systemInterrupts } & mieValue;
+ wire[31:0] pendingInterrupts = { userInterruptsBuffered, 4'b0000, systemInterrupts } & mieValue;
wire misalignedInstructionFetch = (isAddressMisaligned && (coreState == CORE_STATE_FETCH)) || isJumpMissaligned;
@@ -59,7 +65,7 @@
case (1'b1)
isMachineSoftwareInterrupt: trapCause <= 30'd3;
isMachineTimerInterrupt: trapCause <= 30'd7;
- |userInterrupts: trapCause <= 30'd8;
+ |userInterruptsBuffered: trapCause <= 30'd8;
isMachineExternalInterrupt: trapCause <= 30'd11;
default: trapCause <= 30'b0;
endcase
diff --git a/verilog/rtl/ExperiarCore/CoreManagement.v b/verilog/rtl/ExperiarCore/CoreManagement.v
index efcf3c0..2ec8664 100644
--- a/verilog/rtl/ExperiarCore/CoreManagement.v
+++ b/verilog/rtl/ExperiarCore/CoreManagement.v
@@ -88,6 +88,7 @@
// State register
// b00-b03: probe_errorCode
// b04: isRunning
+ reg[4:0] stateBuffered;
wire[31:0] stateOutputData;
wire stateOutputRequest;
wire stateBusBusy_nc;
@@ -109,10 +110,15 @@
.writeData(stateWriteData_nc),
.writeData_en(stateWriteDataEnable_nc),
.writeData_busy(1'b0),
- .readData({ management_run, core_env, core_errorCode }),
+ .readData(stateBuffered),
.readData_en(stateReadDataEnable_nc),
.readData_busy(1'b0));
+ always @(posedge clk) begin
+ if (rst) stateBuffered <= 3'b0;
+ else stateBuffered <= { management_run, core_env, core_errorCode };
+ end
+
// Core
assign management_run = control[0];
assign management_trapEnable = control[1];
diff --git a/verilog/rtl/Flash/QSPIDevice.v b/verilog/rtl/Flash/QSPIDevice.v
index 9de1143..f1e3d7f 100644
--- a/verilog/rtl/Flash/QSPIDevice.v
+++ b/verilog/rtl/Flash/QSPIDevice.v
@@ -120,7 +120,7 @@
// reg[CLOCK_WIDTH-1:0] clockCounter = {CLOCK_WIDTH{1'b0}};
// wire nextClockCounter = clockCounter + 1;
- // wire[CLOCK_WIDTH-1:0] clockScaleHalfMask = {CLOCK_BITS{1'b1}} << clockScale;
+ // wire[CLOCK_WIDTH-1:0] clockScaleHalfMask = {(CLOCK_WIDTH-1){1'b0}, 1'b1} << clockScale;
// wire[CLOCK_WIDTH-1:0] clockScaleMask = { clockScaleMask[CLOCK_WIDTH-2:0], 1'b0 };
// wire spiHalfClock = clockCounter == (clockScaleHalfMask - 1);//|(clockCounter & clockScaleHalfMask);
// wire spiClock = clockCounter == (clockScaleMask - 1);
diff --git a/verilog/rtl/Peripherals/GPIO/GPIODevice.v b/verilog/rtl/Peripherals/GPIO/GPIODevice.v
index 948445e..4567403 100644
--- a/verilog/rtl/Peripherals/GPIO/GPIODevice.v
+++ b/verilog/rtl/Peripherals/GPIO/GPIODevice.v
@@ -23,6 +23,12 @@
output reg gpio_irq
);
+ reg[IO_COUNT-1:0] inputBuffered;
+ always @(posedge clk) begin
+ if (rst) inputBuffered <= {IO_COUNT{1'b0}};
+ else inputBuffered <= gpio_input;
+ end
+
// Device select
wire[11:0] localAddress;
wire deviceEnable;
@@ -87,7 +93,7 @@
.writeData(inputRegisterWriteData_nc),
.writeData_en(inputRegisterWriteDataEnable_nc),
.writeData_busy(1'b0),
- .readData(gpio_input),
+ .readData(inputBuffered),
.readData_en(inputRegisterReadDataEnable_nc),
.readData_busy(1'b0));
@@ -117,7 +123,7 @@
assign peripheralBus_busy = 1'b0;
- wire[IO_COUNT-1:0] pinIRQ = irqEnable & gpio_oe & gpio_input;
+ wire[IO_COUNT-1:0] pinIRQ = irqEnable & gpio_oe & inputBuffered;
always @(posedge clk) begin
if (rst) gpio_irq <= 1'b0;
diff --git a/verilog/rtl/Peripherals/PWM/PWMDevice.v b/verilog/rtl/Peripherals/PWM/PWMDevice.v
index d20a219..1facc9e 100644
--- a/verilog/rtl/Peripherals/PWM/PWMDevice.v
+++ b/verilog/rtl/Peripherals/PWM/PWMDevice.v
@@ -123,6 +123,7 @@
// Current data register (for .WIDTH(16), .OUTPUTS(4))
// b00-b15: counterValue
// b16-b19: output
+ reg[WIDTH+OUTPUTS-1:0] dataRegisterBuffered;
wire[OUTPUTS-1:0] outputs;
wire[31:0] dataRegisterOutputData;
wire dataRegisterOutputRequest;
@@ -145,11 +146,16 @@
.writeData(dataRegisterWriteData_nc),
.writeData_en(dataRegisterWriteDataEnable_nc),
.writeData_busy(1'b0),
- .readData({ outputs, counterValue }),
+ .readData(dataRegisterBuffered),
.readData_en(dataRegisterReadDataEnable_nc),
.readData_busy(1'b0));
always @(posedge clk) begin
+ if (rst) dataRegisterBuffered <= {(WIDTH + OUTPUTS){1'b0}};
+ else dataRegisterBuffered <= { outputs, counterValue };
+ end
+
+ always @(posedge clk) begin
if (rst) begin
baseCounter <= 'b0;
topCompare <= DEFAULT_TOP_COMPARE_VALUE;
diff --git a/verilog/rtl/Peripherals/UART/UARTDevice.v b/verilog/rtl/Peripherals/UART/UARTDevice.v
index 07cf361..3503765 100644
--- a/verilog/rtl/Peripherals/UART/UARTDevice.v
+++ b/verilog/rtl/Peripherals/UART/UARTDevice.v
@@ -131,6 +131,7 @@
// b03: txDataAvailable
// b04: txBufferFull
// b05: txDataLost
+ reg[5:0] statusRegisterBuffered;
wire[31:0] statusRegisterOutputData;
wire statusRegisterOutputRequest;
wire statusRegisterBusBusy_nc;
@@ -152,17 +153,26 @@
.writeData(statusRegisterWriteData_nc),
.writeData_en(statusRegisterWriteDataEnable_nc),
.writeData_busy(1'b0),
- .readData({
- txDataLostBuffered,
- txBufferFullBuffered,
- txDataAvailableBuffered,
- rxDataLostBuffered,
- rxBufferFullBuffered,
- rxDataAvailableBuffered }),
+ .readData(statusRegisterBuffered),
.readData_en(statusRegisterReadDataEnable_nc),
.readData_busy(1'b0));
+ always @(posedge clk) begin
+ if (rst) statusRegisterBuffered <= 6'b0;
+ else begin
+ statusRegisterBuffered <= {
+ txDataLostBuffered,
+ txBufferFullBuffered,
+ txDataAvailableBuffered,
+ rxDataLostBuffered,
+ rxBufferFullBuffered,
+ rxDataAvailableBuffered
+ };
+ end
+ end
+
// Rx register
+ reg[8:0] rxRegisterBuffered;
wire[31:0] rxRegisterOutputData;
wire rxRegisterOutputRequest;
wire[7:0] rxReadData;
@@ -185,10 +195,15 @@
.writeData(rxRegisterWriteData_nc),
.writeData_en(rxRegisterWriteDataEnable_nc),
.writeData_busy(1'b0),
- .readData(rxDataAvailable ? { 1'b1, rxReadData } : 9'h0),
+ .readData(rxRegisterBuffered),
.readData_en(rxReadDataEnable),
.readData_busy(1'b0));
+ always @(posedge clk) begin
+ if (rst) rxRegisterBuffered <= 9'b0;
+ else rxRegisterBuffered <= rxDataAvailable ? { 1'b1, rxReadData } : 9'h0;
+ end
+
// Tx register
wire[31:0] txRegisterOutputData;
wire txRegisterOutputRequest;
diff --git a/verilog/rtl/Video/VGA_top.v b/verilog/rtl/Video/VGA_top.v
index 0dd3a62..9190e8b 100644
--- a/verilog/rtl/Video/VGA_top.v
+++ b/verilog/rtl/Video/VGA_top.v
@@ -222,6 +222,7 @@
.currentValue(verticalWholeLineCompare));
// VGA state register
+ reg[4:0] stateRegisterBuffered;
reg inVerticalVisibleArea = 1'b1;
reg inHorizontalVisibleArea = 1'b1;
wire[31:0] stateRegisterOutputData;
@@ -245,10 +246,15 @@
.writeData(stateRegisterWriteData_nc),
.writeData_en(stateRegisterWriteDataEnable_nc),
.writeData_busy(1'b0),
- .readData({ inVerticalVisibleArea, inHorizontalVisibleArea, !vga_vsync, !vga_hsync, enableOutput }),
+ .readData(stateRegisterBuffered),
.readData_en(stateReadDataEnable_nc),
.readData_busy(1'b0));
+ always @(posedge clk) begin
+ if (rst) stateRegisterBuffered <= 5'b0;
+ else stateRegisterBuffered <= { inVerticalVisibleArea, inHorizontalVisibleArea, !vga_vsync, !vga_hsync, enableOutput };
+ end
+
assign peripheralBus_busy = 1'b0;
assign requestOutput = configurationRegisterOutputRequest
|| horizontalVisibleAreaCompareRegisterOutputRequest