Fixed wishbone slaves not providing read data on the correct clock cycle.
diff --git a/verilog/rtl/CaravelHost/WBAddressExtension.v b/verilog/rtl/CaravelHost/WBAddressExtension.v
index e31c60a..c5c10e3 100644
--- a/verilog/rtl/CaravelHost/WBAddressExtension.v
+++ b/verilog/rtl/CaravelHost/WBAddressExtension.v
@@ -47,15 +47,18 @@
reg[31:0] currentDataIn;
reg acknowledge = 1'b0;
+ reg[31:0] dataRead_buffered;
always @(posedge wb_clk_i) begin
if (wb_rst_i) begin
state <= STATE_IDLE;
acknowledge <= 1'b0;
+ dataRead_buffered <= 32'b0;
end else begin
case (state)
STATE_IDLE: begin
acknowledge <= 1'b0;
+ dataRead_buffered <= 32'b0;
if (wbs_cyc_i && !userSpaceSelect) begin
if (wbs_stb_i) begin
@@ -80,6 +83,7 @@
STATE_READ_SINGLE: begin
state <= STATE_FINISH;
acknowledge <= 1'b1;
+ dataRead_buffered <= currentAddress;
end
STATE_FINISH: begin
@@ -97,6 +101,6 @@
// Connect wishbone return signals
assign wbs_ack_o = userSpaceSelect ? userSpace_wb_ack_o : acknowledge;
- assign wbs_data_o = userSpaceSelect ? userSpace_wb_data_o : currentAddress;
+ assign wbs_data_o = userSpaceSelect ? userSpace_wb_data_o : dataRead_buffered;
endmodule
\ No newline at end of file
diff --git a/verilog/rtl/ExperiarCore/Wishbone/WB_SRAMInterface.v b/verilog/rtl/ExperiarCore/Wishbone/WB_SRAMInterface.v
index 9be0969..f4f6fe1 100644
--- a/verilog/rtl/ExperiarCore/Wishbone/WB_SRAMInterface.v
+++ b/verilog/rtl/ExperiarCore/Wishbone/WB_SRAMInterface.v
@@ -48,21 +48,25 @@
wire isStateWriteSingle = state == STATE_WRITE_SINGLE;
wire isStateIdle = state == STATE_IDLE;
+ wire[31:0] peripheralBus_dataRead;
wire peripheralBus_busy;
reg stall = 1'b0;
reg acknowledge = 1'b0;
+ reg[31:0] dataRead_buffered;
always @(posedge wb_clk_i) begin
if (wb_rst_i) begin
state <= STATE_IDLE;
stall <= 1'b0;
acknowledge <= 1'b0;
+ dataRead_buffered <= 32'b0;
end else begin
case (state)
STATE_IDLE: begin
stall <= 1'b0;
acknowledge <= 1'b0;
+ dataRead_buffered <= 32'b0;
if (wb_cyc_i) begin
if (wb_stb_i) begin
@@ -91,6 +95,7 @@
if (!peripheralBus_busy) begin
state <= STATE_FINISH;
acknowledge <= 1'b1;
+ dataRead_buffered <= peripheralBus_dataRead;
end
end
@@ -118,9 +123,8 @@
wire peripheralBus_oe = isStateReadSingle;
wire[19:0] peripheralBus_address = !isStateIdle ? currentAddress : 24'b0;
wire[3:0] peripheralBus_byteSelect = !isStateIdle ? currentByteSelect : 4'b0;
- wire[31:0] peripheralBus_dataWrite = isStateWriteSingle ? wb_data_i : 32'b0;
- wire[31:0] peripheralBus_dataRead;
- assign wb_data_o = isStateReadSingle ? peripheralBus_dataRead : 32'b0;
+ wire[31:0] peripheralBus_dataWrite = isStateWriteSingle ? wb_data_i : 32'b0;
+ assign wb_data_o = dataRead_buffered;
// Connect local memory and management interface signals
wire localMemoryEnable = wb_adr_i[23] == 1'b0;
diff --git a/verilog/rtl/Flash/WBFlashInterface.v b/verilog/rtl/Flash/WBFlashInterface.v
index 30c4645..a09ec56 100644
--- a/verilog/rtl/Flash/WBFlashInterface.v
+++ b/verilog/rtl/Flash/WBFlashInterface.v
@@ -33,17 +33,20 @@
reg stall = 1'b0;
reg acknowledge = 1'b0;
+ reg[31:0] dataRead_buffered;
always @(posedge wb_clk_i) begin
if (wb_rst_i) begin
state <= STATE_IDLE;
stall <= 1'b0;
acknowledge <= 1'b0;
+ dataRead_buffered <= 32'b0;
end else begin
case (state)
STATE_IDLE: begin
stall <= 1'b0;
acknowledge <= 1'b0;
+ dataRead_buffered <= 32'b0;
if (wb_cyc_i) begin
if (wb_stb_i) begin
@@ -71,6 +74,7 @@
if (!flashCache_busy) begin
state <= STATE_FINISH;
acknowledge <= 1'b1;
+ dataRead_buffered <= flashCache_dataRead;
end
end
@@ -99,6 +103,6 @@
assign flashCache_address = state != STATE_IDLE ? currentAddress : 24'b0;
assign flashCache_byteSelect = state != STATE_IDLE ? currentByteSelect : 4'b0;
- assign wb_data_o = state == STATE_READ_SINGLE ? flashCache_dataRead : 32'b0;
+ assign wb_data_o = dataRead_buffered;
endmodule
\ No newline at end of file
diff --git a/verilog/rtl/Peripherals/WBPeripheralBusInterface/WBPeripheralBusInterface_top.v b/verilog/rtl/Peripherals/WBPeripheralBusInterface/WBPeripheralBusInterface_top.v
index d0a337d..f8fcd0b 100644
--- a/verilog/rtl/Peripherals/WBPeripheralBusInterface/WBPeripheralBusInterface_top.v
+++ b/verilog/rtl/Peripherals/WBPeripheralBusInterface/WBPeripheralBusInterface_top.v
@@ -40,17 +40,20 @@
reg stall = 1'b0;
reg acknowledge = 1'b0;
+ reg[31:0] dataRead_buffered;
always @(posedge wb_clk_i) begin
if (wb_rst_i) begin
state <= STATE_IDLE;
stall <= 1'b0;
acknowledge <= 1'b0;
+ dataRead_buffered <= 32'b0;
end else begin
case (state)
STATE_IDLE: begin
stall <= 1'b0;
acknowledge <= 1'b0;
+ dataRead_buffered <= 32'b0;
if (wb_cyc_i) begin
if (wb_stb_i) begin
@@ -79,6 +82,7 @@
if (!peripheralBus_busy) begin
state <= STATE_FINISH;
acknowledge <= 1'b1;
+ dataRead_buffered <= peripheralBus_dataRead;
end
end
@@ -108,7 +112,7 @@
assign peripheralBus_address = state != STATE_IDLE ? currentAddress : 24'b0;
assign peripheralBus_byteSelect = state != STATE_IDLE ? currentByteSelect : 4'b0;
- assign wb_data_o = state == STATE_READ_SINGLE ? peripheralBus_dataRead : 32'b0;
+ assign wb_data_o = dataRead_buffered;
assign peripheralBus_dataWrite = state == STATE_WRITE_SINGLE ? wb_data_i : 32'b0;
endmodule
\ No newline at end of file