MERGE: SRAM to UART
diff --git a/Makefile b/Makefile
index 9bb954a..381430b 100644
--- a/Makefile
+++ b/Makefile
@@ -17,7 +17,7 @@
CARAVEL_ROOT?=$(PWD)/caravel
PRECHECK_ROOT?=${HOME}/mpw_precheck
-MCW_ROOT?=$(PWD)/mgmt_core_wrapper
+MCW_ROOT?=$(UPRJ_ROOT)/mgmt_core_wrapper
SIM?=RTL
export SKYWATER_COMMIT=c094b6e83a4f9298e47f696ec5a7fd53535ec5eb
@@ -79,7 +79,11 @@
docker_run_verify=\
docker run -v ${TARGET_PATH}:${TARGET_PATH} -v ${PDK_ROOT}:${PDK_ROOT} \
-v ${CARAVEL_ROOT}:${CARAVEL_ROOT} \
+<<<<<<< HEAD
-v ${MCW_ROOT}:${MCW_ROOT} \
+=======
+ -v $(MCW_ROOT):$(MCW_ROOT) \
+>>>>>>> sram
-e TARGET_PATH=${TARGET_PATH} -e PDK_ROOT=${PDK_ROOT} \
-e CARAVEL_ROOT=${CARAVEL_ROOT} \
-e TOOLS=/opt/riscv32i \
@@ -176,7 +180,7 @@
.PHONY: clean
clean:
cd ./verilog/dv/ && \
- $(MAKE) -j$(THREADS) clean
+ $(MAKE) clean
check-caravel:
@if [ ! -d "$(CARAVEL_ROOT)" ]; then \
diff --git a/openlane/user_proj_example/config.tcl b/openlane/user_proj_example/config.tcl
index c9266ee..94eecca 100755
--- a/openlane/user_proj_example/config.tcl
+++ b/openlane/user_proj_example/config.tcl
@@ -22,7 +22,12 @@
set ::env(VERILOG_FILES) "\
$::env(CARAVEL_ROOT)/verilog/rtl/defines.v \
- $script_dir/../../verilog/rtl/user_proj_example.v"
+ $script_dir/../../verilog/rtl/user_proj_example.v \
+ $script_dir/../../verilog/rtl/wb_interconnect/wb_interconnect.sv \
+ $script_dir/../../verilog/rtl/wb_interconnect/wb_signal_reg.sv \
+ $script_dir/../../verilog/rtl/sram/sky130_sram_2kbyte_1rw1r_32x512_8.v \
+ $script_dir/../../verilog/rtl/sram/sram_wb_wrapper.sv \
+ "
set ::env(DESIGN_IS_CORE) 0
diff --git a/verilog/includes/includes.rtl.caravel_user_project b/verilog/includes/includes.rtl.caravel_user_project
index f714ae3..acc27a6 100644
--- a/verilog/includes/includes.rtl.caravel_user_project
+++ b/verilog/includes/includes.rtl.caravel_user_project
@@ -1,8 +1,9 @@
# Caravel user project includes
-v $(USER_PROJECT_VERILOG)/rtl/user_project_wrapper.v
-v $(USER_PROJECT_VERILOG)/rtl/user_proj_example.v
+-v $(USER_PROJECT_VERILOG)/rtl/sram/sram_wb_wrapper.sv
-v $(USER_PROJECT_VERILOG)/rtl/wb_interconnect/wb_interconnect.sv
--v $(USER_PROJECT_VERILOG)/rtl/wb_interconnect/wb_stagging.sv
+-v $(USER_PROJECT_VERILOG)/rtl/wb_interconnect/wb_signal_reg.sv
-v $(USER_PROJECT_VERILOG)/rtl/wbuart32/rxuart.v
-v $(USER_PROJECT_VERILOG)/rtl/wbuart32/txuart.v
-v $(USER_PROJECT_VERILOG)/rtl/wbuart32/rxuartlite.v
diff --git a/verilog/rtl/sram/sky130_sram_2kbyte_1rw1r_32x512_8.v b/verilog/rtl/sram/sky130_sram_2kbyte_1rw1r_32x512_8.v
index 289a770..7da4327 100644
--- a/verilog/rtl/sram/sky130_sram_2kbyte_1rw1r_32x512_8.v
+++ b/verilog/rtl/sram/sky130_sram_2kbyte_1rw1r_32x512_8.v
@@ -20,7 +20,7 @@
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
// FIXME: This delay is arbitrary.
parameter DELAY = 3 ;
- parameter VERBOSE = 0 ; //Set to 0 to only display warnings
+ parameter VERBOSE = 1 ; //Set to 0 to only display warnings
parameter T_HOLD = 1 ; //Delay to hold dout value after posedge. Value is arbitrary
`ifdef USE_POWER_PINS
diff --git a/verilog/rtl/sram/sram_wb_wrapper.sv b/verilog/rtl/sram/sram_wb_wrapper.sv
index 58ec2d3..e003b4a 100644
--- a/verilog/rtl/sram/sram_wb_wrapper.sv
+++ b/verilog/rtl/sram/sram_wb_wrapper.sv
@@ -34,23 +34,23 @@
input logic wb_we_i, // write
input logic [SRAM_DATA_WD-1:0] wb_dat_i, // data output
input logic [SRAM_DATA_WD/8-1:0] wb_sel_i, // byte enable
- output logic [SRAM_DATA_WD-1:0] wb_dat_o, // data input
+ output wire [SRAM_DATA_WD-1:0] wb_dat_o, // data input
output logic wb_ack_o // acknowlegement
);
// Port A
-logic sram_clk_a;
-logic sram_csb_a;
-logic [SRAM_ADDR_WD-1:0] sram_addr_a;
-logic [SRAM_DATA_WD-1:0] sram_dout_a;
+wire sram_clk_a;
+wire sram_csb_a;
+wire [SRAM_ADDR_WD-1:0] sram_addr_a;
+wire [SRAM_DATA_WD-1:0] sram_dout_a;
// Port B
-logic sram_clk_b;
-logic sram_csb_b;
-logic sram_web_b;
-logic [SRAM_DATA_WD/8-1:0] sram_mask_b;
-logic [SRAM_ADDR_WD-1:0] sram_addr_b;
-logic [SRAM_DATA_WD-1:0] sram_din_b;
+wire sram_clk_b;
+wire sram_csb_b;
+wire sram_web_b;
+wire [SRAM_DATA_WD/8-1:0] sram_mask_b;
+wire [SRAM_ADDR_WD-1:0] sram_addr_b;
+wire [SRAM_DATA_WD-1:0] sram_din_b;
// Memory Write Port
assign sram_clk_b = wb_clk_i;
@@ -62,7 +62,7 @@
// Memory Read Port
assign sram_clk_a = wb_clk_i;
-assign sram_csb_a = (wb_stb_i == 1'b1 && wb_we_i == 1'b0 && wb_ack_o == 0) ? 1'b0 : 1'b1;
+assign sram_csb_a = (wb_stb_i == 1'b1 && wb_we_i == 1'b0 && wb_cyc_i == 1'b1) ? 1'b0 : 1'b1;
assign sram_addr_a = wb_adr_i;
assign wb_dat_o = sram_dout_a;
@@ -88,13 +88,14 @@
);
// Generate once cycle delayed ACK to get the data from SRAM
-always_ff @(posedge wb_clk_i) begin
+always @(negedge rst_n or posedge wb_clk_i)
+begin
if ( rst_n == 1'b0 )
begin
wb_ack_o <= 'h0;
end else
begin
- wb_ack_o <= (wb_stb_i == 1'b1) & (wb_ack_o == 0);
+ wb_ack_o <= (wb_stb_i == 1'b1) & (wb_cyc_i == 1'b1) & (wb_ack_o == 0);
end
end
diff --git a/verilog/rtl/user_proj_example.v b/verilog/rtl/user_proj_example.v
index 3ae9bc1..e9be131 100644
--- a/verilog/rtl/user_proj_example.v
+++ b/verilog/rtl/user_proj_example.v
@@ -83,8 +83,7 @@
//---------------------------------------------------------------------
// WB Master Interface
//---------------------------------------------------------------------
-wire clk;
-wire rst;
+wire rst_n = !wb_rst_i;
wire [`MPRJ_IO_PADS-1:0] io_in;
wire [`MPRJ_IO_PADS-1:0] io_out;
wire [`MPRJ_IO_PADS-1:0] io_oeb;
@@ -122,7 +121,7 @@
.vssd1(vssd1), // User area 1 digital ground
`endif
.clk_i(wb_clk_i),
- .rst_n(wb_rst_i),
+ .rst_n(rst_n),
// Master 0 Interface
.m0_wb_dat_i(wbs_dat_i),
@@ -133,47 +132,46 @@
.m0_wb_stb_i(wbs_stb_i),
.m0_wb_dat_o(wbs_dat_o),
.m0_wb_ack_o(wbs_ack_o),
- .m0_wb_err_o(),
// Slave 0 Interface
- .s0_wb_dat_i(s0_wb_dat_i),
+ .s0_wb_dat_i(s0_wb_dat_o),
.s0_wb_ack_i(s0_wb_ack_o),
.s0_wb_dat_o(s0_wb_dat_i),
.s0_wb_adr_o(s0_wb_adr_i),
.s0_wb_sel_o(s0_wb_sel_i),
.s0_wb_we_o (s0_wb_we_i),
.s0_wb_cyc_o(s0_wb_cyc_i),
- .s0_wb_stb_o(s0_wb_stb_i),
+ .s0_wb_stb_o(s0_wb_stb_i)
// Slave 1 Interface
- .s1_wb_dat_i(),
- .s1_wb_ack_i(),
- .s1_wb_dat_o(),
- .s1_wb_adr_o(),
- .s1_wb_sel_o(),
- .s1_wb_we_o (),
- .s1_wb_cyc_o(),
- .s1_wb_stb_o(),
+ .s1_wb_dat_i(s1_wb_dat_o),
+ .s1_wb_ack_i(s1_wb_ack_o),
+ .s1_wb_dat_o(s1_wb_dat_i),
+ .s1_wb_adr_o(s1_wb_adr_i),
+ .s1_wb_sel_o(s1_wb_sel_i),
+ .s1_wb_we_o (s1_wb_we_i)),
+ .s1_wb_cyc_o(s1_wb_cyc_i),
+ .s1_wb_stb_o(s1_wb_stb_i),
// Slave 2 Interface
- .s2_wb_dat_i(),
- .s2_wb_ack_i(),
- .s2_wb_dat_o(),
- .s2_wb_adr_o(),
- .s2_wb_sel_o(),
- .s2_wb_we_o (),
- .s2_wb_cyc_o(),
- .s2_wb_stb_o(),
+ // .s2_wb_dat_i(),
+ // .s2_wb_ack_i(),
+ // .s2_wb_dat_o(),
+ // .s2_wb_adr_o(),
+ // .s2_wb_sel_o(),
+ // .s2_wb_we_o (),
+ // .s2_wb_cyc_o(),
+ // .s2_wb_stb_o(),
// Slave 3 Interface
- .s3_wb_dat_i(),
- .s3_wb_ack_i(),
- .s3_wb_dat_o(),
- .s3_wb_adr_o(),
- .s3_wb_sel_o(),
- .s3_wb_we_o (),
- .s3_wb_cyc_o(),
- .s3_wb_stb_o()
+ // .s3_wb_dat_i(),
+ // .s3_wb_ack_i(),
+ // .s3_wb_dat_o(),
+ // .s3_wb_adr_o(),
+ // .s3_wb_sel_o(),
+ // .s3_wb_we_o (),
+ // .s3_wb_cyc_o(),
+ // .s3_wb_stb_o()
);
sram_wb_wrapper #(
@@ -185,7 +183,7 @@
`endif
)
wb_wrapper0 (
- .rst_n(wb_rst_i),
+ .rst_n(rst_n),
// Wishbone Interface
.wb_clk_i(wb_clk_i), // System clock
.wb_cyc_i(s0_wb_cyc_i), // cycle enable
diff --git a/verilog/rtl/wb_interconnect/wb_interconnect.sv b/verilog/rtl/wb_interconnect/wb_interconnect.sv
index e76b65a..6397bc6 100644
--- a/verilog/rtl/wb_interconnect/wb_interconnect.sv
+++ b/verilog/rtl/wb_interconnect/wb_interconnect.sv
@@ -39,89 +39,74 @@
input logic m0_wb_we_i,
input logic m0_wb_cyc_i,
input logic m0_wb_stb_i,
- output logic [31:0] m0_wb_dat_o,
- output logic m0_wb_ack_o,
- output logic m0_wb_err_o,
+ output wire [31:0] m0_wb_dat_o,
+ output wire m0_wb_ack_o,
// Slave 0 Interface
input logic [31:0] s0_wb_dat_i,
input logic s0_wb_ack_i,
- output logic [31:0] s0_wb_dat_o,
- output logic [7:0] s0_wb_adr_o,
- output logic [3:0] s0_wb_sel_o,
- output logic s0_wb_we_o,
- output logic s0_wb_cyc_o,
- output logic s0_wb_stb_o,
+ output wire [31:0] s0_wb_dat_o,
+ output wire [8:0] s0_wb_adr_o,
+ output wire [3:0] s0_wb_sel_o,
+ output wire s0_wb_we_o,
+ output wire s0_wb_cyc_o,
+ output wire s0_wb_stb_o
// Slave 1 Interface
input logic [31:0] s1_wb_dat_i,
input logic s1_wb_ack_i,
- output logic [31:0] s1_wb_dat_o,
- output logic [10:0] s1_wb_adr_o,
- output logic [3:0] s1_wb_sel_o,
- output logic s1_wb_we_o,
- output logic s1_wb_cyc_o,
- output logic s1_wb_stb_o,
+ output wire [31:0] s1_wb_dat_o,
+ output wire [8:0] s1_wb_adr_o,
+ output wire [3:0] s1_wb_sel_o,
+ output wire s1_wb_we_o,
+ output wire s1_wb_cyc_o,
+ output wire s1_wb_stb_o,
// Slave 2 Interface
- input logic [31:0] s2_wb_dat_i,
- input logic s2_wb_ack_i,
- output logic [31:0] s2_wb_dat_o,
- output logic [10:0] s2_wb_adr_o,
- output logic [3:0] s2_wb_sel_o,
- output logic s2_wb_we_o,
- output logic s2_wb_cyc_o,
- output logic s2_wb_stb_o,
+ // input logic [31:0] s2_wb_dat_i,
+ // input logic s2_wb_ack_i,
+ // output wire [31:0] s2_wb_dat_o,
+ // output wire [8:0] s2_wb_adr_o,
+ // output wire [3:0] s2_wb_sel_o,
+ // output wire s2_wb_we_o,
+ // output wire s2_wb_cyc_o,
+ // output wire s2_wb_stb_o,
// Slave 3 Interface
- input logic [31:0] s3_wb_dat_i,
- input logic s3_wb_ack_i,
- output logic [31:0] s3_wb_dat_o,
- output logic [10:0] s3_wb_adr_o,
- output logic [3:0] s3_wb_sel_o,
- output logic s3_wb_we_o,
- output logic s3_wb_cyc_o,
- output logic s3_wb_stb_o
+ // input logic [31:0] s3_wb_dat_i,
+ // input logic s3_wb_ack_i,
+ // output wire [31:0] s3_wb_dat_o,
+ // output wire [8:0] s3_wb_adr_o,
+ // output wire [3:0] s3_wb_sel_o,
+ // output wire s3_wb_we_o,
+ // output wire s3_wb_cyc_o,
+ // output wire s3_wb_stb_o
);
-// WishBone Wr Interface
-typedef struct packed {
- logic [31:0] wb_dat;
- logic [31:0] wb_adr;
- logic [3:0] wb_sel;
- logic wb_we;
- logic wb_cyc;
- logic wb_stb;
- logic [1:0] wb_tid; // target id
-} type_wb_wr_intf;
+logic holding_busy; // Indicate Stagging for Free or not
-// WishBone Rd Interface
-typedef struct packed {
- logic [31:0] wb_dat;
- logic wb_ack;
- logic wb_err;
-} type_wb_rd_intf;
+logic [31:0] m0_wb_dat_i_reg;
+logic [31:0] m0_wb_adr_reg;
+logic [3:0] m0_wb_sel_reg;
+logic m0_wb_we_reg;
+logic m0_wb_cyc_reg;
+logic m0_wb_stb_reg;
+logic [1:0] m0_wb_tid_reg;
-// Master Write Interface
-type_wb_wr_intf m0_wb_wr;
+logic [31:0] m0_wb_dat_o_reg;
+logic m0_wb_ack_reg;
-// Master Read Interface
-type_wb_rd_intf m0_wb_rd;
+wire [31:0] s_bus_rd_wb_dat = (m0_wb_adr_i[13:12] == 2'b00) ? s0_wb_dat_i :
+ (m0_wb_adr_i[13:12] == 2'b01) ? s1_wb_dat_i :
+ (m0_wb_adr_i[13:12] == 2'b10) ? s2_wb_dat_i :
+ s3_wb_dat_i;
+wire s_bus_rd_wb_ack = (m0_wb_adr_i[13:12] == 2'b00) ? s0_wb_ack_i :
+ (m0_wb_adr_i[13:12] == 2'b01) ? s1_wb_ack_i :
+ (m0_wb_adr_i[13:12] == 2'b10) ? s2_wb_ack_i :
+ s3_wb_ack_i;
-// Slave Write Interface
-type_wb_wr_intf s0_wb_wr;
-type_wb_wr_intf s1_wb_wr;
-type_wb_wr_intf s2_wb_wr;
-type_wb_wr_intf s3_wb_wr;
-
-// Slave Read Interface
-type_wb_rd_intf s0_wb_rd;
-type_wb_rd_intf s1_wb_rd;
-type_wb_rd_intf s2_wb_rd;
-type_wb_rd_intf s3_wb_rd;
-
-type_wb_wr_intf s_bus_wr; // Multiplexed Master I/F
-type_wb_rd_intf s_bus_rd; // Multiplexed Slave I/F
+//wire [31:0] s_bus_rd_wb_dat = s0_wb_dat_i;
+//wire s_bus_rd_wb_ack = s0_wb_ack_i;
//-------------------------------------------------------------------
// EXTERNAL MEMORY MAP
@@ -129,121 +114,91 @@
// 0x0000_1000 to 0x0000_1FFF - UART
// 0x0000_2000 to 0x0000_2FFF - TRNG
// 0x0000_3000 to 0x0000_3FFF - SPI
-// ------------------------------------------------------------------
+//------------------------------------------------------------------
wire [1:0] m0_wb_tid_i = m0_wb_adr_i[13:12];
//----------------------------------------
-// Master Mapping
-// ---------------------------------------
-assign m0_wb_wr.wb_dat = m0_wb_dat_i;
-assign m0_wb_wr.wb_adr = {m0_wb_adr_i[31:2],2'b00};
-assign m0_wb_wr.wb_sel = m0_wb_sel_i;
-assign m0_wb_wr.wb_we = m0_wb_we_i;
-assign m0_wb_wr.wb_cyc = m0_wb_cyc_i;
-assign m0_wb_wr.wb_stb = m0_wb_stb_i;
-assign m0_wb_wr.wb_tid = m0_wb_tid_i;
-
-assign m0_wb_dat_o = m0_wb_rd.wb_dat;
-assign m0_wb_ack_o = m0_wb_rd.wb_ack;
-assign m0_wb_err_o = m0_wb_rd.wb_err;
-
-//----------------------------------------
// Slave Mapping
-// -------------------------------------
-// 2KB SRAM
-assign s0_wb_dat_o = s0_wb_wr.wb_dat;
-assign s0_wb_adr_o = s0_wb_wr.wb_adr[8:0];
-assign s0_wb_sel_o = s0_wb_wr.wb_sel;
-assign s0_wb_we_o = s0_wb_wr.wb_we;
-assign s0_wb_cyc_o = s0_wb_wr.wb_cyc;
-assign s0_wb_stb_o = s0_wb_wr.wb_stb;
+//---------------------------------------
+//assign s0_wb_dat_o = m0_wb_dat_i_reg;
+//assign s0_wb_adr_o = m0_wb_adr_reg[8:0];
+//assign s0_wb_sel_o = m0_wb_sel_reg;
+//assign s0_wb_we_o = m0_wb_we_reg;
+//assign s0_wb_cyc_o = m0_wb_cyc_reg;
+//assign s0_wb_stb_o = m0_wb_stb_reg;
-assign s0_wb_rd.wb_dat = s0_wb_dat_i;
-assign s0_wb_rd.wb_ack = s0_wb_ack_i;
-assign s0_wb_rd.wb_err = 1'b0;
+assign s0_wb_dat_o = (m0_wb_tid_reg == 2'b00) ? m0_wb_dat_i_reg : 2'b00;
+assign s0_wb_adr_o = (m0_wb_tid_reg == 2'b00) ? m0_wb_adr_reg : 2'b00;
+assign s0_wb_sel_o = (m0_wb_tid_reg == 2'b00) ? m0_wb_sel_reg : 2'b00;
+assign s0_wb_we_o = (m0_wb_tid_reg == 2'b00) ? m0_wb_we_reg : 2'b00;
+assign s0_wb_cyc_o = (m0_wb_tid_reg == 2'b00) ? m0_wb_cyc_reg : 2'b00;
+assign s0_wb_stb_o = (m0_wb_tid_reg == 2'b00) ? m0_wb_stb_reg : 2'b00;
-// UART
-assign s1_wb_dat_o = s1_wb_wr.wb_dat;
-assign s1_wb_adr_o = s1_wb_wr.wb_adr[10:0];
-assign s1_wb_sel_o = s1_wb_wr.wb_sel;
-assign s1_wb_we_o = s1_wb_wr.wb_we;
-assign s1_wb_cyc_o = s1_wb_wr.wb_cyc;
-assign s1_wb_stb_o = s1_wb_wr.wb_stb;
+assign s1_wb_dat_o = (m0_wb_tid_reg == 2'b01) ? m0_wb_dat_i_reg : 2'b00;
+assign s1_wb_adr_o = (m0_wb_tid_reg == 2'b01) ? m0_wb_adr_reg : 2'b00;
+assign s1_wb_sel_o = (m0_wb_tid_reg == 2'b01) ? m0_wb_sel_reg : 2'b00;
+assign s1_wb_we_o = (m0_wb_tid_reg == 2'b01) ? m0_wb_we_reg : 2'b00;
+assign s1_wb_cyc_o = (m0_wb_tid_reg == 2'b01) ? m0_wb_cyc_reg : 2'b00;
+assign s1_wb_stb_o = (m0_wb_tid_reg == 2'b01) ? m0_wb_stb_reg : 2'b00;
-assign s1_wb_rd.wb_dat = s1_wb_dat_i;
-assign s1_wb_rd.wb_ack = s1_wb_ack_i;
-assign s1_wb_rd.wb_err = 1'b0;
+// assign s2_wb_dat_o = (m0_wb_tid_reg == 2'b10) ? m0_wb_dat_i_reg : 2'b00;
+// assign s2_wb_adr_o = (m0_wb_tid_reg == 2'b10) ? m0_wb_adr_reg : 2'b00;
+// assign s2_wb_sel_o = (m0_wb_tid_reg == 2'b10) ? m0_wb_sel_reg : 2'b00;
+// assign s2_wb_we_o = (m0_wb_tid_reg == 2'b10) ? m0_wb_we_reg : 2'b00;
+// assign s2_wb_cyc_o = (m0_wb_tid_reg == 2'b10) ? m0_wb_cyc_reg : 2'b00;
+// assign s2_wb_stb_o = (m0_wb_tid_reg == 2'b10) ? m0_wb_stb_reg : 2'b00;
-// TRNG
-assign s2_wb_dat_o = s2_wb_wr.wb_dat;
-assign s2_wb_adr_o = s2_wb_wr.wb_adr[10:0];
-assign s2_wb_sel_o = s2_wb_wr.wb_sel;
-assign s2_wb_we_o = s2_wb_wr.wb_we;
-assign s2_wb_cyc_o = s2_wb_wr.wb_cyc;
-assign s2_wb_stb_o = s2_wb_wr.wb_stb;
+// assign s3_wb_dat_o = (m0_wb_tid_reg == 2'b11) ? m0_wb_dat_i_reg : 2'b00;
+// assign s3_wb_adr_o = (m0_wb_tid_reg == 2'b11) ? m0_wb_adr_reg : 2'b00;
+// assign s3_wb_sel_o = (m0_wb_tid_reg == 2'b11) ? m0_wb_sel_reg : 2'b00;
+// assign s3_wb_we_o = (m0_wb_tid_reg == 2'b11) ? m0_wb_we_reg : 2'b00;
+// assign s3_wb_cyc_o = (m0_wb_tid_reg == 2'b11) ? m0_wb_cyc_reg : 2'b00;
+// assign s3_wb_stb_o = (m0_wb_tid_reg == 2'b11) ? m0_wb_stb_reg : 2'b00;
-assign s2_wb_rd.wb_dat = s2_wb_dat_i;
-assign s2_wb_rd.wb_ack = s2_wb_ack_i;
-assign s2_wb_rd.wb_err = 1'b0;
+assign m0_wb_dat_o = s_bus_rd_wb_dat;
+assign m0_wb_ack_o = s_bus_rd_wb_ack;
-// SPI
-assign s3_wb_dat_o = s3_wb_wr.wb_dat;
-assign s3_wb_adr_o = s3_wb_wr.wb_adr[10:0];
-assign s3_wb_sel_o = s3_wb_wr.wb_sel;
-assign s3_wb_we_o = s3_wb_wr.wb_we;
-assign s3_wb_cyc_o = s3_wb_wr.wb_cyc;
-assign s3_wb_stb_o = s3_wb_wr.wb_stb;
+always @(negedge rst_n or posedge clk_i)
+begin
+ if(rst_n == 1'b0) begin
+ // holding_busy <= 1'b0;
+ m0_wb_dat_i_reg <= 'h0;
+ m0_wb_adr_reg <= 'h0;
+ m0_wb_sel_reg <= 'h0;
+ m0_wb_we_reg <= 'h0;
+ m0_wb_cyc_reg <= 'h0;
+ m0_wb_stb_reg <= 'h0;
+ m0_wb_tid_reg <= 'h0;
-assign s3_wb_rd.wb_dat = s3_wb_dat_i;
-assign s3_wb_rd.wb_ack = s3_wb_ack_i;
-assign s3_wb_rd.wb_err = 1'b0;
+ m0_wb_dat_o_reg <= 'h0;
+ m0_wb_ack_reg <= 'h0;
+
+ end else begin
+ m0_wb_dat_i_reg <= 'h0;
+ m0_wb_adr_reg <= 'h0;
+ m0_wb_sel_reg <= 'h0;
+ m0_wb_we_reg <= 'h0;
+ m0_wb_cyc_reg <= 'h0;
+ m0_wb_stb_reg <= 'h0;
+ m0_wb_tid_reg <= 'h0;
-// Generate Multiplexed Slave Interface based on target Id
-wire [3:0] s_wb_tid = s_bus_wr.wb_tid; // to fix iverilog warning
+ // m0_wb_dat_o_reg <= 'h0;
+ // m0_wb_ack_reg <= 'h0;
-always begin
- case(s_wb_tid)
- 2'b00: s_bus_rd = s0_wb_rd;
- 2'b01: s_bus_rd = s1_wb_rd;
- 2'b10: s_bus_rd = s2_wb_rd;
- 2'b11: s_bus_rd = s3_wb_rd;
- endcase
+ if(m0_wb_stb_i && m0_wb_cyc_i && s_bus_rd_wb_ack == 0) begin
+ // holding_busy <= 1'b1;
+ m0_wb_dat_i_reg <= m0_wb_dat_i;
+ m0_wb_adr_reg <= {2'b00,m0_wb_adr_i[31:2]};
+ m0_wb_sel_reg <= m0_wb_sel_i;
+ m0_wb_we_reg <= m0_wb_we_i;
+ m0_wb_cyc_reg <= m0_wb_cyc_i;
+ m0_wb_stb_reg <= m0_wb_stb_i;
+ m0_wb_tid_reg <= m0_wb_tid_i;
+
+ // m0_wb_dat_o_reg <= s_bus_rd_wb_dat;
+ // m0_wb_ack_reg <= s_bus_rd_wb_ack;
+ end
+ end
end
-// Connect Master => Slave
-assign s0_wb_wr = (s_wb_tid == 2'b00) ? s_bus_wr : 2'b00;
-assign s1_wb_wr = (s_wb_tid == 2'b01) ? s_bus_wr : 2'b00;
-assign s2_wb_wr = (s_wb_tid == 2'b10) ? s_bus_wr : 2'b00;
-assign s3_wb_wr = (s_wb_tid == 2'b11) ? s_bus_wr : 2'b00;
-
-// Stagging FF to break write and read timing path
-wb_stagging u_m_wb_stage(
- .clk_i (clk_i),
- .rst_n (rst_n),
-
- // WishBone Input master I/P
- .m_wb_dat_i (m0_wb_wr.wb_dat),
- .m_wb_adr_i (m0_wb_wr.wb_adr),
- .m_wb_sel_i (m0_wb_wr.wb_sel),
- .m_wb_we_i (m0_wb_wr.wb_we ),
- .m_wb_cyc_i (m0_wb_wr.wb_cyc),
- .m_wb_stb_i (m0_wb_wr.wb_stb),
- .m_wb_tid_i (m0_wb_wr.wb_tid),
- .m_wb_dat_o (m0_wb_rd.wb_dat),
- .m_wb_ack_o (m0_wb_rd.wb_ack),
- .m_wb_err_o (m0_wb_rd.wb_err),
-
- // Slave Interface
- .s_wb_dat_i (s_bus_rd.wb_dat),
- .s_wb_ack_i (s_bus_rd.wb_ack),
- .s_wb_err_i (s_bus_rd.wb_err),
- .s_wb_dat_o (s_bus_wr.wb_dat),
- .s_wb_adr_o (s_bus_wr.wb_adr),
- .s_wb_sel_o (s_bus_wr.wb_sel),
- .s_wb_we_o (s_bus_wr.wb_we ),
- .s_wb_cyc_o (s_bus_wr.wb_cyc),
- .s_wb_stb_o (s_bus_wr.wb_stb),
- .s_wb_tid_o (s_bus_wr.wb_tid)
-);
-
endmodule
diff --git a/verilog/rtl/wb_interconnect/wb_signal_reg.sv b/verilog/rtl/wb_interconnect/wb_signal_reg.sv
new file mode 100644
index 0000000..d68156d
--- /dev/null
+++ b/verilog/rtl/wb_interconnect/wb_signal_reg.sv
@@ -0,0 +1,94 @@
+//-----------------------------------------------------------------------------
+// @file wb_signal_reg.vhd
+//
+// @brief Register wishbone signals.
+//
+// @details This logic create a holding FF for Wishbone interface.
+// This is usefull to break timing issue at interconnect
+//
+// @author Sukru Uzun <sukru.uzun@procenne.com>
+// @date 10.03.2022
+//
+// @todo
+// @warning
+//
+// @project https://github.com/Procenne-Digital-Design/secure-memory.git
+//
+// @revision :
+// 0.1 - 10 March 2022, Sukru Uzun
+// initial version
+//-----------------------------------------------------------------------------
+
+module wb_signal_reg (
+ input logic clk_i,
+ input logic rst_n,
+
+ // WishBone Input master I/P
+ input logic [31:0] m_wb_dat_i,
+ input logic [31:0] m_wb_adr_i,
+ input logic [3:0] m_wb_sel_i,
+ input logic m_wb_we_i,
+ input logic m_wb_cyc_i,
+ input logic m_wb_stb_i,
+ input logic [1:0] m_wb_tid_i,
+ output logic [31:0] m_wb_dat_o,
+ output logic m_wb_ack_o,
+ output logic m_wb_err_o,
+
+ // Slave Interface
+ input logic [31:0] s_wb_dat_i,
+ input logic s_wb_ack_i,
+ input logic s_wb_err_i,
+ output logic [31:0] s_wb_dat_o,
+ output logic [31:0] s_wb_adr_o,
+ output logic [3:0] s_wb_sel_o,
+ output logic s_wb_we_o,
+ output logic s_wb_cyc_o,
+ output logic s_wb_stb_o,
+ output logic [1:0] s_wb_tid_o
+);
+
+logic holding_busy ; // Indicate Stagging for Free or not
+
+always @(negedge rst_n or posedge clk_i)
+begin
+ if(rst_n == 1'b0) begin
+ holding_busy <= 1'b0;
+ s_wb_dat_o <= 'h0;
+ s_wb_adr_o <= 'h0;
+ s_wb_sel_o <= 'h0;
+ s_wb_we_o <= 'h0;
+ s_wb_cyc_o <= 'h0;
+ s_wb_stb_o <= 'h0;
+ s_wb_tid_o <= 'h0;
+ m_wb_dat_o <= 'h0;
+ m_wb_ack_o <= 'h0;
+ m_wb_err_o <= 'h0;
+ end else begin
+ m_wb_dat_o <= s_wb_dat_i;
+ m_wb_ack_o <= s_wb_ack_i;
+ m_wb_err_o <= s_wb_err_i;
+ if(m_wb_stb_i && holding_busy == 0 && m_wb_ack_o == 0) begin
+ holding_busy <= 1'b1;
+ s_wb_dat_o <= m_wb_dat_i;
+ s_wb_adr_o <= m_wb_adr_i;
+ s_wb_sel_o <= m_wb_sel_i;
+ s_wb_we_o <= m_wb_we_i;
+ s_wb_cyc_o <= m_wb_cyc_i;
+ s_wb_stb_o <= m_wb_stb_i;
+ s_wb_tid_o <= m_wb_tid_i;
+ end
+ else if (holding_busy && s_wb_ack_i) begin
+ holding_busy <= 1'b0;
+ s_wb_dat_o <= 'h0;
+ s_wb_adr_o <= 'h0;
+ s_wb_sel_o <= 'h0;
+ s_wb_we_o <= 'h0;
+ s_wb_cyc_o <= 'h0;
+ s_wb_stb_o <= 'h0;
+ s_wb_tid_o <= 'h0;
+ end
+ end
+end
+
+endmodule
diff --git a/verilog/rtl/wb_interconnect/wb_stagging.sv b/verilog/rtl/wb_interconnect/wb_stagging.sv
deleted file mode 100644
index 2d0121e..0000000
--- a/verilog/rtl/wb_interconnect/wb_stagging.sv
+++ /dev/null
@@ -1,116 +0,0 @@
-//-----------------------------------------------------------------------------
-// @file wb_staging.vhd
-//
-// @brief Register wishbone signals.
-//
-// @details This logic create a holding FF for Wishbone interface.
-// This is usefull to break timing issue at interconnect
-//
-// @author Sukru Uzun <sukru.uzun@procenne.com>
-// @date 10.03.2022
-//
-// @todo
-// @warning
-//
-// @project https://github.com/Procenne-Digital-Design/secure-memory.git
-//
-// @revision :
-// 0.1 - 10 March 2022, Sukru Uzun
-// initial version
-//-----------------------------------------------------------------------------
-
-module wb_stagging (
- input logic clk_i,
- input logic rst_n,
-
- // WishBone Input master I/P
- input logic [31:0] m_wbd_dat_i,
- input logic [31:0] m_wbd_adr_i,
- input logic [3:0] m_wbd_sel_i,
- input logic m_wbd_we_i,
- input logic m_wbd_cyc_i,
- input logic m_wbd_stb_i,
- input logic [3:0] m_wbd_tid_i,
- output logic [31:0] m_wbd_dat_o,
- output logic m_wbd_ack_o,
- output logic m_wbd_err_o,
-
- // Slave Interface
- input logic [31:0] s_wbd_dat_i,
- input logic s_wbd_ack_i,
- input logic s_wbd_err_i,
- output logic [31:0] s_wbd_dat_o,
- output logic [31:0] s_wbd_adr_o,
- output logic [3:0] s_wbd_sel_o,
- output logic s_wbd_we_o,
- output logic s_wbd_cyc_o,
- output logic s_wbd_stb_o,
- output logic [3:0] s_wbd_tid_o
-);
-
-logic holding_busy ; // Indicate Stagging for Free or not
-logic [31:0] m_wbd_dat_i_ff ; // Flopped vesion of m_wbd_dat_i
-logic [31:0] m_wbd_adr_i_ff ; // Flopped vesion of m_wbd_adr_i
-logic [3:0] m_wbd_sel_i_ff ; // Flopped vesion of m_wbd_sel_i
-logic m_wbd_we_i_ff ; // Flopped vesion of m_wbd_we_i
-logic m_wbd_cyc_i_ff ; // Flopped vesion of m_wbd_cyc_i
-logic m_wbd_stb_i_ff ; // Flopped vesion of m_wbd_stb_i
-logic [3:0] m_wbd_tid_i_ff ; // Flopped vesion of m_wbd_tid_i
-logic [31:0] s_wbd_dat_i_ff ; // Flopped vesion of s_wbd_dat_i
-logic s_wbd_ack_i_ff ; // Flopped vesion of s_wbd_ack_i
-logic s_wbd_err_i_ff ; // Flopped vesion of s_wbd_err_i
-
-assign s_wbd_dat_o = m_wbd_dat_i_ff;
-assign s_wbd_adr_o = m_wbd_adr_i_ff;
-assign s_wbd_sel_o = m_wbd_sel_i_ff;
-assign s_wbd_we_o = m_wbd_we_i_ff;
-assign s_wbd_cyc_o = m_wbd_cyc_i_ff;
-assign s_wbd_stb_o = m_wbd_stb_i_ff;
-assign s_wbd_tid_o = m_wbd_tid_i_ff;
-
-assign m_wbd_dat_o = s_wbd_dat_i_ff;
-assign m_wbd_ack_o = s_wbd_ack_i_ff;
-assign m_wbd_err_o = s_wbd_err_i_ff;
-
-always @(negedge rst_n or posedge clk_i)
-begin
- if(rst_n == 1'b0) begin
- holding_busy <= 1'b0;
- m_wbd_dat_i_ff <= 'h0;
- m_wbd_adr_i_ff <= 'h0;
- m_wbd_sel_i_ff <= 'h0;
- m_wbd_we_i_ff <= 'h0;
- m_wbd_cyc_i_ff <= 'h0;
- m_wbd_stb_i_ff <= 'h0;
- m_wbd_tid_i_ff <= 'h0;
- s_wbd_dat_i_ff <= 'h0;
- s_wbd_ack_i_ff <= 'h0;
- s_wbd_err_i_ff <= 'h0;
- end else begin
- s_wbd_dat_i_ff <= s_wbd_dat_i;
- s_wbd_ack_i_ff <= s_wbd_ack_i;
- s_wbd_err_i_ff <= s_wbd_err_i;
- if(m_wbd_stb_i && holding_busy == 0 && m_wbd_ack_o == 0) begin
- holding_busy <= 1'b1;
- m_wbd_dat_i_ff <= m_wbd_dat_i;
- m_wbd_adr_i_ff <= m_wbd_adr_i;
- m_wbd_sel_i_ff <= m_wbd_sel_i;
- m_wbd_we_i_ff <= m_wbd_we_i;
- m_wbd_cyc_i_ff <= m_wbd_cyc_i;
- m_wbd_stb_i_ff <= m_wbd_stb_i;
- m_wbd_tid_i_ff <= m_wbd_tid_i;
- end
- else if (holding_busy && s_wbd_ack_i) begin
- holding_busy <= 1'b0;
- m_wbd_dat_i_ff <= 'h0;
- m_wbd_adr_i_ff <= 'h0;
- m_wbd_sel_i_ff <= 'h0;
- m_wbd_we_i_ff <= 'h0;
- m_wbd_cyc_i_ff <= 'h0;
- m_wbd_stb_i_ff <= 'h0;
- m_wbd_tid_i_ff <= 'h0;
- end
- end
-end
-
-endmodule