From 4e9b15bea7598cfe239b919a2113217838e38b23 Mon Sep 17 00:00:00 2001
From: Daniel Newbrook <dwn1c21@soton.ac.uk>
Date: Tue, 10 Sep 2024 16:06:57 +0100
Subject: [PATCH] Update ASIC flow, make SRAM 1MB, add clocks for asynchronous
 interfaces

---
 .gitignore                                    |   4 +-
 .../Synopsys_FC_flow/FC_flow.tcl              |  54 ++-
 .../Synopsys_FC_flow/design_setup.tcl         |   2 +-
 .../Synopsys_FC_flow/floorplan/floorplan.def  |   4 +-
 .../Synopsys_FC_flow/floorplan/floorplan.tcl  |   2 +-
 .../floorplan/floorplan_compare_data.txt      | 203 +++++------
 .../Synopsys_FC_flow/floorplan/fp.tcl         |  40 +--
 .../Synopsys_FC_flow/init_placement.tcl       |   4 +-
 .../synopsys_lib_conversion.tcl               |  69 +++-
 .../constraints/sram_chiplet.sdc              |  23 +-
 flist/IP/NIC400.flist                         |  48 ++-
 flist/Top/sram_chiplet.flist                  |   1 +
 flist/Top/sram_chiplet_TSMC28nm.flist         |   1 +
 flist/Top/sram_chiplet_TSMC28nm_ASIC.flist    |   1 +
 flist/Top/sram_chiplet_vip.flist              |   4 +-
 logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v     |  29 +-
 .../SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v |   6 +-
 logical/SRAM/glib/verilog/SRAM.v              |  12 +-
 logical/SRAM/glib/verilog/SRAM_wrapper.v      |   6 +-
 .../verilog/sram_chiplet_apb_subsystem.v      |  60 +++-
 .../verilog/synchr_clock_mux.v                |  56 +++
 .../verilog/top_sram_chiplet.sv               |  46 ++-
 pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv       |  38 +-
 socrates/BP301_SRAM/config/SRAM_ctrl.yaml     |   2 +-
 .../nic400_sram_chiplet.xml                   | 127 ++++---
 socrates/nic400_tb/nic400_tb.xml              |   4 +-
 synopsys_28nm_slm_integration                 |   2 +-
 verif/cocotb/sram_chiplet_cocotb.sv           | 327 ++++--------------
 verif/cocotb/sram_chiplet_tests.py            | 100 ++++--
 29 files changed, 734 insertions(+), 541 deletions(-)
 create mode 100644 logical/sram_chiplet_apb_subsystem/verilog/synchr_clock_mux.v

diff --git a/.gitignore b/.gitignore
index 3fbd165..7a28c76 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,11 +5,13 @@ ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/cln28ht
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/.*
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/HDL_LIBRARIES
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/PreFrameCheck
-ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/sram 
+ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/sram_32k
+ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/sram_16k
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/sram_chiplet.dlib 
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/Synopsys_PD
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/Synopsys_PLL
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/Synopsys_TS
+ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/Synopsys_VM
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/*.svf
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/*.log 
 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/*.txt 
diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/FC_flow.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/FC_flow.tcl
index f9f2f84..14f6938 100644
--- a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/FC_flow.tcl
+++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/FC_flow.tcl
@@ -1,16 +1,52 @@
+# Main flow for Synopsys fusion compiler 
 
-source ./design_setup.tcl
+set REPORT_DIR $env(SOCLABS_SRAM_CHIPLET_DIR)/imp/ASIC/SRAM_CHIPLET/reports
+set LOG_DIR $env(SOCLABS_SRAM_CHIPLET_DIR)/imp/ASIC/SRAM_CHIPLET/logs
 
-source ./floorplan/fp.tcl
-read_sdc ../constraints/sram_chiplet.sdc
+# Design setup: read libraries and RTL 
+redirect -tee -file $LOG_DIR/01_design_setup.log {source ./design_setup.tcl}
 
-source ./power_plan.tcl
+# Floorplan setup
+redirect -tee -file $LOG_DIR/02_init_floorplan.log {initialize_floorplan -control_type die -use_site_row -side_length {1695 1530} -core_offset {120}}
+redirect -tee -file $LOG_DIR/03_floorplan.log {source ./floorplan/fp.tcl}
 
-source ./init_placement.tcl
+# Read Constraints
+redirect -tee -file $LOG_DIR/04_constraints.log {read_sdc ../constraints/sram_chiplet.sdc}
 
-redirect -tee -file ./compile.log {compile_fusion}
+# Power Plan
+redirect -tee -file $LOG_DIR/05_power_plan.log {source ./power_plan.tcl}
+
+# Init coarse placement
+redirect -tee -file $LOG_DIR/06_init_placement.log {source ./init_placement.tcl}
+
+# Physical aware synthesis
+redirect -tee -file $LOG_DIR/07_compile.log {compile_fusion}
+save_lib sram_chiplet.dlib
+redirect -tee -file $REPORT_DIR/timing_01_compile.rep {report_timing}
+
+
+# Optimise Placement
+redirect -tee -file $LOG_DIR/09_place_opt.log {place_opt}
+save_lib sram_chiplet.dlib
+redirect -tee -file $REPORT_DIR/timing_02_opt_place.rep {report_timing}
+
+# CTS
+redirect -tee -file $LOG_DIR/08_CTS.log {synthesize_clock_trees -clock {PLL_CLK REF_CLK TLX_IN_FWD_CLK TLX_OUT_REV_CLK}}
 save_lib sram_chiplet.dlib
+redirect -tee -file $REPORT_DIR/timing_03_CTS.rep {report_timing}
 
-synthesize_clock_trunks -clock clk
-place_opt
-clock_opt
+# Clock Optimisation
+redirect -tee -file $LOG_DIR/10_clock_opt.log {clock_opt}
+save_lib sram_chiplet.dlib
+redirect -tee -file $REPORT_DIR/timing_04_clock_opt.rep {report_timing}
+
+
+# Route
+redirect -tee -file $LOG_DIR/11_route.log {route_auto}
+save_lib sram_chiplet.dlib
+redirect -tee -file $REPORT_DIR/timing_05_route.rep {report_timing}
+
+# Route optimisation
+redirect -tee -file $LOG_DIR/12_route_optimisation.log {optimize_routes}
+save_lib sram_chiplet.dlib
+redirect -tee -file $REPORT_DIR/timing_06_route_opt.rep {report_timing}
diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/design_setup.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/design_setup.tcl
index a672393..4f70550 100644
--- a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/design_setup.tcl
+++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/design_setup.tcl
@@ -13,7 +13,7 @@ set TLU_map $TLU_dir/tluplus.map
 
 create_lib sram_chiplet.dlib \
     -technology $cln28ht_tech_path/milkyway/1p8m_5x2z_utalrdl/sc9mcpp140z_tech.tf \
-    -ref_libs {./cln28ht/ ./sram/ ./Synopsys_PLL/ ./Synopsys_PD/ ./Synopsys_TS/}
+    -ref_libs {./cln28ht/ ./sram_16k/ ./sram_32k/ ./Synopsys_PLL/ ./Synopsys_PD/ ./Synopsys_TS/ ./Synopsys_VM/}
 
 source $env(SOCLABS_SRAM_CHIPLET_DIR)/imp/ASIC/SRAM_CHIPLET/flist/synopsys_flist.tcl
 analyze -format sverilog $env(SOCLABS_SRAM_CHIPLET_DIR)/pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv
diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.def b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.def
index 6ef2e9d..da438bf 100644
--- a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.def
+++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.def
@@ -2,12 +2,12 @@
 # Fusion Compiler write_def
 # Release      : U-2022.12
 # User Name    : dwn1c21
-# Date         : Tue Sep  3 14:17:43 2024
+# Date         : Thu Sep  5 11:23:09 2024
 # 
 VERSION 5.8 ;
 DIVIDERCHAR "/" ;
 BUSBITCHARS "[]" ;
 DESIGN SRAM_chiplet ;
 UNITS DISTANCE MICRONS 1000 ;
-DIEAREA ( 0 0 ) ( 0 1529700 ) ( 1789940 1529700 ) ( 1789940 0 ) ;
+DIEAREA ( 0 0 ) ( 0 1529700 ) ( 1694880 1529700 ) ( 1694880 0 ) ;
 END DESIGN
diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.tcl
index 6f35619..1bf66cf 100644
--- a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.tcl
+++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.tcl
@@ -1,6 +1,6 @@
 ################################################################################
 #
-# Created by fc write_floorplan on Tue Sep  3 14:17:43 2024
+# Created by fc write_floorplan on Thu Sep  5 11:23:09 2024
 #
 ################################################################################
 
diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan_compare_data.txt b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan_compare_data.txt
index eeb6c76..e3843c9 100644
--- a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan_compare_data.txt
+++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan_compare_data.txt
@@ -1,6 +1,6 @@
 ################################################################################
 #
-# Created by fc compare_floorplans on Tue Sep  3 14:17:43 2024
+# Created by fc compare_floorplans on Thu Sep  5 11:23:09 2024
 #
 # DO NOT EDIT - automatically generated file
 #
@@ -11,105 +11,106 @@ START SRAM_chiplet
   u_top_sram_chiplet/u_sram_chiplet_apb_subsystem/gen_snps_PVT_ts0.u_snps_PVT_ts0/u_synopsys_ts { {120.0000 390.0600} {360.0000 590.0600} }
   u_top_sram_chiplet/u_sram_chiplet_apb_subsystem/gen_snps_PVT_pd0.u_snps_PVT_pd0/u_synopsys_pd { {120.0000 618.3400} {205.0000 693.3400} }
   u_top_sram_chiplet/u_sram_chiplet_apb_subsystem/gen_snps_PLL.u_snps_PLL/u_snps_PLL { {120.0000 120.0000} {382.5000 360.0000} }
-  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[0].u_sram_32b_32k { {387.3000 770.0650} {707.9600 1409.7000} }
-  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[1].u_sram_32b_32k { {707.9600 770.0650} {1028.6200 1409.7000} }
-  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[2].u_sram_32b_32k { {1028.6200 770.0650} {1349.2800 1409.7000} }
-  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[3].u_sram_32b_32k { {1349.2800 770.0650} {1669.9400 1409.7000} }
-  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[4].u_sram_32b_32k { {1349.2800 120.0000} {1669.9400 759.6350} }
-  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[5].u_sram_32b_32k { {1028.6200 120.0000} {1349.2800 759.6350} }
-  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[6].u_sram_32b_32k { {707.9600 120.0000} {1028.6200 759.6350} }
-  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[7].u_sram_32b_32k { {387.3000 120.0000} {707.9600 759.6350} }
+  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[0].u_sram_32b_32k { {120.0600 770.0650} {440.7200 1409.7000} }
+  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[1].u_sram_32b_32k { {440.7200 770.0650} {761.3800 1409.7000} }
+  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[2].u_sram_32b_32k { {761.3800 770.0650} {1082.0400 1409.7000} }
+  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[3].u_sram_32b_32k { {1082.0400 770.0650} {1402.7000 1409.7000} }
+  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[4].u_sram_32b_32k { {1082.0400 120.0000} {1402.7000 759.6350} }
+  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[5].u_sram_32b_32k { {761.3800 120.0000} {1082.0400 759.6350} }
+  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[6].u_sram_32b_32k { {440.7200 120.0000} {761.3800 759.6350} }
+  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/u_sram_32b_16k_0 { {1402.7000 120.0000} {1574.8800 758.0750} }
+  u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/u_sram_32b_16k_1 { {1402.7000 771.6250} {1574.8800 1409.7000} }
  PINS
-  clk_in { {894.9700 764.8500} {894.9701 764.8501} }
-  aresetn { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[15] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[14] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[13] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[12] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[11] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[10] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[9] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[8] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[7] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[6] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[5] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[4] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[3] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[2] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[1] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tdata[0] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tvalid { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_rev_0_tready { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_flow_rev_0_tdata[2] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_flow_rev_0_tdata[1] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_flow_rev_0_tdata[0] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_flow_rev_0_tvalid { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_flow_rev_0_tready { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_flow_fwd_0_tdata[1] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_flow_fwd_0_tdata[0] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_flow_fwd_0_tvalid { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_flow_fwd_0_tready { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[15] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[14] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[13] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[12] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[11] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[10] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[9] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[8] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[7] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[6] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[5] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[4] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[3] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[2] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[1] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tdata[0] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tvalid { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_IN_data_fwd_0_tready { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[15] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[14] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[13] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[12] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[11] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[10] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[9] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[8] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[7] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[6] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[5] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[4] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[3] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[2] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[1] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tdata[0] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tvalid { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_rev_1_tready { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_flow_rev_1_tdata[2] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_flow_rev_1_tdata[1] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_flow_rev_1_tdata[0] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_flow_rev_1_tvalid { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_flow_rev_1_tready { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_flow_fwd_1_tdata[1] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_flow_fwd_1_tdata[0] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_flow_fwd_1_tvalid { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_flow_fwd_1_tready { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[15] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[14] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[13] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[12] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[11] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[10] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[9] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[8] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[7] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[6] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[5] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[4] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[3] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[2] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[1] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tdata[0] { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tvalid { {894.9700 764.8500} {894.9701 764.8501} }
-  TLX_data_fwd_1_tready { {894.9700 764.8500} {894.9701 764.8501} }
+  clk_in { {847.4400 764.8500} {847.4401 764.8501} }
+  aresetn { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[15] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[14] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[13] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[12] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[11] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[10] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[9] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[8] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[7] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[6] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[5] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[4] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[3] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[2] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[1] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tdata[0] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tvalid { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_rev_0_tready { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_flow_rev_0_tdata[2] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_flow_rev_0_tdata[1] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_flow_rev_0_tdata[0] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_flow_rev_0_tvalid { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_flow_rev_0_tready { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_flow_fwd_0_tdata[1] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_flow_fwd_0_tdata[0] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_flow_fwd_0_tvalid { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_flow_fwd_0_tready { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[15] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[14] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[13] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[12] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[11] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[10] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[9] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[8] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[7] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[6] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[5] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[4] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[3] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[2] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[1] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tdata[0] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tvalid { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_IN_data_fwd_0_tready { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[15] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[14] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[13] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[12] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[11] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[10] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[9] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[8] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[7] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[6] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[5] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[4] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[3] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[2] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[1] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tdata[0] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tvalid { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_rev_1_tready { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_flow_rev_1_tdata[2] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_flow_rev_1_tdata[1] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_flow_rev_1_tdata[0] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_flow_rev_1_tvalid { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_flow_rev_1_tready { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_flow_fwd_1_tdata[1] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_flow_fwd_1_tdata[0] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_flow_fwd_1_tvalid { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_flow_fwd_1_tready { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[15] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[14] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[13] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[12] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[11] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[10] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[9] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[8] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[7] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[6] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[5] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[4] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[3] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[2] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[1] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tdata[0] { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tvalid { {847.4400 764.8500} {847.4401 764.8501} }
+  TLX_data_fwd_1_tready { {847.4400 764.8500} {847.4401 764.8501} }
 END SRAM_chiplet
diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/fp.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/fp.tcl
index d30045d..8319320 100644
--- a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/fp.tcl
+++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/fp.tcl
@@ -1,9 +1,8 @@
 ################################################################################
 #
-# Created by fc write_floorplan on Tue Sep  3 14:17:43 2024
+# Created by fc write_floorplan on Thu Sep  5 11:23:09 2024
 #
 ################################################################################
-initialize_floorplan -control_type die -use_site_row -side_length {1790 1530} -core_offset {120}
 
 
 set _dirName__0 [file dirname [file normalize [info script]]]
@@ -45,7 +44,7 @@ set_attribute -quiet -objects $cellInst -name status -value placed
 set cellInst [get_cells { \
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[0].u_sram_32b_32k }]
 set_attribute -quiet -objects $cellInst -name orientation -value R90
-set_attribute -quiet -objects $cellInst -name origin -value { 707.9600 770.0650 \
+set_attribute -quiet -objects $cellInst -name origin -value { 440.7200 770.0650 \
     }
 set_attribute -quiet -objects $cellInst -name status -value placed
 create_keepout_margin -type hard -outer { 1.0000 1.0000 1.0000 1.0000 } { \
@@ -58,8 +57,8 @@ create_keepout_margin -type hard_macro -outer { 1.0000 1.0000 1.0000 1.0000 } {
 set cellInst [get_cells { \
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[1].u_sram_32b_32k }]
 set_attribute -quiet -objects $cellInst -name orientation -value R90
-set_attribute -quiet -objects $cellInst -name origin -value { 1028.6200 \
-    770.0650 }
+set_attribute -quiet -objects $cellInst -name origin -value { 761.3800 770.0650 \
+    }
 set_attribute -quiet -objects $cellInst -name status -value placed
 create_keepout_margin -type hard -outer { 1.0000 1.0000 1.0000 1.0000 } { \
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[1].u_sram_32b_32k }
@@ -71,7 +70,7 @@ create_keepout_margin -type hard_macro -outer { 1.0000 1.0000 1.0000 1.0000 } {
 set cellInst [get_cells { \
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[2].u_sram_32b_32k }]
 set_attribute -quiet -objects $cellInst -name orientation -value R90
-set_attribute -quiet -objects $cellInst -name origin -value { 1349.2800 \
+set_attribute -quiet -objects $cellInst -name origin -value { 1082.0400 \
     770.0650 }
 set_attribute -quiet -objects $cellInst -name status -value placed
 create_keepout_margin -type hard -outer { 1.0000 1.0000 1.0000 1.0000 } { \
@@ -84,7 +83,7 @@ create_keepout_margin -type hard_macro -outer { 1.0000 1.0000 1.0000 1.0000 } {
 set cellInst [get_cells { \
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[3].u_sram_32b_32k }]
 set_attribute -quiet -objects $cellInst -name orientation -value R90
-set_attribute -quiet -objects $cellInst -name origin -value { 1669.9400 \
+set_attribute -quiet -objects $cellInst -name origin -value { 1402.7000 \
     770.0650 }
 set_attribute -quiet -objects $cellInst -name status -value placed
 create_keepout_margin -type hard -outer { 1.0000 1.0000 1.0000 1.0000 } { \
@@ -97,7 +96,7 @@ create_keepout_margin -type hard_macro -outer { 1.0000 1.0000 1.0000 1.0000 } {
 set cellInst [get_cells { \
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[4].u_sram_32b_32k }]
 set_attribute -quiet -objects $cellInst -name orientation -value R270
-set_attribute -quiet -objects $cellInst -name origin -value { 1349.2800 \
+set_attribute -quiet -objects $cellInst -name origin -value { 1082.0400 \
     759.6350 }
 set_attribute -quiet -objects $cellInst -name status -value placed
 create_keepout_margin -type hard -outer { 1.0000 1.0000 1.0000 1.0000 } { \
@@ -110,8 +109,8 @@ create_keepout_margin -type hard_macro -outer { 1.0000 1.0000 1.0000 1.0000 } {
 set cellInst [get_cells { \
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[5].u_sram_32b_32k }]
 set_attribute -quiet -objects $cellInst -name orientation -value R270
-set_attribute -quiet -objects $cellInst -name origin -value { 1028.6200 \
-    759.6350 }
+set_attribute -quiet -objects $cellInst -name origin -value { 761.3800 759.6350 \
+    }
 set_attribute -quiet -objects $cellInst -name status -value placed
 create_keepout_margin -type hard -outer { 1.0000 1.0000 1.0000 1.0000 } { \
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[5].u_sram_32b_32k }
@@ -123,7 +122,7 @@ create_keepout_margin -type hard_macro -outer { 1.0000 1.0000 1.0000 1.0000 } {
 set cellInst [get_cells { \
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[6].u_sram_32b_32k }]
 set_attribute -quiet -objects $cellInst -name orientation -value R270
-set_attribute -quiet -objects $cellInst -name origin -value { 707.9600 759.6350 \
+set_attribute -quiet -objects $cellInst -name origin -value { 440.7200 759.6350 \
     }
 set_attribute -quiet -objects $cellInst -name status -value placed
 create_keepout_margin -type hard -outer { 1.0000 1.0000 1.0000 1.0000 } { \
@@ -134,17 +133,18 @@ create_keepout_margin -type hard_macro -outer { 1.0000 1.0000 1.0000 1.0000 } {
     u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[6].u_sram_32b_32k }
 
 set cellInst [get_cells { \
-    u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[7].u_sram_32b_32k }]
+    u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/u_sram_32b_16k_0 }]
 set_attribute -quiet -objects $cellInst -name orientation -value R270
-set_attribute -quiet -objects $cellInst -name origin -value { 387.3000 759.6350 \
-    }
+set_attribute -quiet -objects $cellInst -name origin -value { 1402.7000 \
+    758.0750 }
+set_attribute -quiet -objects $cellInst -name status -value placed
+
+set cellInst [get_cells { \
+    u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/u_sram_32b_16k_1 }]
+set_attribute -quiet -objects $cellInst -name orientation -value R90
+set_attribute -quiet -objects $cellInst -name origin -value { 1574.8800 \
+    771.6250 }
 set_attribute -quiet -objects $cellInst -name status -value placed
-create_keepout_margin -type hard -outer { 1.0000 1.0000 1.0000 1.0000 } { \
-    u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[7].u_sram_32b_32k }
-create_keepout_margin -type soft -outer { 1.0000 1.0000 1.0000 1.0000 } { \
-    u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[7].u_sram_32b_32k }
-create_keepout_margin -type hard_macro -outer { 1.0000 1.0000 1.0000 1.0000 } { \
-    u_top_sram_chiplet/u_SRAM_wrapper/u_SRAM/g_srams[7].u_sram_32b_32k }
 
 
 ################################################################################
diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/init_placement.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/init_placement.tcl
index b3749f8..cbb777b 100644
--- a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/init_placement.tcl
+++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/init_placement.tcl
@@ -1,5 +1,7 @@
 set_parasitic_parameters -early_spec cbest -early_temperature -40 -late_spec cworst -late_temperature 125 -library sram_chiplet.dlib
-set_operating_conditions -max_library cln28ht -max ssg_cworstt_max_0p81v_125c -min_library cln28ht -min ssg_cworstt_max_0p81v_125c
+set_operating_conditions -max_library cln28ht -max ssg_cworstt_max_0p81v_125c -min_library cln28ht -min ffg_cbestt_min_0p99v_m40c
+set_temperature -40 -min 125 -corners default
+set_voltage 0.99 -min 0.81 -corners default
 
 redirect -tee -file ./precompile_checks.log {compile_fusion -check_only}
 
diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/synopsys_lib_conversion.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/synopsys_lib_conversion.tcl
index b053c7f..d379fd0 100644
--- a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/synopsys_lib_conversion.tcl
+++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/synopsys_lib_conversion.tcl
@@ -16,12 +16,21 @@ set sc9mcpp140z_antenna_file            $sc9mcpp140z_base_path/milkyway/1p8m_5x2
 set sram_32k_lef_file                   $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k/sram_32b_32k.lef
 set sram_32k_gds_file                   $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k/sram_32b_32k.gds2
 set sram_32k_lib_file_ss_0p81v_125c     $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k/sram_32b_32k_ssg_cworstt_0p81v_0p81v_125c.lib
-set sram_32k_db_file_ss_0p81v_125c      $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k/sram_32b_32k_ssg_cworstt_0p81v_0p81v_125c.db
+set sram_32k_lib_file_tt_0p90v_25c      $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k/sram_32b_32k_tt_ctypical_0p90v_0p90v_25c.lib
+set sram_32k_lib_file_ff_0p99v_m40c     $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k/sram_32b_32k_ffg_cbestt_0p99v_0p99v_m40c.lib
+set sram_32k_db_file_ss_0p81v_125c     $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k/sram_32b_32k_ssg_cworstt_0p81v_0p81v_125c.db
+set sram_32k_db_file_tt_0p90v_25c      $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k/sram_32b_32k_tt_ctypical_0p90v_0p90v_25c.db
+set sram_32k_db_file_ff_0p99v_m40c     $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k/sram_32b_32k_ffg_cbestt_0p99v_0p99v_m40c.db
+
 
 set sram_16k_lef_file                   $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_16k/sram_32b_16k.lef
 set sram_16k_gds_file                   $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_16k/sram_32b_16k.gds2
 set sram_16k_lib_file_ss_0p81v_125c     $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_16k/sram_32b_16k_ssg_cworstt_0p81v_0p81v_125c.lib
+set sram_16k_lib_file_tt_0p90v_25c      $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_16k/sram_32b_16k_tt_ctypical_0p90v_0p90v_25c.lib
+set sram_16k_lib_file_ff_0p99v_m40c     $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_16k/sram_32b_16k_ffg_cbestt_0p99v_0p99v_m40c.lib
 set sram_16k_db_file_ss_0p81v_125c      $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_16k/sram_32b_16k_ssg_cworstt_0p81v_0p81v_125c.db
+set sram_16k_db_file_tt_0p90v_25c       $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_16k/sram_32b_16k_tt_ctypical_0p90v_0p90v_25c.db
+set sram_16k_db_file_ff_0p99v_m40c      $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_16k/sram_32b_16k_ffg_cbestt_0p99v_0p99v_m40c.db
 
 
 # Synopsys PLL files
@@ -44,23 +53,58 @@ set Synopsys_PD_lib_file    $Synopsys_PD_dir/liberty/mr74125_wc_vmin_125c.lib
 set Synopsys_PD_db_file     $Synopsys_PD_dir/db/mr74125_wc_vmin_125c.db
 set Synopsys_PD_gds_file    $Synopsys_PD_dir/gds/mr74125_v1r2.gds
 
+# Synopsys Voltage Monitor files
+set Synopsys_VM_dir /home/dwn1c21/SoC-Labs/Synopsys_ip/IP/Southampton_28hpcp_pd_vm_ts_vmps_pvtc/dwc_sensors_vm_shrink_tsmc28hpcp_1.00a/synopsys/dwc_sensors_vm_shrink_tsmc28hpcp/1.00a
+set Synopsys_VM_lef_file    $Synopsys_VM_dir/lef/mr74140.lef
+set Synopsys_VM_lib_file    $Synopsys_VM_dir/liberty/mr74140_wc_vmin_125c.lib
+set Synopsys_VM_db_file     $Synopsys_VM_dir/db/mr74140_wc_vmin_125c.db
+set Synopsys_VM_gds_file    $Synopsys_VM_dir/gdsii/mr74140_v1r1.gds
 
 create_fusion_lib -dbs [list $sc9mcpp140z_db_file_ss_0p81v_125C $sc9mcpp140z_db_file_tt_0p90v_25C $sc9mcpp140z_db_file_ff_0p99v_m40C]  -lefs [list $cln28ht_lef_file $sc9mcpp140z_lef_file] -technology $cln28ht_tech_file cln28ht
 save_fusion_lib cln28ht
 
 close_fusion_lib cln28ht
 
-read_lib $sram_lib_file 
-write_lib -output $sram_db_file -format db sram_sp_hde_ssg_cworstt_0p81v_0p81v_125c
-close_lib sram_sp_hde_ssg_cworstt_0p81v_0p81v_125c
-create_fusion_lib -dbs $sram_db_file -lefs $sram_lef_file -technology $cln28ht_tech_file sram
-save_fusion_lib sram
-close_fusion_lib sram
+# 32K SRAM
+read_lib $sram_32k_lib_file_ss_0p81v_125c 
+write_lib -output $sram_32k_db_file_ss_0p81v_125c -format db sram_32b_32k_ssg_cworstt_0p81v_0p81v_125c
+close_lib sram_32b_32k_ssg_cworstt_0p81v_0p81v_125c
+
+read_lib $sram_32k_lib_file_tt_0p90v_25c 
+write_lib -output $sram_32k_db_file_tt_0p90v_25c -format db sram_32b_32k_tt_ctypical_0p90v_0p90v_25c
+close_lib sram_32b_32k_tt_ctypical_0p90v_0p90v_25c
+
+read_lib $sram_32k_lib_file_ff_0p99v_m40c 
+write_lib -output $sram_32k_db_file_ff_0p99v_m40c -format db sram_32b_32k_ffg_cbestt_0p99v_0p99v_m40c
+close_lib sram_32b_32k_ffg_cbestt_0p99v_0p99v_m40c
+
+create_fusion_lib -dbs [list $sram_32k_db_file_ss_0p81v_125c $sram_32k_db_file_tt_0p90v_25c $sram_32k_db_file_ff_0p99v_m40c] -lefs $sram_32k_lef_file -technology $cln28ht_tech_file sram_32k
+save_fusion_lib sram_32k
+close_fusion_lib sram_32k
+
+# 16K SRAM
+read_lib $sram_16k_lib_file_ss_0p81v_125c 
+write_lib -output $sram_16k_db_file_ss_0p81v_125c -format db sram_32b_16k_ssg_cworstt_0p81v_0p81v_125c
+close_lib sram_32b_16k_ssg_cworstt_0p81v_0p81v_125c
+
+read_lib $sram_16k_lib_file_tt_0p90v_25c 
+write_lib -output $sram_16k_db_file_tt_0p90v_25c -format db sram_32b_16k_tt_ctypical_0p90v_0p90v_25c
+close_lib sram_32b_16k_tt_ctypical_0p90v_0p90v_25c
 
+read_lib $sram_16k_lib_file_ff_0p99v_m40c 
+write_lib -output $sram_16k_db_file_ff_0p99v_m40c -format db sram_32b_16k_ffg_cbestt_0p99v_0p99v_m40c
+close_lib sram_32b_16k_ffg_cbestt_0p99v_0p99v_m40c
+
+create_fusion_lib -dbs [list $sram_16k_db_file_ss_0p81v_125c $sram_16k_db_file_tt_0p90v_25c $sram_16k_db_file_ff_0p99v_m40c] -lefs $sram_16k_lef_file -technology $cln28ht_tech_file sram_16k
+save_fusion_lib sram_16k
+close_fusion_lib sram_16k
+
+# Synopsys PLL
 create_fusion_lib -dbs $Synopsys_PLL_db_file -lefs $Synopsys_PLL_lef_file -technology $cln28ht_tech_file Synopsys_PLL
 save_fusion_lib Synopsys_PLL
 close_fusion_lib Synopsys_PLL
 
+# Synopsys TS
 read_lib $Synopsys_TS_lib_file
 write_lib -output $Synopsys_TS_db_file -format db mr74127_wc_vmin_125c
 close_lib -all
@@ -68,9 +112,20 @@ create_fusion_lib -dbs $Synopsys_TS_db_file -lefs $Synopsys_TS_lef_file -technol
 save_fusion_lib Synopsys_TS
 close_fusion_lib Synopsys_TS
 
+# Synopsys PD
 read_lib $Synopsys_PD_lib_file
 write_lib -output $Synopsys_PD_db_file -format db mr74125_wc_vmin_125c
 close_lib -all
 create_fusion_lib -dbs $Synopsys_PD_db_file -lefs $Synopsys_PD_lef_file -technology $cln28ht_tech_file Synopsys_PD
 save_fusion_lib Synopsys_PD
 close_fusion_lib Synopsys_PD
+
+# Synopsys VM
+read_lib $Synopsys_VM_lib_file
+write_lib -output $Synopsys_VM_db_file -format db mr74140_wc_vmin_125c
+close_lib -all
+create_fusion_lib -dbs $Synopsys_VM_db_file -lefs $Synopsys_VM_lef_file -technology $cln28ht_tech_file Synopsys_VM
+save_fusion_lib Synopsys_VM
+close_fusion_lib Synopsys_VM
+
+exit
\ No newline at end of file
diff --git a/ASIC/TSMC28nm_HPCP/constraints/sram_chiplet.sdc b/ASIC/TSMC28nm_HPCP/constraints/sram_chiplet.sdc
index 4e60e01..4b2202f 100644
--- a/ASIC/TSMC28nm_HPCP/constraints/sram_chiplet.sdc
+++ b/ASIC/TSMC28nm_HPCP/constraints/sram_chiplet.sdc
@@ -1,5 +1,5 @@
 #-----------------------------------------------------------------------------
-# NanoSoC Constraints for Synthesis 
+# SRAM Chiplet constraints for ASIC
 # A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
 #
 # Contributors
@@ -11,12 +11,23 @@
 
 #### CLOCK DEFINITION
 
-set EXTCLK "clk";
-set_units -time ns;
+set REF_CLK "REF_CLK";
+set TLX_IN_FWD_CLK "TLX_IN_FWD_CLK"
+set TLX_OUT_REV_CLK "TLX_OUT_REV_CLK"
+set SYS_CLK "PLL_CLK"
 
+set_units -time ns;
 set_units -capacitance pF;
-set EXTCLK_PERIOD 1;
-set CLK_ERROR 0.35; #Error calculated from worst case characteristics of CDCM61001 low-jitter oscillator chip at 250MHz
+
+set REF_CLK_PERIOD 4;
+set TLX_IN_FWD_CLK_PERIOD 1;
+set TLX_OUT_REV_CLK_PERIOD 1;
+set SYS_CLK_PERIOD 1;
+
+set CLK_ERROR 0.35; 
 set INTER_CLOCK_UNCERTAINTY 0.1
 
-create_clock -name "$EXTCLK" -period "$EXTCLK_PERIOD" -waveform "0 0.5" [get_ports clk_in]
+create_clock -name "$REF_CLK" -period "$REF_CLK_PERIOD"  [get_ports REF_CLK]
+create_clock -name "$TLX_IN_FWD_CLK" -period "$TLX_IN_FWD_CLK_PERIOD"  [get_ports IN_FWD_CLK]
+create_clock -name "$TLX_OUT_REV_CLK" -period "$TLX_OUT_REV_CLK_PERIOD" [get_ports OUT_REV_CLK]
+create_generated_clock -name "$SYS_CLK" -source [get_ports REF_CLK] -multiply_by 4 [get_pins u_top_sram_chiplet/u_sram_chiplet_apb_subsystem/PLL_CLK1]
\ No newline at end of file
diff --git a/flist/IP/NIC400.flist b/flist/IP/NIC400.flist
index fa0c1bc..5fdd066 100644
--- a/flist/IP/NIC400.flist
+++ b/flist/IP/NIC400.flist
@@ -1,11 +1,13 @@
 +incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_AXI_SRAM/verilog
++incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_AXI_TLX_OUT/verilog
 +incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_apb_group0/verilog
-+incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/asib_AHB_ADP/verilog
++incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/apb_bridge/verilog
 +incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/asib_AXI_CHIPLET_IN/verilog
 +incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog
++incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog
 +incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/default_slave_ds_1/verilog
++incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog
 +incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/reg_slice/verilog
-+incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/nic400/verilog/Axi
 +incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/nic400/verilog/Axi4PC
 +incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/nic400/verilog/ApbPC
 +incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/nic400/verilog/Apb4PC
@@ -19,9 +21,10 @@ $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chip
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_AXI_TLX_OUT/verilog/nic400_amib_AXI_TLX_OUT_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_apb_group0/verilog/nic400_amib_apb_group0_a_gen_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_apb_group0/verilog/nic400_amib_apb_group0_apb_m_sram_chiplet.v
-$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_apb_group0/verilog/nic400_amib_apb_group0_axi_to_itb_sram_chiplet.v
-$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_apb_group0/verilog/nic400_amib_apb_group0_chan_slice_sram_chiplet.verilog
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_apb_group0/verilog/nic400_amib_apb_group0_chan_slice_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/amib_apb_group0/verilog/nic400_amib_apb_group0_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/apb_bridge/verilog/nic400_apb_bridge_master_domain_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/apb_bridge/verilog/nic400_apb_bridge_slave_domain_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/asib_AXI_CHIPLET_IN/verilog/nic400_asib_AXI_CHIPLET_IN_chan_slice_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/asib_AXI_CHIPLET_IN/verilog/nic400_asib_AXI_CHIPLET_IN_decode_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/asib_AXI_CHIPLET_IN/verilog/nic400_asib_AXI_CHIPLET_IN_maskcntl_sram_chiplet.v
@@ -45,7 +48,6 @@ $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chip
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_ml_mlayer_3_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_rd_ss_tt_s0_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_rd_wr_arb_0_sram_chiplet.v
-$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_rd_wr_arb_1_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_rd_wr_arb_2_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_ret_sel_ml0_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_ret_sel_ml1_sram_chiplet.v
@@ -57,7 +59,43 @@ $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chip
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_wr_sel_ml2_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_wr_sel_ml3_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/busmatrix_bm0/verilog/nic400_bm0_wr_ss_tt_s0_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_bypass_sync_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_capt_nosync_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_capt_sync_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_comb_and2_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_comb_mux2_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_comb_or2_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_comb_or3_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_corrupt_gry_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_corrupt_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_launch_data_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_launch_gry_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/cdc_blocks/verilog/nic400_cdc_random_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/default_slave_ds_1/verilog/nic400_default_slave_ds_1_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_a_fifo_rd_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_a_fifo_sync_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_a_fifo_wr_mux2_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_a_fifo_wr_mux_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_a_fifo_wr_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_axi_to_itb_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_cdc_air_corrupt_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_chan_slice_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_d_fifo_rd_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_d_fifo_sync_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_d_fifo_wr_mux2_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_d_fifo_wr_mux_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_d_fifo_wr_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_master_domain_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_slave_domain_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_w_fifo_rd_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_w_fifo_sync_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_w_fifo_wr_mux2_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_w_fifo_wr_mux_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/ib_apb_group0_ib/verilog/nic400_ib_apb_group0_ib_w_fifo_wr_sram_chiplet.v
+
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/nic400/verilog/nic400_cd_clk0_sram_chiplet.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/nic400/verilog/nic400_cd_ref_sram_chiplet.v
+
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/reg_slice/verilog/nic400_ax4_reg_slice_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/reg_slice/verilog/nic400_buf_reg_slice_sram_chiplet.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/nic400_sram_chiplet/logical/nic400_sram_chiplet/reg_slice/verilog/nic400_ful_regd_slice_sram_chiplet.v
diff --git a/flist/Top/sram_chiplet.flist b/flist/Top/sram_chiplet.flist
index 258ec16..c14ebad 100644
--- a/flist/Top/sram_chiplet.flist
+++ b/flist/Top/sram_chiplet.flist
@@ -23,6 +23,7 @@ $(SOCLABS_SRAM_CHIPLET_DIR)/logical/SRAM/glib/verilog/SRAM.v
 
 // SRAM Chiplet - APB subsystem
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/sram_chiplet_apb_subsystem/verilog/sram_chiplet_apb_subsystem.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/sram_chiplet_apb_subsystem/verilog/synchr_clock_mux.v
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_slave_mux/verilog/cmsdk_apb_slave_mux.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/PLL_integration_layer.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/synopsys_PD_sensor_integration.v
diff --git a/flist/Top/sram_chiplet_TSMC28nm.flist b/flist/Top/sram_chiplet_TSMC28nm.flist
index 83f5ae7..71955c9 100644
--- a/flist/Top/sram_chiplet_TSMC28nm.flist
+++ b/flist/Top/sram_chiplet_TSMC28nm.flist
@@ -27,6 +27,7 @@ $(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_16k/sram_32b_16k_emulation.v
 // SRAM Chiplet - APB subsystem
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/sram_chiplet_apb_subsystem/verilog/sram_chiplet_apb_subsystem.v
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_slave_mux/verilog/cmsdk_apb_slave_mux.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/sram_chiplet_apb_subsystem/verilog/synchr_clock_mux.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/PLL_integration_layer.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/synopsys_PD_sensor_integration.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/synopsys_TS_sensor_integration.v
diff --git a/flist/Top/sram_chiplet_TSMC28nm_ASIC.flist b/flist/Top/sram_chiplet_TSMC28nm_ASIC.flist
index 59c67af..ec6f82a 100644
--- a/flist/Top/sram_chiplet_TSMC28nm_ASIC.flist
+++ b/flist/Top/sram_chiplet_TSMC28nm_ASIC.flist
@@ -25,6 +25,7 @@ $(SOCLABS_SRAM_CHIPLET_DIR)/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v
 // SRAM Chiplet - APB subsystem
 $(SOCLABS_SRAM_CHIPLET_DIR)/logical/sram_chiplet_apb_subsystem/verilog/sram_chiplet_apb_subsystem.v
 $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_slave_mux/verilog/cmsdk_apb_slave_mux.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/sram_chiplet_apb_subsystem/verilog/synchr_clock_mux.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/PLL_integration_layer.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/synopsys_PD_sensor_integration.v
 $(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/synopsys_TS_sensor_integration.v
diff --git a/flist/Top/sram_chiplet_vip.flist b/flist/Top/sram_chiplet_vip.flist
index a5803cc..6dcf50b 100644
--- a/flist/Top/sram_chiplet_vip.flist
+++ b/flist/Top/sram_chiplet_vip.flist
@@ -2,4 +2,6 @@
 
 -f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/VIP/NIC400_tb.flist
 
-
+$(SOCLABS_SRAM_CHIPLET_DIR)/socdebug_tech/socket/axi_stream_io/verilog/axi_stream_io.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/socdebug_tech/socket/f232h_ft1248_stream/verilog/f232h_ft1248_stream.v
+$(SOCLABS_SRAM_CHIPLET_DIR)/socdebug_tech/socket/f232h_ft1248_stream/verilog/SYNCHRONIZER_EDGES.v
diff --git a/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v b/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v
index 6f82eb4..6f5ce6d 100644
--- a/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v
+++ b/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v
@@ -2,7 +2,7 @@
 
 module SRAM (
     input  wire             clk,
-    input  wire [20:0]      memaddr,
+    input  wire [19:0]      memaddr,
     input  wire [31:0]      memd,
     output reg [31:0]      memq,
     input  wire             memcen,
@@ -44,7 +44,7 @@ sram_32b_16k u_sram_32b_16k_0(
     .CLK(clk), 
     .CEN(CEN_i[N_MEMS-1]), 
     .GWEN(gwen_i), 
-    .A(memaddr[16:2]), 
+    .A(memaddr[15:2]), 
     .D(memd), 
     .WEN(wena_i), 
     .STOV(1'b0), 
@@ -53,12 +53,12 @@ sram_32b_16k u_sram_32b_16k_0(
     .EMAS(1'b0), 
     .RET1N(1'b1)
 );
-sram_32b_16k u_sram_32b_16k_0(
+sram_32b_16k u_sram_32b_16k_1(
     .Q(q_i[N_MEMS]), 
     .CLK(clk), 
     .CEN(CEN_i[N_MEMS]), 
     .GWEN(gwen_i), 
-    .A(memaddr[16:2]), 
+    .A(memaddr[15:2]), 
     .D(memd), 
     .WEN(wena_i), 
     .STOV(1'b0), 
@@ -70,13 +70,30 @@ sram_32b_16k u_sram_32b_16k_0(
 
 integer j;
 always @(*) begin 
-    for(j=0; j<N_MEMS; j=j+1) begin
+    for(j=0; j<N_MEMS-1; j=j+1) begin
         if(j==memaddr[(SEL_W+17-1):17])
             CEN_i[j] = memcen;
         else
             CEN_i[j] = 1'b1;
     end
-    memq = q_i[memaddr[(SEL_W+17-1):17]];
+    if(memaddr[SEL_W+16:17]==3'h7) begin
+        if(memaddr[16]==1'b0) begin
+            CEN_i[N_MEMS-1]=memcen;
+            CEN_i[N_MEMS]=1'b1;
+        end
+        else begin
+            CEN_i[N_MEMS]=memcen;
+            CEN_i[N_MEMS-1]=1'b1;
+        end
+    end else
+        CEN_i[N_MEMS:N_MEMS-1]=2'b11;
+    if(memaddr[19:17]==3'h7) begin
+        if(memaddr[16]==1'b1) 
+            memq=q_i[N_MEMS];
+        else
+            memq=q_i[N_MEMS-1];
+    end else 
+        memq = q_i[memaddr[(SEL_W+17-1):17]];
 end
 
 endmodule
diff --git a/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v b/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v
index b5bc425..9e41377 100644
--- a/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v
+++ b/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v
@@ -76,7 +76,7 @@ module SRAM_wrapper(
 );
 
 
-wire [20:0]     memaddr;
+wire [19:0]     memaddr;
 wire [31:0]    memd;
 wire [31:0]    memq;
 wire            memcen;
@@ -88,7 +88,7 @@ sie300_axi5_sram_ctrl_sram_chiplet u_SMC(
     .awvalid_s(AWVALID),
     .awready_s(AWREADY),
     .awid_s(AWID),
-    .awaddr_s(AWADDR[20:0]),
+    .awaddr_s(AWADDR[19:0]),
     .awlen_s(AWLEN),
     .awsize_s(AWSIZE),
     .awburst_s(AWBURST),
@@ -108,7 +108,7 @@ sie300_axi5_sram_ctrl_sram_chiplet u_SMC(
     .arvalid_s(ARVALID),
     .arready_s(ARREADY),
     .arid_s(ARID),
-    .araddr_s(ARADDR[20:0]),
+    .araddr_s(ARADDR[19:0]),
     .arlen_s(ARLEN),
     .arsize_s(ARSIZE),
     .arburst_s(ARBURST),
diff --git a/logical/SRAM/glib/verilog/SRAM.v b/logical/SRAM/glib/verilog/SRAM.v
index a7ec6e0..d3474c4 100644
--- a/logical/SRAM/glib/verilog/SRAM.v
+++ b/logical/SRAM/glib/verilog/SRAM.v
@@ -2,13 +2,13 @@
 
 module SRAM (
     input  wire           clk,
-    input  wire [20:0]    memaddr,
+    input  wire [19:0]    memaddr,
     input  wire [31:0]   memd,
     output wire [31:0]   memq,
     input  wire           memcen,
     input  wire [3:0]    memwen
 );
-  parameter MEM_DEPTH = 253952;
+  parameter MEM_DEPTH = 262144;
 
   wire                WriteEnable;        // Write data update
   wire   [17:0]       Addr;
@@ -19,7 +19,7 @@ module SRAM (
 
   integer                  i;     // Write-strobe loop variable
   integer                  j;     // Mask-bit loop variable
-  assign Addr = memaddr[20:2];
+  assign Addr = memaddr[19:2];
   // -------------
   // Memory arrays
   // -------------
@@ -29,11 +29,11 @@ module SRAM (
   assign WriteEnable = (memwen != {4{1'b1}}) ? 1'b1 : 1'b0;
 
 `ifdef INITIALIZE_MEMORY
-  integer i;
+  integer k;
   initial begin
     #0;
-    for(i=0;i < MEM_DEPTH;i = i + 1) 
-      mem[i] = {32{1'b0}};
+    for(k=0;k < MEM_DEPTH;k = k + 1) 
+      mem[k] = {32{1'b0}};
   end
 `endif
 
diff --git a/logical/SRAM/glib/verilog/SRAM_wrapper.v b/logical/SRAM/glib/verilog/SRAM_wrapper.v
index b5bc425..9e41377 100644
--- a/logical/SRAM/glib/verilog/SRAM_wrapper.v
+++ b/logical/SRAM/glib/verilog/SRAM_wrapper.v
@@ -76,7 +76,7 @@ module SRAM_wrapper(
 );
 
 
-wire [20:0]     memaddr;
+wire [19:0]     memaddr;
 wire [31:0]    memd;
 wire [31:0]    memq;
 wire            memcen;
@@ -88,7 +88,7 @@ sie300_axi5_sram_ctrl_sram_chiplet u_SMC(
     .awvalid_s(AWVALID),
     .awready_s(AWREADY),
     .awid_s(AWID),
-    .awaddr_s(AWADDR[20:0]),
+    .awaddr_s(AWADDR[19:0]),
     .awlen_s(AWLEN),
     .awsize_s(AWSIZE),
     .awburst_s(AWBURST),
@@ -108,7 +108,7 @@ sie300_axi5_sram_ctrl_sram_chiplet u_SMC(
     .arvalid_s(ARVALID),
     .arready_s(ARREADY),
     .arid_s(ARID),
-    .araddr_s(ARADDR[20:0]),
+    .araddr_s(ARADDR[19:0]),
     .arlen_s(ARLEN),
     .arsize_s(ARSIZE),
     .arburst_s(ARBURST),
diff --git a/logical/sram_chiplet_apb_subsystem/verilog/sram_chiplet_apb_subsystem.v b/logical/sram_chiplet_apb_subsystem/verilog/sram_chiplet_apb_subsystem.v
index 566c48a..902b6b0 100644
--- a/logical/sram_chiplet_apb_subsystem/verilog/sram_chiplet_apb_subsystem.v
+++ b/logical/sram_chiplet_apb_subsystem/verilog/sram_chiplet_apb_subsystem.v
@@ -1,9 +1,33 @@
+//-----------------------------------------------------------------------------
+// SRAM APB subsystem Wrapper
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// Daniel Newbrook (d.newbrook@soton.ac.uk)
+// 
+// Copyright � 2021-4, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+// Takes as input a FT1248 interface from offchip and uses the soclabs ADP Controller
+// to control an AHB master. AHB to APB, then APB MUX
+//
+// Modules instantiated:
+//  cmsdk_apb_slave_mux
+//  synopsys_TS_sensor_integration
+//  synopsys_PD_sensor_integration
+//  synopsys_VM_sensor_integration
+//  snps_PLL_integration_layer
+
 
 module sram_chiplet_apb_subsystem(
     input  wire         ref_clk,
-    input  wire         PCLK,
     input  wire         aRESETn,
 
+    output wire         PLL_CLK1,
+    output wire         PLL_CLK2,
+    output wire         pll_lock,
+
+
     input  wire [31:0]  PADDR_APB_PVT,
     input  wire [31:0]  PWDATA_APB_PVT,
     input  wire         PWRITE_APB_PVT,
@@ -152,7 +176,7 @@ cmsdk_apb_slave_mux #(
 
 generate if(SNPS_PVT_TS_0_ENABLE==1)begin: gen_snps_PVT_ts0
     synopsys_TS_sensor_integration u_snps_PVT_ts0(
-        .PCLK(PCLK),
+        .PCLK(ref_clk),
         .aRESETn(aRESETn),
 
         .PSELx(snps_PVT_ts0_psel),     
@@ -183,7 +207,7 @@ end endgenerate
 
 generate if(SNPS_PVT_PD_0_ENABLE==1)begin: gen_snps_PVT_pd0
     synopsys_PD_sensor_integration u_snps_PVT_pd0(
-        .PCLK(PCLK),
+        .PCLK(ref_clk),
         .aRESETn(aRESETn),
         .PSELx(snps_PVT_pd0_psel),     
         .PADDR(PADDR_APB_PVT[3:2]),    
@@ -214,6 +238,9 @@ end else begin: gen_no_snps_PVT_vm0
     assign irq_vm_rdy = 1'b0;
 end endgenerate
 
+wire pll_clk1_i;
+wire pll_clk2_i;
+
 generate if(SNPS_PLL_ENABLE==1)begin: gen_snps_PLL
     snps_PLL_integration_layer #(
         .DEFAULT_FBDIV(7'h08),  // Multiply by 8 (250*8 = 2 GHz)
@@ -223,12 +250,12 @@ generate if(SNPS_PLL_ENABLE==1)begin: gen_snps_PLL
         .DEFAULT_R(6'h07),          // Divier  = 8 (out 250 MHz)
         .DEFAULT_PREDIV(5'h00)      // Pre div = 2 (250/1 = 250 MHz)
     ) u_snps_PLL(
-        .ref_clk(PCLK),
+        .ref_clk(ref_clk),
         .resetn(aRESETn),
-        .pll_lock(),
+        .pll_lock(pll_lock),
 
-        .out_clk1(),
-        .out_clk2(),
+        .out_clk1(pll_clk1_i),
+        .out_clk2(pll_clk2_i),
 
         .PSELx(snps_PLL_psel),     
         .PADDR(PADDR_APB_PVT[11:2]),    
@@ -241,11 +268,30 @@ generate if(SNPS_PLL_ENABLE==1)begin: gen_snps_PLL
         .PREADY(snps_PLL_pready),   
         .PSLVERR(snps_PLL_pslverr)
     );
+
 end else begin: gen_no_snps_PLL
     assign snps_PLL_prdata = {32{1'b0}};
     assign snps_PLL_pready = 1'b1;
     assign snps_PLL_pslverr = 1'b1;
+    assign pll_lock = 1'b0;
 end endgenerate
 
+synchr_clock_mux u_sync_clock_mux_1(
+    .aresetn(aRESETn),
+    .clk_1(ref_clk),
+    .clk_2(pll_clk1_i),
+    .sel(pll_lock),
+    .out_clk(PLL_CLK1)
+);
+
+synchr_clock_mux u_sync_clock_mux_2(
+    .aresetn(aRESETn),
+    .clk_1(ref_clk),
+    .clk_2(pll_clk2_i),
+    .sel(pll_lock),
+    .out_clk(PLL_CLK2)
+);
+
+
 
 endmodule
\ No newline at end of file
diff --git a/logical/sram_chiplet_apb_subsystem/verilog/synchr_clock_mux.v b/logical/sram_chiplet_apb_subsystem/verilog/synchr_clock_mux.v
new file mode 100644
index 0000000..aa53d8c
--- /dev/null
+++ b/logical/sram_chiplet_apb_subsystem/verilog/synchr_clock_mux.v
@@ -0,0 +1,56 @@
+
+module synchr_clock_mux(
+    input  wire     aresetn,
+    input  wire     clk_1,
+    input  wire     clk_2,
+    input  wire     sel,
+    output wire     out_clk
+);
+
+
+wire i_and1;
+wire i_and2;
+wire o_and1;
+wire o_and2;
+
+reg [1:0] sync_clk1;
+reg [1:0] sync_clk2;
+
+assign i_and1 = (~sel) & (~sync_clk2[1]);
+assign i_and2 = sel & (~sync_clk1[1]);
+assign o_and1 = sync_clk1[1] & clk_1;
+assign o_and2 = sync_clk2[1] & clk_2;
+
+always @(posedge clk_1 or negedge aresetn) begin
+    if(~aresetn)
+        sync_clk1[0] <= 1'b1;
+    else 
+        sync_clk1[0] <= i_and1;
+end
+
+always @(negedge clk_1 or negedge aresetn) begin
+    if(~aresetn)
+        sync_clk1[1]<= 1'b1;
+    else 
+        sync_clk1[1] <= sync_clk1[0];
+end
+
+always @(posedge clk_2 or negedge aresetn) begin
+    if(~aresetn)
+        sync_clk2[0] <= 1'b0;
+    else 
+        sync_clk2[0] <= i_and2;
+end
+
+
+always @(negedge clk_2 or negedge aresetn) begin
+    if(~aresetn)
+        sync_clk2[1] <= 1'b0;
+    else 
+        sync_clk2[1] <= sync_clk2[0];
+end
+
+assign out_clk = o_and1 | o_and2;
+
+
+endmodule
\ No newline at end of file
diff --git a/logical/top_sram_chiplet/verilog/top_sram_chiplet.sv b/logical/top_sram_chiplet/verilog/top_sram_chiplet.sv
index 34510f4..2ad8a5c 100644
--- a/logical/top_sram_chiplet/verilog/top_sram_chiplet.sv
+++ b/logical/top_sram_chiplet/verilog/top_sram_chiplet.sv
@@ -17,13 +17,21 @@
 
 `include "tlx_interfaces.sv"
 
-module top_sram_chiplet(
+module top_sram_chiplet #(
+    parameter N_ADDR_SEL_BITS = 6
+    )(
     // Clock and reset
-    input  wire         SYS_CLK,
-    input  wire         DL_FWD_CLK,
-    output wire         DL_REV_CLK,
+    input  wire         REF_CLK,
     input  wire         aRESETn,
     input  wire         DL_FWD_RESETn,
+    input  wire         IN_FWD_CLK,
+    output wire         IN_REV_CLK,
+    output wire         OUT_FWD_CLK,
+    input  wire         OUT_REV_CLK,
+    output wire         OUT_CLK,
+    output wire         PLL_LOCK_o,
+    input  wire         PLL_LOCK_i,
+
     // Thin links interface Input
     TLX_AXI_stream.out  TLX_IN_data_rev,
     TLX_AXI_stream.out  TLX_IN_flow_rev,
@@ -36,15 +44,14 @@ module top_sram_chiplet(
     TLX_AXI_stream.out  TLX_OUT_flow_fwd,
     TLX_AXI_stream.out  TLX_OUT_data_fwd,
     
-    // FT1248 
-
-
     // Address Select pins
-    input  wire [2:0]   addr_sel
+    input  wire [N_ADDR_SEL_BITS-1:0]   addr_sel
 
     
 );
 
+wire SYS_CLK;
+
 // Main Bus Wires
 // - SRAM AXI wires
 wire [3:0]  AWID_AXI_SRAM;
@@ -195,6 +202,8 @@ nic400_cd_pl_rev_M1_m_tlx_tlx_sram_chiplet u_cd_pl_rev_M1_m_tlx(
     .pl_rev_M1_m_tlxresetn(aRESETn)
 );
 
+assign IN_REV_CLK = SYS_CLK; 
+assign OUT_FWD_CLK = SYS_CLK;
 nic400_master_pwr_M1_m_tlx_tlx_sram_chiplet u_master_pwr_M1_m_tlx(
     // AXI manager power
     .awid_m1_m_m(AWID_AXI_CHIPLET_IN),
@@ -257,7 +266,7 @@ nic400_master_pwr_M1_m_tlx_tlx_sram_chiplet u_master_pwr_M1_m_tlx(
     .clk_mclk(SYS_CLK),
     .clk_mresetn(aRESETn),
     // DL clock
-    .dl_fwd_M1_m_tlxclk(DL_FWD_CLK),
+    .dl_fwd_M1_m_tlxclk(IN_FWD_CLK),
     .dl_fwd_M1_m_tlxresetn(DL_FWD_RESETn)
 );
 
@@ -265,8 +274,8 @@ nic400_master_pwr_M1_m_tlx_tlx_sram_chiplet u_master_pwr_M1_m_tlx(
 wire [31:0] AWADDR_AXI_CHIPLET_IN_i;
 wire [31:0] ARADDR_AXI_CHIPLET_IN_i;
 
-assign AWADDR_AXI_CHIPLET_IN_i = (AWADDR_AXI_CHIPLET_IN[23:21]==addr_sel[2:0]) ? {11'h000,AWADDR_AXI_CHIPLET_IN[20:0]} : AWADDR_AXI_CHIPLET_IN;
-assign ARADDR_AXI_CHIPLET_IN_i = (ARADDR_AXI_CHIPLET_IN[23:21]==addr_sel[2:0]) ? {11'h000,ARADDR_AXI_CHIPLET_IN[20:0]} : ARADDR_AXI_CHIPLET_IN;
+assign AWADDR_AXI_CHIPLET_IN_i = (AWADDR_AXI_CHIPLET_IN[20+:N_ADDR_SEL_BITS]==addr_sel[0+:N_ADDR_SEL_BITS]) ? {AWADDR_AXI_CHIPLET_IN[31:(20+N_ADDR_SEL_BITS)],{N_ADDR_SEL_BITS{1'b0}},AWADDR_AXI_CHIPLET_IN[19:0]} : AWADDR_AXI_CHIPLET_IN;
+assign ARADDR_AXI_CHIPLET_IN_i = (ARADDR_AXI_CHIPLET_IN[20+:N_ADDR_SEL_BITS]==addr_sel[0+:N_ADDR_SEL_BITS]) ? {ARADDR_AXI_CHIPLET_IN[31:(20+N_ADDR_SEL_BITS)],{N_ADDR_SEL_BITS{1'b0}},ARADDR_AXI_CHIPLET_IN[19:0]} : ARADDR_AXI_CHIPLET_IN;
 
 nic400_sram_chiplet u_nic400_sram_chiplet(
     .AWID_AXI_SRAM(AWID_AXI_SRAM),
@@ -390,7 +399,10 @@ nic400_sram_chiplet u_nic400_sram_chiplet(
 
     .clk0clk(SYS_CLK),
     .clk0clken(1'b1),
-    .clk0resetn(aRESETn)
+    .clk0resetn(aRESETn),
+    .refclk(SYS_CLK),
+    .refclken(1'b1),
+    .refresetn(aRESETn)
 );
 
 // Thin links output
@@ -457,7 +469,7 @@ nic400_slave_pwr_M1_m_tlx_tlx_sram_chiplet u_slave_pwd_M1_m_tlx(
 
     .clk_sclk(SYS_CLK),
     .clk_sresetn(aRESETn),
-    .dl_rev_M1_m_tlxclk(SYS_CLK),
+    .dl_rev_M1_m_tlxclk(OUT_REV_CLK),
     .dl_rev_M1_m_tlxresetn(aRESETn)
 );
 
@@ -487,9 +499,13 @@ nic400_cd_pl_fwd_M1_m_tlx_tlx_sram_chiplet u_pl_fwd_M1_m_tlx_m(
 
 );
 
+wire PLL_LOCK;
 sram_chiplet_apb_subsystem u_sram_chiplet_apb_subsystem(
-    .PCLK(SYS_CLK),
+    .ref_clk(REF_CLK),
+    .PLL_CLK1(SYS_CLK),
+    .PLL_CLK2(OUT_CLK),
     .aRESETn(aRESETn),
+    .pll_lock(PLL_LOCK),
     .PADDR_APB_PVT(PADDR_APB_PVT),
     .PWDATA_APB_PVT(PWDATA_APB_PVT),
     .PWRITE_APB_PVT(PWRITE_APB_PVT),
@@ -502,6 +518,8 @@ sram_chiplet_apb_subsystem u_sram_chiplet_apb_subsystem(
     .PREADY_APB_PVT(PREADY_APB_PVT)
 );
 
+assign PLL_LOCK_o = PLL_LOCK & PLL_LOCK_i;
+
 SRAM_wrapper u_SRAM_wrapper(
     .ACLK(SYS_CLK),
     .ARESETn(aRESETn),
diff --git a/pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv b/pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv
index e344f36..9ff678c 100644
--- a/pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv
+++ b/pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv
@@ -17,8 +17,16 @@ module SRAM_chiplet(
     inout wire      VDD,
     inout wire      VSS,
 `endif 
-    input  wire         clk_in,
-    input  wire         aresetn,
+    input  wire         REF_CLK,
+    input  wire         aRESETn,
+    input  wire         DL_FWD_RESETn,
+    input  wire         IN_FWD_CLK,
+    output wire         IN_REV_CLK,
+    output wire         OUT_FWD_CLK,
+    input  wire         OUT_REV_CLK,
+    output wire         OUT_CLK,
+    output wire         PLL_LOCK_o,
+    input  wire         PLL_LOCK_i,
 
     // TLX_IN_data_rev_0 tlx out
     output wire [15:0]  TLX_IN_data_rev_0_tdata, 
@@ -58,7 +66,9 @@ module SRAM_chiplet(
     // tlx out
     output wire [15:0]  TLX_data_fwd_1_tdata,
     output wire         TLX_data_fwd_1_tvalid,
-    input  wire         TLX_data_fwd_1_tready
+    input  wire         TLX_data_fwd_1_tready,
+
+    input  wire [5:0]   addr_sel
 );
 
 
@@ -117,12 +127,17 @@ assign TLX_data_fwd_1.tready    = TLX_data_fwd_1_tready;
 
 
 top_sram_chiplet u_top_sram_chiplet(
-    .SYS_CLK(clk_in),
-    .DL_FWD_CLK(clk_in),
-    .DL_REV_CLK(DL_REV_CLK),
-
-    .aRESETn(aresetn),
-    .DL_FWD_RESETn(aresetn),
+    .REF_CLK(REF_CLK),
+    .aRESETn(aRESETn),
+    .DL_FWD_RESETn(DL_FWD_RESETn),
+
+    .IN_FWD_CLK(IN_FWD_CLK),
+    .IN_REV_CLK(IN_REV_CLK),
+    .OUT_FWD_CLK(OUT_FWD_CLK),
+    .OUT_REV_CLK(OUT_REV_CLK),
+    .OUT_CLK(OUT_CLK),
+    .PLL_LOCK_o(PLL_LOCK_o),
+    .PLL_LOCK_i(PLL_LOCK_i),
 
     // Thin Links In
     .TLX_IN_data_rev(TLX_IN_data_rev_0),
@@ -135,11 +150,8 @@ top_sram_chiplet u_top_sram_chiplet(
     .TLX_OUT_flow_fwd(TLX_flow_fwd_1),
     .TLX_OUT_data_fwd(TLX_data_fwd_1),
     
-    // FT1248 
-
-
     // Address Select pins
-    .addr_sel(3'b000)
+    .addr_sel(addr_sel)
 );
 
 endmodule
\ No newline at end of file
diff --git a/socrates/BP301_SRAM/config/SRAM_ctrl.yaml b/socrates/BP301_SRAM/config/SRAM_ctrl.yaml
index ec3ef9f..b539c5e 100644
--- a/socrates/BP301_SRAM/config/SRAM_ctrl.yaml
+++ b/socrates/BP301_SRAM/config/SRAM_ctrl.yaml
@@ -49,7 +49,7 @@ CONFIG_NAME: sram_chiplet
 # ADDR_WIDTH: AXI5 Address Bus width
 #     Valid values:
 #         14-24
-ADDR_WIDTH: 21
+ADDR_WIDTH: 20
 
 
 #
diff --git a/socrates/nic400_sram_chiplet/nic400_sram_chiplet.xml b/socrates/nic400_sram_chiplet/nic400_sram_chiplet.xml
index b34056c..aba6940 100644
--- a/socrates/nic400_sram_chiplet/nic400_sram_chiplet.xml
+++ b/socrates/nic400_sram_chiplet/nic400_sram_chiplet.xml
@@ -44,15 +44,27 @@
           <ClockDomainType>physical</ClockDomainType>
           <PowerDomainRef>pd0</PowerDomainRef>
         </ClockDomain>
+        <ClockDomain>
+          <Name>ref</Name>
+          <ClockDomainType>physical</ClockDomainType>
+          <PowerDomainRef>pd0</PowerDomainRef>
+        </ClockDomain>
       </ClockDomains>
-      <ClockRelations/>
+      <ClockRelations>
+        <ClockRelation>
+          <ClockRef1>ref</ClockRef1>
+          <ClockRef2>clk0</ClockRef2>
+          <Relationship>asynchronous</Relationship>
+          <Programmable>false</Programmable>
+        </ClockRelation>
+      </ClockRelations>
     </Domains>
     <Groups>
       <ExternalGroups/>
       <APBGroups>
         <APBGroup>
           <Name>apb_group0</Name>
-          <ClockRef>clk0</ClockRef>
+          <ClockRef>ref</ClockRef>
           <ReadIssuingAPB>1</ReadIssuingAPB>
           <WriteIssuingAPB>1</WriteIssuingAPB>
           <TotalIssuingAPB>1</TotalIssuingAPB>
@@ -103,17 +115,6 @@
         <GeographicDomainRef>gd0</GeographicDomainRef>
         <ClockRef>clk0</ClockRef>
       </MasterInterface>
-      <MasterInterface>
-        <Name>APB_PVT</Name>
-        <APB4MasterProtocol>
-          <AddressWidth>32</AddressWidth>
-          <DataWidth>32</DataWidth>
-          <TrustZoneMasterAPB>non_secure</TrustZoneMasterAPB>
-          <APBGroupRef>apb_group0</APBGroupRef>
-        </APB4MasterProtocol>
-        <GeographicDomainRef>gd0</GeographicDomainRef>
-        <ClockRef>clk0</ClockRef>
-      </MasterInterface>
       <MasterInterface>
         <Name>AXI_TLX_OUT</Name>
         <AXI4MasterProtocol>
@@ -133,6 +134,17 @@
         <GeographicDomainRef>gd0</GeographicDomainRef>
         <ClockRef>clk0</ClockRef>
       </MasterInterface>
+      <MasterInterface>
+        <Name>APB_PVT</Name>
+        <APB4MasterProtocol>
+          <AddressWidth>32</AddressWidth>
+          <DataWidth>32</DataWidth>
+          <TrustZoneMasterAPB>non_secure</TrustZoneMasterAPB>
+          <APBGroupRef>apb_group0</APBGroupRef>
+        </APB4MasterProtocol>
+        <GeographicDomainRef>gd0</GeographicDomainRef>
+        <ClockRef>clk0</ClockRef>
+      </MasterInterface>
     </Interfaces>
     <MemoryMaps>
       <MemoryMap>
@@ -143,19 +155,19 @@
         <MappedBlock>
           <InterfaceRef>AXI_SRAM</InterfaceRef>
           <Offset>0</Offset>
-          <Range>2031616</Range>
+          <Range>1048576</Range>
           <Visibility>true</Visibility>
         </MappedBlock>
         <MappedBlock>
-          <InterfaceRef>APB_PVT</InterfaceRef>
-          <Offset>2031616</Offset>
-          <Range>65536</Range>
+          <InterfaceRef>AXI_TLX_OUT</InterfaceRef>
+          <Offset>1048576</Offset>
+          <Range>66060288</Range>
           <Visibility>true</Visibility>
         </MappedBlock>
         <MappedBlock>
-          <InterfaceRef>AXI_TLX_OUT</InterfaceRef>
-          <Offset>2097152</Offset>
-          <Range>16777216</Range>
+          <InterfaceRef>APB_PVT</InterfaceRef>
+          <Offset>67108864</Offset>
+          <Range>67108864</Range>
           <Visibility>true</Visibility>
         </MappedBlock>
       </MemoryMap>
@@ -170,10 +182,10 @@
             <InterfaceRef>AXI_SRAM</InterfaceRef>
           </Target>
           <Target>
-            <InterfaceRef>APB_PVT</InterfaceRef>
+            <InterfaceRef>AXI_TLX_OUT</InterfaceRef>
           </Target>
           <Target>
-            <InterfaceRef>AXI_TLX_OUT</InterfaceRef>
+            <InterfaceRef>APB_PVT</InterfaceRef>
           </Target>
         </Targets>
       </Path>
@@ -213,12 +225,18 @@
     &lt;/global&gt;
     &lt;clocks&gt;
         &lt;domain freq=&quot;100&quot;&gt;clk0&lt;/domain&gt;
+        &lt;domain freq=&quot;100&quot;&gt;ref&lt;/domain&gt;
+        &lt;relationship&gt;
+            &lt;clock0&gt;ref&lt;/clock0&gt;
+            &lt;clock1&gt;clk0&lt;/clock1&gt;
+            &lt;clock_boundary&gt;async&lt;/clock_boundary&gt;
+        &lt;/relationship&gt;
     &lt;/clocks&gt;
     &lt;asib&gt;
         &lt;address_ranges&gt;
             &lt;name&gt;mm0&lt;/name&gt;
             &lt;range&gt;
-                &lt;addr_max&gt;0x1EFFFF&lt;/addr_max&gt;
+                &lt;addr_max&gt;0xFFFFF&lt;/addr_max&gt;
                 &lt;addr_min&gt;0x0&lt;/addr_min&gt;
                 &lt;remap&gt;
                     &lt;bit&gt;default&lt;/bit&gt;
@@ -228,23 +246,23 @@
                 &lt;/remap&gt;
             &lt;/range&gt;
             &lt;range&gt;
-                &lt;addr_max&gt;0x1FFFFF&lt;/addr_max&gt;
-                &lt;addr_min&gt;0x1F0000&lt;/addr_min&gt;
+                &lt;addr_max&gt;0x3FFFFFF&lt;/addr_max&gt;
+                &lt;addr_min&gt;0x100000&lt;/addr_min&gt;
                 &lt;remap&gt;
                     &lt;bit&gt;default&lt;/bit&gt;
                     &lt;present&gt;true&lt;/present&gt;
                     &lt;region&gt;0&lt;/region&gt;
-                    &lt;target&gt;APB_PVT&lt;/target&gt;
+                    &lt;target&gt;AXI_TLX_OUT&lt;/target&gt;
                 &lt;/remap&gt;
             &lt;/range&gt;
             &lt;range&gt;
-                &lt;addr_max&gt;0x11FFFFF&lt;/addr_max&gt;
-                &lt;addr_min&gt;0x200000&lt;/addr_min&gt;
+                &lt;addr_max&gt;0x7FFFFFF&lt;/addr_max&gt;
+                &lt;addr_min&gt;0x4000000&lt;/addr_min&gt;
                 &lt;remap&gt;
                     &lt;bit&gt;default&lt;/bit&gt;
                     &lt;present&gt;true&lt;/present&gt;
                     &lt;region&gt;0&lt;/region&gt;
-                    &lt;target&gt;AXI_TLX_OUT&lt;/target&gt;
+                    &lt;target&gt;APB_PVT&lt;/target&gt;
                 &lt;/remap&gt;
             &lt;/range&gt;
         &lt;/address_ranges&gt;
@@ -628,8 +646,8 @@
             &lt;y&gt;0&lt;/y&gt;
         &lt;/apb_port&gt;
         &lt;apb_slave_no&gt;63&lt;/apb_slave_no&gt;
-        &lt;clock_boundary&gt;none&lt;/clock_boundary&gt;
-        &lt;clock_domain_name_master_if&gt;clk0&lt;/clock_domain_name_master_if&gt;
+        &lt;clock_boundary&gt;async&lt;/clock_boundary&gt;
+        &lt;clock_domain_name_master_if&gt;ref&lt;/clock_domain_name_master_if&gt;
         &lt;clock_domain_name_slave_if&gt;clk0&lt;/clock_domain_name_slave_if&gt;
         &lt;compress_id def=&quot;true&quot;&gt;false&lt;/compress_id&gt;
         &lt;dest_type&gt;peripheral&lt;/dest_type&gt;
@@ -640,6 +658,27 @@
         &lt;name&gt;apb_group0&lt;/name&gt;
         &lt;protocol&gt;apb&lt;/protocol&gt;
         &lt;qv_out&gt;false&lt;/qv_out&gt;
+        &lt;reg&gt;
+            &lt;depth&gt;2&lt;/depth&gt;
+            &lt;impl&gt;present&lt;/impl&gt;
+            &lt;location&gt;boundary&lt;/location&gt;
+            &lt;name&gt;a&lt;/name&gt;
+            &lt;type&gt;fifo&lt;/type&gt;
+        &lt;/reg&gt;
+        &lt;reg&gt;
+            &lt;depth&gt;2&lt;/depth&gt;
+            &lt;impl&gt;present&lt;/impl&gt;
+            &lt;location&gt;boundary&lt;/location&gt;
+            &lt;name&gt;w&lt;/name&gt;
+            &lt;type&gt;fifo&lt;/type&gt;
+        &lt;/reg&gt;
+        &lt;reg&gt;
+            &lt;depth&gt;2&lt;/depth&gt;
+            &lt;impl&gt;present&lt;/impl&gt;
+            &lt;location&gt;boundary&lt;/location&gt;
+            &lt;name&gt;d&lt;/name&gt;
+            &lt;type&gt;fifo&lt;/type&gt;
+        &lt;/reg&gt;
         &lt;reg&gt;
             &lt;impl def=&quot;true&quot;&gt;absent&lt;/impl&gt;
             &lt;location&gt;slave_port&lt;/location&gt;
@@ -688,28 +727,8 @@
             &lt;name&gt;w&lt;/name&gt;
             &lt;type def=&quot;true&quot;&gt;full&lt;/type&gt;
         &lt;/reg&gt;
-        &lt;reg&gt;
-            &lt;depth def=&quot;true&quot;&gt;2&lt;/depth&gt;
-            &lt;impl def=&quot;true&quot;&gt;absent&lt;/impl&gt;
-            &lt;location&gt;boundary&lt;/location&gt;
-            &lt;name&gt;a&lt;/name&gt;
-            &lt;type&gt;fifo&lt;/type&gt;
-        &lt;/reg&gt;
-        &lt;reg&gt;
-            &lt;depth def=&quot;true&quot;&gt;2&lt;/depth&gt;
-            &lt;impl def=&quot;true&quot;&gt;absent&lt;/impl&gt;
-            &lt;location&gt;boundary&lt;/location&gt;
-            &lt;name&gt;d&lt;/name&gt;
-            &lt;type&gt;fifo&lt;/type&gt;
-        &lt;/reg&gt;
-        &lt;reg&gt;
-            &lt;depth def=&quot;true&quot;&gt;2&lt;/depth&gt;
-            &lt;impl def=&quot;true&quot;&gt;absent&lt;/impl&gt;
-            &lt;location&gt;boundary&lt;/location&gt;
-            &lt;name&gt;w&lt;/name&gt;
-            &lt;type&gt;fifo&lt;/type&gt;
-        &lt;/reg&gt;
         &lt;slave_if_data_width&gt;32&lt;/slave_if_data_width&gt;
+        &lt;tide&gt;0&lt;/tide&gt;
         &lt;token_prerequest def=&quot;true&quot;&gt;false&lt;/token_prerequest&gt;
         &lt;token_prerequest_bridge def=&quot;true&quot;&gt;false&lt;/token_prerequest_bridge&gt;
         &lt;trustzone&gt;nsec&lt;/trustzone&gt;
@@ -1017,11 +1036,11 @@
         &lt;link&gt;
             &lt;slave_if&gt;
                 &lt;name&gt;AXI_CHIPLET_IN&lt;/name&gt;
-                &lt;master_if&gt;AXI_TLX_OUT&lt;/master_if&gt;
                 &lt;master_if&gt;AXI_SRAM&lt;/master_if&gt;
+                &lt;master_if&gt;AXI_TLX_OUT&lt;/master_if&gt;
+                &lt;master_if&gt;apb_group0&lt;/master_if&gt;
                 &lt;master_if&gt;APB_PVT&lt;parent&gt;apb_group0&lt;/parent&gt;
                 &lt;/master_if&gt;
-                &lt;master_if&gt;apb_group0&lt;/master_if&gt;
             &lt;/slave_if&gt;
         &lt;/link&gt;
     &lt;/architecture&gt;
diff --git a/socrates/nic400_tb/nic400_tb.xml b/socrates/nic400_tb/nic400_tb.xml
index 5798eaf..5949711 100644
--- a/socrates/nic400_tb/nic400_tb.xml
+++ b/socrates/nic400_tb/nic400_tb.xml
@@ -104,7 +104,7 @@
         <MappedBlock>
           <InterfaceRef>AXI_CHIPLET_OUT</InterfaceRef>
           <Offset>0</Offset>
-          <Range>16777216</Range>
+          <Range>536870912</Range>
           <Visibility>true</Visibility>
           <Region>0</Region>
         </MappedBlock>
@@ -162,7 +162,7 @@
         &lt;address_ranges&gt;
             &lt;name&gt;mm0&lt;/name&gt;
             &lt;range&gt;
-                &lt;addr_max&gt;0xFFFFFF&lt;/addr_max&gt;
+                &lt;addr_max&gt;0x1FFFFFFF&lt;/addr_max&gt;
                 &lt;addr_min&gt;0x0&lt;/addr_min&gt;
                 &lt;remap&gt;
                     &lt;bit&gt;default&lt;/bit&gt;
diff --git a/synopsys_28nm_slm_integration b/synopsys_28nm_slm_integration
index e9f59a1..5ece300 160000
--- a/synopsys_28nm_slm_integration
+++ b/synopsys_28nm_slm_integration
@@ -1 +1 @@
-Subproject commit e9f59a1bd14b8350d3b493a42943fcfef07de5ba
+Subproject commit 5ece300bcb4e7dd8cd0c4cc141e7faa8f42e3e23
diff --git a/verif/cocotb/sram_chiplet_cocotb.sv b/verif/cocotb/sram_chiplet_cocotb.sv
index 5bb4a2d..c50a7d4 100644
--- a/verif/cocotb/sram_chiplet_cocotb.sv
+++ b/verif/cocotb/sram_chiplet_cocotb.sv
@@ -40,68 +40,19 @@ module sram_chiplet_cocotb(
     output wire [1:0]   cocotb_rresp,
     output wire         cocotb_rlast,
     output wire         cocotb_rvalid,
-    input  wire         cocotb_rready
-
+    input  wire         cocotb_rready  
 );
+parameter N_ADDR_SEL_BITS=6;
+parameter N_CHIPLETS=8;
 
+wire DL_REV_CLK[N_CHIPLETS+1];
+wire DL_FWD_CLK[N_CHIPLETS+1];
 
-wire DL_REV_CLK;
-
-// Thin links from NIC_TB to SRAM_chiplet_0
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_IN_data_rev_0();
-TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_IN_flow_rev_0();
-TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_IN_flow_fwd_0();
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_IN_data_fwd_0();
-
-// Thin links from SRAM_chiplet_0 to SRAM_chiplet_1
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_rev_1();
-TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_flow_rev_1();
-TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_flow_fwd_1();
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_fwd_1();
-
-// Thin links from SRAM_chiplet_0 to SRAM_chiplet_1
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_rev_2();
-TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_flow_rev_2();
-TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_flow_fwd_2();
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_fwd_2();
-
-// Thin links from SRAM_chiplet_0 to SRAM_chiplet_1
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_rev_3();
-TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_flow_rev_3();
-TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_flow_fwd_3();
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_fwd_3();
-
-// Thin links from SRAM_chiplet_0 to SRAM_chiplet_1
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_rev_4();
-TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_flow_rev_4();
-TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_flow_fwd_4();
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_fwd_4();
-
-// Thin links from SRAM_chiplet_0 to SRAM_chiplet_1
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_rev_5();
-TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_flow_rev_5();
-TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_flow_fwd_5();
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_fwd_5();
-
-// Thin links from SRAM_chiplet_0 to SRAM_chiplet_1
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_rev_6();
-TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_flow_rev_6();
-TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_flow_fwd_6();
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_fwd_6();
-
-// Thin links from SRAM_chiplet_0 to SRAM_chiplet_1
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_rev_7();
-TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_flow_rev_7();
-TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_flow_fwd_7();
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_fwd_7();
-
-// Thin links from SRAM_chiplet_0 to SRAM_chiplet_1
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_rev_8();
-TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_flow_rev_8();
-TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_flow_fwd_8();
-TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_fwd_8();
-
-
+// Thin links array
+TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_rev[N_CHIPLETS+1]();
+TLX_AXI_stream #(.DATA_WIDTH(3))    TLX_flow_rev[N_CHIPLETS+1]();
+TLX_AXI_stream #(.DATA_WIDTH(2))    TLX_flow_fwd[N_CHIPLETS+1]();
+TLX_AXI_stream #(.DATA_WIDTH(16))   TLX_data_fwd[N_CHIPLETS+1]();
 
 
 wire [3:0]  AWID_AXI_CHIPLET_OUT;
@@ -273,26 +224,26 @@ nic400_slave_pwr_M1_m_tlx_tlx_sram_chiplet u_slave_pwd_M1_m_tlx(
     .tdata_m1_m_tlx_fwd_ib_flow(tdata_m1_m_tlx_fwd_ib_flow),
 
     // Axi Stream slave (tdata in) rev flow from SRAM chiplet PL
-    .tvalid_m1_m_tlx_pl_rev_to_dl_rev_flow(TLX_IN_flow_rev_0.tvalid),
-    .tready_m1_m_tlx_pl_rev_to_dl_rev_flow(TLX_IN_flow_rev_0.tready),
-    .tdata_m1_m_tlx_pl_rev_to_dl_rev_flow(TLX_IN_flow_rev_0.tdata),
+    .tvalid_m1_m_tlx_pl_rev_to_dl_rev_flow(TLX_flow_rev[0].tvalid),
+    .tready_m1_m_tlx_pl_rev_to_dl_rev_flow(TLX_flow_rev[0].tready),
+    .tdata_m1_m_tlx_pl_rev_to_dl_rev_flow(TLX_flow_rev[0].tdata),
 
     // Axi stream slave (tdata in) rev data from SRAM chiplet PL
-    .tvalid_m1_m_tlx_pl_rev_to_dl_rev_data(TLX_IN_data_rev_0.tvalid),
-    .tready_m1_m_tlx_pl_rev_to_dl_rev_data(TLX_IN_data_rev_0.tready),
-    .tdata_m1_m_tlx_pl_rev_to_dl_rev_data(TLX_IN_data_rev_0.tdata),
+    .tvalid_m1_m_tlx_pl_rev_to_dl_rev_data(TLX_data_rev[0].tvalid),
+    .tready_m1_m_tlx_pl_rev_to_dl_rev_data(TLX_data_rev[0].tready),
+    .tdata_m1_m_tlx_pl_rev_to_dl_rev_data(TLX_data_rev[0].tdata),
 
     .clk_sclk(clk_in),
     .clk_sresetn(aresetn),
-    .dl_rev_M1_m_tlxclk(clk_in),
+    .dl_rev_M1_m_tlxclk(DL_REV_CLK[0]),
     .dl_rev_M1_m_tlxresetn(aresetn)
 );
 
 nic400_cd_pl_fwd_M1_m_tlx_tlx_sram_chiplet u_pl_fwd_M1_m_tlx_m(
     // axi sream master (tdata out)
-    .tvalid_pl_fwd_m1_m_tlx_m_stream(TLX_IN_data_fwd_0.tvalid),
-    .tready_pl_fwd_m1_m_tlx_m_stream(TLX_IN_data_fwd_0.tready),
-    .tdata_pl_fwd_m1_m_tlx_m_stream(TLX_IN_data_fwd_0.tdata),
+    .tvalid_pl_fwd_m1_m_tlx_m_stream(TLX_data_fwd[0].tvalid),
+    .tready_pl_fwd_m1_m_tlx_m_stream(TLX_data_fwd[0].tready),
+    .tdata_pl_fwd_m1_m_tlx_m_stream(TLX_data_fwd[0].tdata),
 
     // axi stream slave (tdata in)
     .tvalid_pl_fwd_m1_m_tlx_s_stream(tvalid_m1_m_tlx_fwd_ib_axi_stream),
@@ -300,9 +251,9 @@ nic400_cd_pl_fwd_M1_m_tlx_tlx_sram_chiplet u_pl_fwd_M1_m_tlx_m(
     .tdata_pl_fwd_m1_m_tlx_s_stream(tdata_m1_m_tlx_fwd_ib_axi_stream),
 
     // axi stream master (tdata out)
-    .tvalid_pl_fwd_m1_m_tlx_m_flow(TLX_IN_flow_fwd_0.tvalid),
-    .tready_pl_fwd_m1_m_tlx_m_flow(TLX_IN_flow_fwd_0.tready),
-    .tdata_pl_fwd_m1_m_tlx_m_flow(TLX_IN_flow_fwd_0.tdata),
+    .tvalid_pl_fwd_m1_m_tlx_m_flow(TLX_flow_fwd[0].tvalid),
+    .tready_pl_fwd_m1_m_tlx_m_flow(TLX_flow_fwd[0].tready),
+    .tdata_pl_fwd_m1_m_tlx_m_flow(TLX_flow_fwd[0].tdata),
 
     // axi stream slave (tdata in)
     .tvalid_pl_fwd_m1_m_tlx_s_flow(tvalid_m1_m_tlx_fwd_ib_flow),
@@ -313,189 +264,53 @@ nic400_cd_pl_fwd_M1_m_tlx_tlx_sram_chiplet u_pl_fwd_M1_m_tlx_m(
     .pl_fwd_M1_m_tlxresetn(aresetn)
 );
 
-top_sram_chiplet u_top_sram_chiplet_0(
-    .SYS_CLK(clk_in),
-    .DL_FWD_CLK(clk_in),
-    .DL_REV_CLK(DL_REV_CLK),
-
-    .aRESETn(aresetn),
-    .DL_FWD_RESETn(aresetn),
-
-    // Thin Links In
-    .TLX_IN_data_rev(TLX_IN_data_rev_0),
-    .TLX_IN_flow_rev(TLX_IN_flow_rev_0),
-    .TLX_IN_flow_fwd(TLX_IN_flow_fwd_0),
-    .TLX_IN_data_fwd(TLX_IN_data_fwd_0),
-    // Thin Links Out
-    .TLX_OUT_data_rev(TLX_data_rev_1),
-    .TLX_OUT_flow_rev(TLX_flow_rev_1),
-    .TLX_OUT_flow_fwd(TLX_flow_fwd_1),
-    .TLX_OUT_data_fwd(TLX_data_fwd_1),
-
-    // Address select
-    .addr_sel(3'h0)  
-);
-
-top_sram_chiplet u_top_sram_chiplet_1(
-    .SYS_CLK(clk_in),
-    .DL_FWD_CLK(clk_in),
-    .DL_REV_CLK(DL_REV_CLK),
-
-    .aRESETn(aresetn),
-    .DL_FWD_RESETn(aresetn),
-
-    // Thin Links In
-    .TLX_IN_data_rev(TLX_data_rev_1),
-    .TLX_IN_flow_rev(TLX_flow_rev_1),
-    .TLX_IN_flow_fwd(TLX_flow_fwd_1),
-    .TLX_IN_data_fwd(TLX_data_fwd_1),
-    // Thin Links Out
-    .TLX_OUT_data_rev(TLX_data_rev_2),
-    .TLX_OUT_flow_rev(TLX_flow_rev_2),
-    .TLX_OUT_flow_fwd(TLX_flow_fwd_2),
-    .TLX_OUT_data_fwd(TLX_data_fwd_2),
-
-    // Address select
-    .addr_sel(3'h1)  
-);
-
-top_sram_chiplet u_top_sram_chiplet_2(
-    .SYS_CLK(clk_in),
-    .DL_FWD_CLK(clk_in),
-    .DL_REV_CLK(DL_REV_CLK),
-
-    .aRESETn(aresetn),
-    .DL_FWD_RESETn(aresetn),
-
-    // Thin Links In
-    .TLX_IN_data_rev(TLX_data_rev_2),
-    .TLX_IN_flow_rev(TLX_flow_rev_2),
-    .TLX_IN_flow_fwd(TLX_flow_fwd_2),
-    .TLX_IN_data_fwd(TLX_data_fwd_2),
-    // Thin Links Out
-    .TLX_OUT_data_rev(TLX_data_rev_3),
-    .TLX_OUT_flow_rev(TLX_flow_rev_3),
-    .TLX_OUT_flow_fwd(TLX_flow_fwd_3),
-    .TLX_OUT_data_fwd(TLX_data_fwd_3),
-
-    // Address select
-    .addr_sel(3'h2)  
-);
-
-
-top_sram_chiplet u_top_sram_chiplet_3(
-    .SYS_CLK(clk_in),
-    .DL_FWD_CLK(clk_in),
-    .DL_REV_CLK(DL_REV_CLK),
-
-    .aRESETn(aresetn),
-    .DL_FWD_RESETn(aresetn),
-
-    // Thin Links In
-    .TLX_IN_data_rev(TLX_data_rev_3),
-    .TLX_IN_flow_rev(TLX_flow_rev_3),
-    .TLX_IN_flow_fwd(TLX_flow_fwd_3),
-    .TLX_IN_data_fwd(TLX_data_fwd_3),
-    // Thin Links Out
-    .TLX_OUT_data_rev(TLX_data_rev_4),
-    .TLX_OUT_flow_rev(TLX_flow_rev_4),
-    .TLX_OUT_flow_fwd(TLX_flow_fwd_4),
-    .TLX_OUT_data_fwd(TLX_data_fwd_4),
-
-    // Address select
-    .addr_sel(3'h3)  
-);
-
-top_sram_chiplet u_top_sram_chiplet_4(
-    .SYS_CLK(clk_in),
-    .DL_FWD_CLK(clk_in),
-    .DL_REV_CLK(DL_REV_CLK),
-
-    .aRESETn(aresetn),
-    .DL_FWD_RESETn(aresetn),
-
-    // Thin Links In
-    .TLX_IN_data_rev(TLX_data_rev_4),
-    .TLX_IN_flow_rev(TLX_flow_rev_4),
-    .TLX_IN_flow_fwd(TLX_flow_fwd_4),
-    .TLX_IN_data_fwd(TLX_data_fwd_4),
-    // Thin Links Out
-    .TLX_OUT_data_rev(TLX_data_rev_5),
-    .TLX_OUT_flow_rev(TLX_flow_rev_5),
-    .TLX_OUT_flow_fwd(TLX_flow_fwd_5),
-    .TLX_OUT_data_fwd(TLX_data_fwd_5),
-
-    // Address select
-    .addr_sel(3'h4)  
-);
-
-top_sram_chiplet u_top_sram_chiplet_5(
-    .SYS_CLK(clk_in),
-    .DL_FWD_CLK(clk_in),
-    .DL_REV_CLK(DL_REV_CLK),
-
-    .aRESETn(aresetn),
-    .DL_FWD_RESETn(aresetn),
-
-    // Thin Links In
-    .TLX_IN_data_rev(TLX_data_rev_5),
-    .TLX_IN_flow_rev(TLX_flow_rev_5),
-    .TLX_IN_flow_fwd(TLX_flow_fwd_5),
-    .TLX_IN_data_fwd(TLX_data_fwd_5),
-    // Thin Links Out
-    .TLX_OUT_data_rev(TLX_data_rev_6),
-    .TLX_OUT_flow_rev(TLX_flow_rev_6),
-    .TLX_OUT_flow_fwd(TLX_flow_fwd_6),
-    .TLX_OUT_data_fwd(TLX_data_fwd_6),
-
-    // Address select
-    .addr_sel(3'h5)  
-);
-
-top_sram_chiplet u_top_sram_chiplet_6(
-    .SYS_CLK(clk_in),
-    .DL_FWD_CLK(clk_in),
-    .DL_REV_CLK(DL_REV_CLK),
-
-    .aRESETn(aresetn),
-    .DL_FWD_RESETn(aresetn),
-
-    // Thin Links In
-    .TLX_IN_data_rev(TLX_data_rev_6),
-    .TLX_IN_flow_rev(TLX_flow_rev_6),
-    .TLX_IN_flow_fwd(TLX_flow_fwd_6),
-    .TLX_IN_data_fwd(TLX_data_fwd_6),
-    // Thin Links Out
-    .TLX_OUT_data_rev(TLX_data_rev_7),
-    .TLX_OUT_flow_rev(TLX_flow_rev_7),
-    .TLX_OUT_flow_fwd(TLX_flow_fwd_7),
-    .TLX_OUT_data_fwd(TLX_data_fwd_7),
-
-    // Address select
-    .addr_sel(3'h6)  
-);
-
-top_sram_chiplet u_top_sram_chiplet_7(
-    .SYS_CLK(clk_in),
-    .DL_FWD_CLK(clk_in),
-    .DL_REV_CLK(DL_REV_CLK),
-
-    .aRESETn(aresetn),
-    .DL_FWD_RESETn(aresetn),
-
-    // Thin Links In
-    .TLX_IN_data_rev(TLX_data_rev_7),
-    .TLX_IN_flow_rev(TLX_flow_rev_7),
-    .TLX_IN_flow_fwd(TLX_flow_fwd_7),
-    .TLX_IN_data_fwd(TLX_data_fwd_7),
-    // Thin Links Out
-    .TLX_OUT_data_rev(TLX_data_rev_8),
-    .TLX_OUT_flow_rev(TLX_flow_rev_8),
-    .TLX_OUT_flow_fwd(TLX_flow_fwd_8),
-    .TLX_OUT_data_fwd(TLX_data_fwd_8),
-
-    // Address select
-    .addr_sel(3'h7)  
-);
+wire [N_CHIPLETS:0] ref_clk;
+reg [1:0] clock_div;
+always @(posedge clk_in or negedge aresetn) begin
+    if(~aresetn)
+        clock_div <= 2'b00;
+    else 
+        clock_div <= clock_div + 1;
+end
+
+assign ref_clk[0] = clock_div[1];
+
+wire [N_CHIPLETS:0] PLL_LOCK;
+assign DL_FWD_CLK[0] = clk_in;
+
+genvar i;
+generate
+    for(i=0; i<N_CHIPLETS;i=i+1) begin: gen_chiplets
+        top_sram_chiplet u_top_sram_chiplet(
+            .REF_CLK(ref_clk[0]),
+
+            .aRESETn(aresetn),
+            .DL_FWD_RESETn(aresetn),
+            .OUT_CLK(ref_clk[i+1]),
+            .PLL_LOCK_o(PLL_LOCK[i]),
+            .PLL_LOCK_i(PLL_LOCK[i+1]),
+            .IN_FWD_CLK(DL_FWD_CLK[i]),
+            .IN_REV_CLK(DL_REV_CLK[i]),
+            .OUT_FWD_CLK(DL_FWD_CLK[i+1]),
+            .OUT_REV_CLK(DL_REV_CLK[i+1]),
+            // Thin Links In
+            .TLX_IN_data_rev(TLX_data_rev[i]),
+            .TLX_IN_flow_rev(TLX_flow_rev[i]),
+            .TLX_IN_flow_fwd(TLX_flow_fwd[i]),
+            .TLX_IN_data_fwd(TLX_data_fwd[i]),
+            // Thin Links Out
+            .TLX_OUT_data_rev(TLX_data_rev[i+1]),
+            .TLX_OUT_flow_rev(TLX_flow_rev[i+1]),
+            .TLX_OUT_flow_fwd(TLX_flow_fwd[i+1]),
+            .TLX_OUT_data_fwd(TLX_data_fwd[i+1]),
+
+            // Address select
+            .addr_sel(i[N_ADDR_SEL_BITS-1:0])  
+ 
+        );
+    end
+endgenerate
+
+assign PLL_LOCK[N_CHIPLETS]=1'b1;
 
 endmodule
\ No newline at end of file
diff --git a/verif/cocotb/sram_chiplet_tests.py b/verif/cocotb/sram_chiplet_tests.py
index 71921bc..e58ea83 100644
--- a/verif/cocotb/sram_chiplet_tests.py
+++ b/verif/cocotb/sram_chiplet_tests.py
@@ -25,8 +25,9 @@ from cocotb.regression import TestFactory
 
 from cocotbext.axi import AxiBus, AxiMaster, AxiRam, AxiBurstType, AxiSlave
 
+
 CHIPLET_0_BASE=0x00000000
-CHIPLET_0_APB_BASE=0x001F0000
+CHIPLET_0_APB_BASE= 0x4000000
 CHIPLET_0_TS_BASE = CHIPLET_0_APB_BASE
 CHIPLET_0_PD_BASE = CHIPLET_0_APB_BASE + 6*0x1000
 CHIPLET_0_VM_BASE = CHIPLET_0_APB_BASE + 7*0x1000 
@@ -41,7 +42,7 @@ class TB:
         self.log = logging.getLogger("cocotb.tb")
         self.log.setLevel(logging.DEBUG)
 
-        cocotb.start_soon(Clock(dut.clk_in, 4, units="ns").start())
+        cocotb.start_soon(Clock(dut.clk_in, 1, units="ns").start())
         self.axi_master = AxiMaster(AxiBus.from_prefix(dut,"cocotb"), dut.clk_in, dut.aresetn, reset_active_level=False)
     def set_idle_generator(self, generator=None):
         if generator:
@@ -93,19 +94,22 @@ async def SRAM_bank_test(dut, tb, bank_addrs):
         await tb.axi_master.write(bank_addr, data)
         read_data = await tb.axi_master.read(bank_addr, length)
         assert read_data.data == data
+        
+async def wait_for_PLL(dut, tb):
+    await RisingEdge(dut.PLL_LOCK[0])
+    await ClockCycles(dut.clk_in,20)
+
  
 @cocotb.test()
 async def PLL_TEST(dut,idle_inserter=None, backpressure_inserter=None, size=None):
     tb = TB(dut) 
-    byte_lanes = tb.axi_master.write_if.byte_lanes
-    max_burst_size = tb.axi_master.write_if.max_burst_size
-    
-    if size is None:
-        size = max_burst_size
         
     await tb.cycle_reset()
     tb.set_idle_generator(idle_inserter)
     tb.set_backpressure_generator(backpressure_inserter)
+    
+    #await wait_for_PLL(dut,tb)
+    
     # Test ID of PLL Intergration layer
     PLL_ID = await tb.axi_master.read(CHIPLET_0_PLL_BASE+20,4)
     assert PLL_ID.data == b'LPNS'
@@ -130,7 +134,6 @@ async def PD_TEST(dut,idle_insterter=None, backpressure_inserter=None, size=None
     tb = TB(dut)
     byte_lanes = tb.axi_master.write_if.byte_lanes
     max_burst_size = tb.axi_master.write_if.max_burst_size
-    
     if size is None:
         size = max_burst_size
     
@@ -241,9 +244,7 @@ async def SRAM_TEST(dut,idle_inserter=None, backpressure_inserter=None, size=Non
     tb.set_idle_generator(idle_inserter)
     tb.set_backpressure_generator(backpressure_inserter)
     await SRAM_test_write(dut, tb, 0x0, byte_lanes, size)
-    bank_addrs = range(0x00000000, CHIPLET_0_SRAM_MAX_ADDR, 0x20000)
-    await SRAM_bank_test(dut, tb, bank_addrs)
-    bank_addrs = range(CHIPLET_0_SRAM_MAX_ADDR, CHIPLET_0_SRAM_MAX_ADDR + 0xF0000, 0x20000)
+    bank_addrs = range(0x00000000, CHIPLET_0_SRAM_MAX_ADDR, 0x10000)
     await SRAM_bank_test(dut, tb, bank_addrs)
 
 @cocotb.test()
@@ -258,24 +259,24 @@ async def SRAM_TEST_MULTI_CHIPLET(dut,idle_inserter=None, backpressure_inserter=
     await tb.cycle_reset()
     tb.set_idle_generator(idle_inserter)
     tb.set_backpressure_generator(backpressure_inserter)
-    
-    N=13824
+    await wait_for_PLL(dut, tb)
+    N=1024
     data = bytearray([x % 256 for x in range(N)])
     
-    addresses = [0x000000, 0x200000, 0x400000, 0x600000, 0x800000, 0xA00000, 0xC00000, 0xE00000]
+    addresses = range(0,0x800000, 0x100000)
     BW_write = []
     BW_read = []
     
     for addr in addresses:
-        start_time = cocotb.utils.get_sim_time()
+        start_time = cocotb.utils.get_sim_time(units='ns')
         await tb.axi_master.write(addr, data, size=size)
-        end_time = cocotb.utils.get_sim_time()
-        BW_write.append(1e3*N*8/(end_time-start_time))
+        end_time = cocotb.utils.get_sim_time(units='ns')
+        BW_write.append(N*8/(end_time-start_time))
         
-        start_time = cocotb.utils.get_sim_time()
+        start_time = cocotb.utils.get_sim_time(units='ns')
         d_read = await tb.axi_master.read(addr,N)
-        end_time = cocotb.utils.get_sim_time()
-        BW_read.append(1e3*N*8/(end_time-start_time))
+        end_time = cocotb.utils.get_sim_time(units='ns')
+        BW_read.append(N*8/(end_time-start_time))
         
         assert d_read.data == data
         
@@ -283,3 +284,62 @@ async def SRAM_TEST_MULTI_CHIPLET(dut,idle_inserter=None, backpressure_inserter=
     
     for x in range(len(addresses)):
         tb.log.info("%d \t\t %f \t\t\t %f",x, BW_write[x], BW_read[x])
+
+# ------------------------------------------------------------------------------------------#
+# ---------------------- SRAM Concerrent access test ---------------------------------------#
+#                                                                                           #
+# Starts multiple writes concurrently, one to each sram chiplet and waits for writes to     #
+# finish. After each write has finished, a read access is initiated to the same address     #
+#                                                                                           #
+@cocotb.test()
+async def SRAM_CONC_ACCESS(dut,idle_inserter=None, backpressure_inserter=None, size=None):
+    tb = TB(dut)
+    byte_lanes = tb.axi_master.write_if.byte_lanes
+    max_burst_size = tb.axi_master.write_if.max_burst_size
+    
+    if size is None:
+        size = max_burst_size
+        
+    await tb.cycle_reset()
+    tb.set_idle_generator(idle_inserter)
+    tb.set_backpressure_generator(backpressure_inserter)
+    await wait_for_PLL(dut, tb)
+    N=8192
+    data = bytearray([x % 256 for x in range(N)])
+    d_read = []
+    write_ops = []
+    read_ops  = []
+    
+    addresses = range(0,0x800000, 0x100000)
+    start_time = cocotb.utils.get_sim_time(units='ns')
+    for addr in addresses:
+        write_ops.append(tb.axi_master.init_write(addr, data, size=size))
+    
+    for i in range(0,len(write_ops)):
+        await write_ops[i].wait()
+        read_ops.append(tb.axi_master.init_read(addresses[i],N)) 
+
+    for read_op in read_ops:
+        await read_op.wait()
+    end_time = cocotb.utils.get_sim_time(units='ns')
+    BW = (2*N*8*len(addresses))/(end_time-start_time)
+    tb.log.info("Total Bandwidth (Gbps) (read and write) : %f", BW)
+    
+@cocotb.test()
+async def SRAM_TEST_CROSS_BOUND(dut,idle_inserter=None, backpressure_inserter=None, size=None):
+    tb = TB(dut)
+    byte_lanes = tb.axi_master.write_if.byte_lanes
+    max_burst_size = tb.axi_master.write_if.max_burst_size
+    
+    if size is None:
+        size = max_burst_size
+        
+    await tb.cycle_reset()
+    tb.set_idle_generator(idle_inserter)
+    tb.set_backpressure_generator(backpressure_inserter)
+    N=256
+    data = bytearray([x % 256 for x in range(N)])
+
+    await tb.axi_master.write(0xFFF80, data, size=size)
+    d_read = await tb.axi_master.read(0xFFF80,N)
+    assert d_read.data == data
\ No newline at end of file
-- 
GitLab