From 8fda30ef5fd24df2c3348191b886c8c1e408b728 Mon Sep 17 00:00:00 2001 From: Daniel Newbrook <dwn1c21@soton.ac.uk> Date: Tue, 3 Sep 2024 15:35:47 +0100 Subject: [PATCH] Add Synopsys IP and ASIC flow for Fusion Compiler --- .gitignore | 14 + .gitmodules | 3 + .../Synopsys_FC_flow/FC_flow.tcl | 16 ++ .../Synopsys_FC_flow/design_setup.tcl | 32 +++ .../Synopsys_FC_flow/floorplan/floorplan.def | 13 + .../Synopsys_FC_flow/floorplan/floorplan.tcl | 51 ++++ .../floorplan/floorplan_compare_data.txt | 115 ++++++++ .../Synopsys_FC_flow/floorplan/fp.tcl | 171 ++++++++++++ .../Synopsys_FC_flow/floorplan/mapfile | 1 + .../Synopsys_FC_flow/init_placement.tcl | 19 ++ .../Synopsys_FC_flow/power_plan.tcl | 16 ++ .../synopsys_lib_conversion.tcl | 70 +++++ .../constraints/sram_chiplet.sdc | 22 ++ ASIC/TSMC28nm_HPCP/sram_32b_16k.spec | 47 ++++ ASIC/TSMC28nm_HPCP/sram_32b_32k.spec | 2 +- flist/IP/SIE300.flist | 22 +- flist/IP/SIE300_sv.flist | 20 ++ flist/IP/Synopsys_VIP.flist | 11 + flist/Top/sram_chiplet.flist | 14 +- flist/Top/sram_chiplet_TSMC28nm.flist | 8 +- flist/Top/sram_chiplet_TSMC28nm_ASIC.flist | 41 +++ flist/Top/sram_chiplet_sv.flist | 18 ++ flows/makefile.asic | 42 ++- logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v | 101 +------- .../SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v | 8 +- logical/SRAM/glib/verilog/SRAM.v | 9 + .../verilog/sram_chiplet_apb_subsystem.v | 245 ++++++++++++++++++ .../verilog/top_sram_chiplet.sv | 13 +- makefile | 1 + pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv | 145 +++++++++++ pad_level/tsmc28nm_hpcp/SRAM_chiplet.v | 53 ---- synopsys_28nm_slm_integration | 1 + verif/cocotb/makefile | 3 +- verif/cocotb/sram_chiplet_tests.py | 168 +++++++++++- 34 files changed, 1319 insertions(+), 196 deletions(-) create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/FC_flow.tcl create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/design_setup.tcl create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.def create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.tcl create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan_compare_data.txt create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/fp.tcl create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/mapfile create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/init_placement.tcl create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/power_plan.tcl create mode 100644 ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/synopsys_lib_conversion.tcl create mode 100644 ASIC/TSMC28nm_HPCP/constraints/sram_chiplet.sdc create mode 100644 ASIC/TSMC28nm_HPCP/sram_32b_16k.spec create mode 100644 flist/IP/SIE300_sv.flist create mode 100644 flist/IP/Synopsys_VIP.flist create mode 100644 flist/Top/sram_chiplet_TSMC28nm_ASIC.flist create mode 100644 flist/Top/sram_chiplet_sv.flist create mode 100644 pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv delete mode 100644 pad_level/tsmc28nm_hpcp/SRAM_chiplet.v create mode 160000 synopsys_28nm_slm_integration diff --git a/.gitignore b/.gitignore index b6ee89a..3fbd165 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,20 @@ .project .ecmproject +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_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/*.svf +ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/*.log +ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/*.txt +ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/*.png + logical/nic400_tb logical/nic400_sram_chiplet/ logical/nic400_tlx_sram_chiplet/ diff --git a/.gitmodules b/.gitmodules index b6b5886..ea845b0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "soctools_flow"] path = soctools_flow url = https://git.soton.ac.uk/soclabs/soctools_flow.git +[submodule "synopsys_28nm_slm_integration"] + path = synopsys_28nm_slm_integration + url = https://git.soton.ac.uk/soclabs/synopsys_28nm_slm_integration.git diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/FC_flow.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/FC_flow.tcl new file mode 100644 index 0000000..f9f2f84 --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/FC_flow.tcl @@ -0,0 +1,16 @@ + +source ./design_setup.tcl + +source ./floorplan/fp.tcl +read_sdc ../constraints/sram_chiplet.sdc + +source ./power_plan.tcl + +source ./init_placement.tcl + +redirect -tee -file ./compile.log {compile_fusion} +save_lib sram_chiplet.dlib + +synthesize_clock_trunks -clock clk +place_opt +clock_opt diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/design_setup.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/design_setup.tcl new file mode 100644 index 0000000..a672393 --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/design_setup.tcl @@ -0,0 +1,32 @@ +set sc9mcpp240z_base_path /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln28ht/sc9mcpp140z_base_svt_c35/r0p0 +set cln28ht_tech_path /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln28ht/arm_tech/r1p0 + +set TLU_dir /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln28ht/arm_tech/r1p0/synopsys_tluplus/1p8m_5x2z_utalrdl + +set TLU_cbest $TLU_dir/cbest.tluplus +set TLU_cworst $TLU_dir/cworst.tluplus +set TLU_rcbest $TLU_dir/rcbest.tluplus +set TLU_rcworst $TLU_dir/rcworst.tluplus +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/} + +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 + +elaborate SRAM_chiplet +set_top_module SRAM_chiplet + +redirect -tee -file ./lib_cell_summary.log {report_lib -cell_summary cln28ht} + +read_parasitic_tech -name cbest -tlup $TLU_cbest -layermap $TLU_map -sanity_check advanced +read_parasitic_tech -name cworst -tlup $TLU_cworst -layermap $TLU_map -sanity_check advanced +read_parasitic_tech -name rcbest -tlup $TLU_rcbest -layermap $TLU_map -sanity_check advanced +read_parasitic_tech -name rcworst -tlup $TLU_rcworst -layermap $TLU_map -sanity_check advanced + +save_lib sram_chiplet.dlib + diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.def b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.def new file mode 100644 index 0000000..6ef2e9d --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.def @@ -0,0 +1,13 @@ +# +# Fusion Compiler write_def +# Release : U-2022.12 +# User Name : dwn1c21 +# Date : Tue Sep 3 14:17:43 2024 +# +VERSION 5.8 ; +DIVIDERCHAR "/" ; +BUSBITCHARS "[]" ; +DESIGN SRAM_chiplet ; +UNITS DISTANCE MICRONS 1000 ; +DIEAREA ( 0 0 ) ( 0 1529700 ) ( 1789940 1529700 ) ( 1789940 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 new file mode 100644 index 0000000..6f35619 --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan.tcl @@ -0,0 +1,51 @@ +################################################################################ +# +# Created by fc write_floorplan on Tue Sep 3 14:17:43 2024 +# +################################################################################ + +set _dirName__0 [file dirname [file normalize [info script]]] + +source ${_dirName__0}/fp.tcl + +if { [get_attribute -name view_name [current_block]] == "design" } { + set __fp_crnt_design_name__ [get_attribute -name design_name [current_block]] + set __fp_crnt_label_name__ [get_attribute -name label_name [current_block]] + set __fp_crnt_lib_name__ [get_attribute -name lib_name [current_block]] + set __fp_crnt_lib_path__ [get_attribute -name source_file_name [current_lib]] + set __fp_crnt_abs_name__ ${__fp_crnt_lib_name__}:${__fp_crnt_design_name__} + set __fp_crnt_abs_path__ ${__fp_crnt_lib_path__}/${__fp_crnt_design_name__} + if { [string length ${__fp_crnt_label_name__} ] != 0 } { + set __fp_crnt_abs_name__ ${__fp_crnt_abs_name__}/${__fp_crnt_label_name__}.abstract + set __fp_crnt_abs_path__ ${__fp_crnt_abs_path__}/design_label.${__fp_crnt_label_name__}/abs + } else { + set __fp_crnt_abs_name__ ${__fp_crnt_abs_name__}.abstract + set __fp_crnt_abs_path__ ${__fp_crnt_abs_path__}/abs + } + if { [sizeof_collection [get_blocks -quiet ${__fp_crnt_abs_name__}]] != 0} { + if { [get_attribute -name has_editable_abstract [current_block]] } { + echo "Design [get_attribute -name full_name [current_block]] has editable abstract view. Re-creating the abstract view after floorplan loading..." + set __fp_crnt_abs_type__ [get_attribute -quiet -name abstract_view_type [current_block]] + if { [string length ${__fp_crnt_abs_type__} ] == 0 } { + if { [file exists "${__fp_crnt_abs_path__}/abs.mc"] } { + echo "re-create timing abstract view for design [get_attribute -name full_name [current_block]]" + create_abstract + save_lib -all + } else { + echo "re-create placement abstract view for design [get_attribute -name full_name [current_block]]" + create_abstract -placement + save_lib -all + } + } elseif { ${__fp_crnt_abs_type__} == "placement" } { + echo "re-create placement abstract view for design [get_attribute -name full_name [current_block]]" + create_abstract -placement + save_lib -all + } else { + echo "re-create timing abstract view for design [get_attribute -name full_name [current_block]]" + create_abstract + save_lib -all + } + } + } +} + 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 new file mode 100644 index 0000000..eeb6c76 --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/floorplan_compare_data.txt @@ -0,0 +1,115 @@ +################################################################################ +# +# Created by fc compare_floorplans on Tue Sep 3 14:17:43 2024 +# +# DO NOT EDIT - automatically generated file +# +################################################################################ + +START SRAM_chiplet + MACROS + 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} } + 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} } +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 new file mode 100644 index 0000000..d30045d --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/fp.tcl @@ -0,0 +1,171 @@ +################################################################################ +# +# Created by fc write_floorplan on Tue Sep 3 14:17:43 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]]] + +################################################################################ +# Read DEF +################################################################################ + +read_def ${_dirName__0}/floorplan.def + +################################################################################ +# Macros +################################################################################ + +set cellInst [get_cells { \ + u_top_sram_chiplet/u_sram_chiplet_apb_subsystem/gen_snps_PVT_ts0.u_snps_PVT_ts0/u_synopsys_ts \ + }] +set_attribute -quiet -objects $cellInst -name orientation -value R0 +set_attribute -quiet -objects $cellInst -name origin -value { 120.0000 390.0600 \ + } +set_attribute -quiet -objects $cellInst -name status -value placed + +set cellInst [get_cells { \ + u_top_sram_chiplet/u_sram_chiplet_apb_subsystem/gen_snps_PVT_pd0.u_snps_PVT_pd0/u_synopsys_pd \ + }] +set_attribute -quiet -objects $cellInst -name orientation -value R0 +set_attribute -quiet -objects $cellInst -name origin -value { 120.0000 618.3400 \ + } +set_attribute -quiet -objects $cellInst -name status -value placed + +set cellInst [get_cells { \ + u_top_sram_chiplet/u_sram_chiplet_apb_subsystem/gen_snps_PLL.u_snps_PLL/u_snps_PLL \ + }] +set_attribute -quiet -objects $cellInst -name orientation -value R0 +set_attribute -quiet -objects $cellInst -name origin -value { 120.0000 120.0000 \ + } +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 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[0].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[0].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[0].u_sram_32b_32k } + +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 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 } +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[1].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[1].u_sram_32b_32k } + +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 \ + 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[2].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[2].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[2].u_sram_32b_32k } + +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 \ + 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[3].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[3].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[3].u_sram_32b_32k } + +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 \ + 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[4].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[4].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[4].u_sram_32b_32k } + +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 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 } +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[5].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[5].u_sram_32b_32k } + +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 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[6].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[6].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[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 }] +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 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 } + + +################################################################################ +# User attributes of macros +################################################################################ + + +################################################################################ +# I/O guides +################################################################################ + +remove_io_guides -all + + +################################################################################ +# User attributes of I/O guides +################################################################################ + + +################################################################################ +# User attributes of current block +################################################################################ + + diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/mapfile b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/mapfile new file mode 100644 index 0000000..f548a1c --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/floorplan/mapfile @@ -0,0 +1 @@ +SRAM_chiplet FLOORPLAN fp.tcl diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/init_placement.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/init_placement.tcl new file mode 100644 index 0000000..b3749f8 --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/init_placement.tcl @@ -0,0 +1,19 @@ +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 + +redirect -tee -file ./precompile_checks.log {compile_fusion -check_only} + +explore_logic_hierarchy -create_module_boundary -nested -cell [get_cells -design [current_block] {u_top_sram_chiplet/u_cd_pl_rev_M1_m_tlx}] +change_selection [get_cells u_top_sram_chiplet/u_master_pwr_M1_m_tlx] +explore_logic_hierarchy -create_module_boundary -nested -cell [get_cells -design [current_block] {u_top_sram_chiplet/u_master_pwr_M1_m_tlx}] +change_selection [get_cells u_top_sram_chiplet/eq_268] +change_selection [get_cells u_top_sram_chiplet/u_nic400_sram_chiplet] +explore_logic_hierarchy -create_module_boundary -nested -cell [get_cells -design [current_block] {u_top_sram_chiplet/u_nic400_sram_chiplet}] +change_selection [get_cells u_top_sram_chiplet/u_slave_pwd_M1_m_tlx] +explore_logic_hierarchy -create_module_boundary -nested -cell [get_cells -design [current_block] {u_top_sram_chiplet/u_slave_pwd_M1_m_tlx}] +change_selection [get_cells u_top_sram_chiplet/u_pl_fwd_M1_m_tlx_m] +explore_logic_hierarchy -create_module_boundary -nested -cell [get_cells -design [current_block] {u_top_sram_chiplet/u_pl_fwd_M1_m_tlx_m}] +change_selection [get_cells u_top_sram_chiplet/u_SRAM_wrapper] +explore_logic_hierarchy -create_module_boundary -nested -cell [get_cells -design [current_block] {u_top_sram_chiplet/u_SRAM_wrapper}] +explore_logic_hierarchy -place -rectangular +save_lib sram_chiplet.dlib diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/power_plan.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/power_plan.tcl new file mode 100644 index 0000000..b15c60c --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/power_plan.tcl @@ -0,0 +1,16 @@ +connect_pg_net -automatic + +create_pg_ring_pattern ring_pattern -horizontal_layer M7 -horizontal_width {5} -horizontal_spacing {2}\ + -vertical_layer M8 -vertical_width {5} -vertical_spacing {2} + +create_pg_mesh_pattern mesh_pattern -layers {{{vertical_layer: M8} {width: 1} {pitch: 30} {offset: 20}} \ + {{horizontal_layer: M5} {width: 1} {pitch: 30} {offset: 20}}} +create_pg_std_cell_conn_pattern std_pattern -layers M1 + +set_pg_strategy core_ring -pattern {{name: ring_pattern} {nets: {VDD VSS}} {offset: {3 3}}} -core +set_pg_strategy M5M8_mesh -pattern {{name: mesh_pattern} {nets: {VDD VSS}}} -core +set_pg_strategy std_cell_strat -core -pattern {{name: std_pattern} {nets: {VDD VSS}}} + +compile_pg -strategies core_ring +compile_pg -strategies M5M8_mesh +compile_pg -strategies std_cell_strat diff --git a/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/synopsys_lib_conversion.tcl b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/synopsys_lib_conversion.tcl new file mode 100644 index 0000000..b32ac35 --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/Synopsys_FC_flow/synopsys_lib_conversion.tcl @@ -0,0 +1,70 @@ +# Technology files +set cln28ht_tech_path /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln28ht/arm_tech/r1p0 +set cln28ht_tech_file $cln28ht_tech_path/milkyway/1p8m_5x2z_utalrdl/sc9mcpp140z_tech.tf +set cln28ht_lef_file $cln28ht_tech_path/lef/1p8m_5x2z_utalrdl/sc9mcpp140z_tech.lef + +# Standard Cell libraries +set sc9mcpp140z_base_path /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln28ht/sc9mcpp140z_base_svt_c35/r0p0 +set sc9mcpp140z_lef_file $sc9mcpp140z_base_path/lef/sc9mcpp140z_cln28ht_base_svt_c35.lef +set sc9mcpp140z_gds_file $sc9mcpp140z_base_path/gds2/sc9mcpp140z_cln28ht_base_svt_c35.gds2 +set sc9mcpp140z_db_file_ss_0p81v_125C $sc9mcpp140z_base_path/db/sc9mcpp140z_cln28ht_base_svt_c35_ssg_cworstt_max_0p81v_125c.db +set sc9mcpp140z_db_file_tt_0p90v_25C $sc9mcpp140z_base_path/db/sc9mcpp140z_cln28ht_base_svt_c35_tt_ctypical_max_0p90v_25c.db +set sc9mcpp140z_db_file_ff_0p99v_m40C $sc9mcpp140z_base_path/db/sc9mcpp140z_cln28ht_base_svt_c35_ffg_cbestt_min_0p99v_m40c.db +set sc9mcpp140z_antenna_file $sc9mcpp140z_base_path/milkyway/1p8m_5x2z_utalrdl/sc9mcpp140z_cln28ht_base_svt_c35_antenna.clf + +# SRAM files (using Arm compiler) +set sram_lef_file $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k.lef +set sram_gds_file $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k.gds2 +set sram_lib_file_ss_0p81v_125c $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k_ssg_cworstt_0p81v_0p81v_125c.lib +set sram_db_file_ss_0p81v_125c $env(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k_ssg_cworstt_0p81v_0p81v_125c.db + +# Synopsys PLL files +set Synopsys_PLL_dir /home/dwn1c21/SoC-Labs/Synopsys_ip/IP/PLL/synopsys/dwc_pll3ghz_tsmc28hpcp/1.10a/macro +set Synopsys_PLL_lef_file $Synopsys_PLL_dir/lef/5m4x0z/dwc_z19606ts_ns_merged.lef +set Synopsys_PLL_db_file $Synopsys_PLL_dir/timing/lib_pg/dwc_z19606ts_ns_ssg0p81v125c_cworst_pg.db +set Synopsys_PLL_gds_file $Synopsys_PLL_dir/gds/5m4x0z/dwc_z19606ts_ns.gds + +# Synopsys Temperature sensor files +set Synopsys_TS_dir /home/dwn1c21/SoC-Labs/Synopsys_ip/IP/Southampton_28hpcp_pd_vm_ts_vmps_pvtc/1.01b +set Synopsys_TS_lef_file $Synopsys_TS_dir/lef/mr74127.lef +set Synopsys_TS_lib_file $Synopsys_TS_dir/liberty/mr74127_wc_vmin_125c.lib +set Synopsys_TS_db_file $Synopsys_TS_dir/db/mr74127_wc_vmin_125c.db +set Synopsys_TS_gds_file $Synopsys_TS_dir/gdsii/mr74127_v1r1.gds + +# Synopsys Process detector Files +set Synopsys_PD_dir /home/dwn1c21/SoC-Labs/Synopsys_ip/IP/Southampton_28hpcp_pd_vm_ts_vmps_pvtc/dwc_sensors_pd_tsmc28hpcp_1.00a/synopsys/dwc_sensors_pd_tsmc28hpcp/1.00a +set Synopsys_PD_lef_file $Synopsys_PD_dir/lef/mr74125.lef +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 + + +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 + +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 + +read_lib $Synopsys_TS_lib_file +write_lib -output $Synopsys_TS_db_file -format db mr74127_wc_vmin_125c +close_lib -all +create_fusion_lib -dbs $Synopsys_TS_db_file -lefs $Synopsys_TS_lef_file -technology $cln28ht_tech_file Synopsys_TS +save_fusion_lib Synopsys_TS +close_fusion_lib Synopsys_TS + +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 diff --git a/ASIC/TSMC28nm_HPCP/constraints/sram_chiplet.sdc b/ASIC/TSMC28nm_HPCP/constraints/sram_chiplet.sdc new file mode 100644 index 0000000..4e60e01 --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/constraints/sram_chiplet.sdc @@ -0,0 +1,22 @@ +#----------------------------------------------------------------------------- +# NanoSoC Constraints for Synthesis +# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +# +# Contributors +# +# Daniel Newbrook (d.newbrook@soton.ac.uk) +# +# Copyright (C) 2021-3, SoC Labs (www.soclabs.org) +#----------------------------------------------------------------------------- + +#### CLOCK DEFINITION + +set EXTCLK "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 INTER_CLOCK_UNCERTAINTY 0.1 + +create_clock -name "$EXTCLK" -period "$EXTCLK_PERIOD" -waveform "0 0.5" [get_ports clk_in] diff --git a/ASIC/TSMC28nm_HPCP/sram_32b_16k.spec b/ASIC/TSMC28nm_HPCP/sram_32b_16k.spec new file mode 100644 index 0000000..56248fd --- /dev/null +++ b/ASIC/TSMC28nm_HPCP/sram_32b_16k.spec @@ -0,0 +1,47 @@ +# user spec file, compiler sram_sp_hde_2_svt_mvt, version r0p0 + +EOL_guardband = 0 +activity_factor = 10 +atf = off +back_biasing = off +bits = 32 +bmux = off +bus_notation = on +check_instname = on +compiler_type = sp +corners = ffg_cbestt_0p99v_0p99v_0c,ffg_cbestt_0p99v_0p99v_125c,ffg_cbestt_0p99v_0p99v_m40c,ffg_ctypical_0p90v_0p90v_85c,ffg_ctypical_0p99v_0p99v_125c,ssg_cworstt_0p81v_0p81v_0c,ssg_cworstt_0p81v_0p81v_125c,ssg_cworstt_0p81v_0p81v_m40c,tt_ctypical_0p81v_0p81v_0c,tt_ctypical_0p90v_0p90v_125c,tt_ctypical_0p90v_0p90v_25c,tt_ctypical_0p90v_0p90v_85c +cust_comment = +diodes = on +drive = 6 +ema = on +fci_type = not_fci +flexible_banking = 8 +frequency = 1000 +instname = sram_32b_16k +left_bus_delim = [ +libertyviewstyle = nldm +libname = sram_sp_hde +lren_bankmask = off +metal_stack = +mux = 8 +mvt = LL +name_case = upper +pipeline = off +power_gating = off +power_type = otc +prefix = +pwr_gnd_rename = vddpe:VDDPE,vddce:VDDCE,vsse:VSSE +rcols = 2 +redundancy = off +retention = on +right_bus_delim = ] +rows_p_bl = 256 +rrows = 0 +scan = off +ser = none +site_def = off +wa = off +words = 16384 +wp_size = 1 +write_mask = on +write_thru = off diff --git a/ASIC/TSMC28nm_HPCP/sram_32b_32k.spec b/ASIC/TSMC28nm_HPCP/sram_32b_32k.spec index 92253f8..45c7727 100644 --- a/ASIC/TSMC28nm_HPCP/sram_32b_32k.spec +++ b/ASIC/TSMC28nm_HPCP/sram_32b_32k.spec @@ -20,7 +20,7 @@ frequency = 500 instname = sram_32b_32k left_bus_delim = [ libertyviewstyle = nldm -libname = sram_sp_hde +libname = sram_32b_32k lren_bankmask = off metal_stack = mux = 16 diff --git a/flist/IP/SIE300.flist b/flist/IP/SIE300.flist index 1ae4565..a93beb0 100644 --- a/flist/IP/SIE300.flist +++ b/flist/IP/SIE300.flist @@ -2,23 +2,5 @@ $(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/models/cells/generic/sie300_arm_ $(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/models/cells/generic/sie300_arm_or2.v $(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/models/cells/generic/sie300_arm_sdff2yrpq.v $(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/models/cells/generic/sie300_arm_xor2.v -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/shared/verilog/sie300_or_tree/verilog/sie300_or_tree.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/shared/verilog/sie300_sync/verilog/sie300_sync.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_addr_dec.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_arb.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_arq.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_awq.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_axi_mux.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_bq.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_clamp.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_eam.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_fifo.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_fifo_core.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_lpi_ctrl.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_one_hot.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_rbeat.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_resp_gen.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_rq.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_wbeat.sv -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_wq.sv \ No newline at end of file + +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/IP/SIE300_sv.flist \ No newline at end of file diff --git a/flist/IP/SIE300_sv.flist b/flist/IP/SIE300_sv.flist new file mode 100644 index 0000000..85eb182 --- /dev/null +++ b/flist/IP/SIE300_sv.flist @@ -0,0 +1,20 @@ +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/shared/verilog/sie300_or_tree/verilog/sie300_or_tree.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/shared/verilog/sie300_sync/verilog/sie300_sync.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_addr_dec.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_arb.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_arq.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_awq.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_axi_mux.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_bq.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_clamp.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_eam.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_fifo.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_fifo_core.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_lpi_ctrl.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_one_hot.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_rbeat.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_resp_gen.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_rq.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_wbeat.sv +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SMC/logical/sie300_axi5_sram_ctrl_sram_chiplet/verilog/sie300_axi5_sram_ctrl_sram_chiplet_wq.sv diff --git a/flist/IP/Synopsys_VIP.flist b/flist/IP/Synopsys_VIP.flist new file mode 100644 index 0000000..87ea944 --- /dev/null +++ b/flist/IP/Synopsys_VIP.flist @@ -0,0 +1,11 @@ + ++incdir+/home/dwn1c21/SoC-Labs/Synopsys_ip/IP/Southampton_28hpcp_pd_vm_ts_vmps_pvtc/1.01b/model/verilog/ +/home/dwn1c21/SoC-Labs/Synopsys_ip/IP/Southampton_28hpcp_pd_vm_ts_vmps_pvtc/1.01b/model/verilog/mr74127.v + ++incdir+/home/dwn1c21/SoC-Labs/Synopsys_ip/IP/Southampton_28hpcp_pd_vm_ts_vmps_pvtc/dwc_sensors_pd_tsmc28hpcp_1.00a/synopsys/dwc_sensors_pd_tsmc28hpcp/1.00a/model/verilog +/home/dwn1c21/SoC-Labs/Synopsys_ip/IP/Southampton_28hpcp_pd_vm_ts_vmps_pvtc/dwc_sensors_pd_tsmc28hpcp_1.00a/synopsys/dwc_sensors_pd_tsmc28hpcp/1.00a/model/verilog/mr74125.v + ++incdir+/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/model/verilog +/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/model/verilog/mr74140.v + +/home/dwn1c21/SoC-Labs/Synopsys_ip/IP/PLL/synopsys/dwc_pll3ghz_tsmc28hpcp/1.10a/macro/behavior/dwc_z19606ts_ns_gtech.v \ No newline at end of file diff --git a/flist/Top/sram_chiplet.flist b/flist/Top/sram_chiplet.flist index e8c4654..258ec16 100644 --- a/flist/Top/sram_chiplet.flist +++ b/flist/Top/sram_chiplet.flist @@ -15,10 +15,7 @@ // ============= Verilog library extensions =========== +libext+.v+.vlib -+incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/interfaces - -// SRAM Chiplet top level -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/top_sram_chiplet/verilog/top_sram_chiplet.sv +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/Top/sram_chiplet_sv.flist // SRAM Chiplet - SRAM $(SOCLABS_SRAM_CHIPLET_DIR)/logical/SRAM/glib/verilog/SRAM_wrapper.v @@ -26,6 +23,12 @@ $(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 +$(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 +$(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/synopsys_TS_sensor_integration.v +$(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/synopsys_VM_sensor_integration.v +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/IP/Synopsys_VIP.flist // Testbench IP -f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/Top/sram_chiplet_vip.flist @@ -37,4 +40,5 @@ $(SOCLABS_SRAM_CHIPLET_DIR)/logical/sram_chiplet_apb_subsystem/verilog/sram_chip -f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/IP/NIC400.flist // SIE300 SRAM controller --f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/IP/SIE300.flist \ No newline at end of file +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/IP/SIE300.flist + diff --git a/flist/Top/sram_chiplet_TSMC28nm.flist b/flist/Top/sram_chiplet_TSMC28nm.flist index 8b11a2a..0ddb049 100644 --- a/flist/Top/sram_chiplet_TSMC28nm.flist +++ b/flist/Top/sram_chiplet_TSMC28nm.flist @@ -16,7 +16,7 @@ +libext+.v+.vlib // SRAM Chiplet top level -$(SOCLABS_SRAM_CHIPLET_DIR)/logical/top_sram_chiplet/verilog/top_sram_chiplet.v +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/Top/sram_chiplet_sv.flist // SRAM Chiplet - SRAM $(SOCLABS_SRAM_CHIPLET_DIR)/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v @@ -25,6 +25,12 @@ $(SOCLABS_SRAM_CHIPLET_DIR)/memories/sram_32b_32k_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)/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 +$(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/synopsys_VM_sensor_integration.v +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/IP/Synopsys_VIP.flist // Testbench IP -f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/Top/sram_chiplet_vip.flist diff --git a/flist/Top/sram_chiplet_TSMC28nm_ASIC.flist b/flist/Top/sram_chiplet_TSMC28nm_ASIC.flist new file mode 100644 index 0000000..59c67af --- /dev/null +++ b/flist/Top/sram_chiplet_TSMC28nm_ASIC.flist @@ -0,0 +1,41 @@ +//----------------------------------------------------------------------------- +// SRAM Chiplet IP Filelist for TSMC 28nm HPC+ +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Verilog Command File for NanoSoC IP +//----------------------------------------------------------------------------- + +// ============= Verilog library extensions =========== ++libext+.v+.vlib + +// SRAM Chiplet top level +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/Top/sram_chiplet_sv.flist + +// SRAM Chiplet - SRAM +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v +$(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)/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 +$(SOCLABS_SRAM_CHIPLET_DIR)/synopsys_28nm_slm_integration/IP_wrappers/synopsys_VM_sensor_integration.v + +// Thin links +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/IP/TLX400.flist + +// SRAM Chiplet - NIC400 +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/IP/NIC400.flist + +// SIE300 SRAM controller +-f $(SOCLABS_SRAM_CHIPLET_DIR)/flist/IP/SIE300.flist + diff --git a/flist/Top/sram_chiplet_sv.flist b/flist/Top/sram_chiplet_sv.flist new file mode 100644 index 0000000..d927cfc --- /dev/null +++ b/flist/Top/sram_chiplet_sv.flist @@ -0,0 +1,18 @@ +//----------------------------------------------------------------------------- +// SRAM Chiplet IP Filelist +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright � 2021-3, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Abstract : Verilog Command File for NanoSoC IP +//----------------------------------------------------------------------------- + ++incdir+$(SOCLABS_SRAM_CHIPLET_DIR)/logical/interfaces + +// SRAM Chiplet top level +$(SOCLABS_SRAM_CHIPLET_DIR)/logical/top_sram_chiplet/verilog/top_sram_chiplet.sv diff --git a/flows/makefile.asic b/flows/makefile.asic index bea50ad..ebd3767 100644 --- a/flows/makefile.asic +++ b/flows/makefile.asic @@ -11,19 +11,41 @@ SYNOPSYS_OUTPUT_FILELIST := $(TCL_ASIC_FLIST_DIR)/synopsys_flist.tcl # Location of Macros MEMORIES_DIR := $(SOCLABS_SRAM_CHIPLET_DIR)/memories -SRAM_SPEC_FILE := $(SOCLABS_SRAM_CHIPLET_DIR)/ASIC/TSMC28nm_HPCP/sram_32b_32k.spec +MEM_32K_DIR := $(MEMORIES_DIR)/sram_32b_32k +MEM_16K_DIR := $(MEMORIES_DIR)/sram_32b_16k + +SRAM_32K_SPEC_FILE := $(SOCLABS_SRAM_CHIPLET_DIR)/ASIC/TSMC28nm_HPCP/sram_32b_32k.spec +SRAM_16K_SPEC_FILE := $(SOCLABS_SRAM_CHIPLET_DIR)/ASIC/TSMC28nm_HPCP/sram_32b_16k.spec flist_synopsys: @mkdir -p $(TCL_ASIC_FLIST_DIR) @(cd $(TCL_ASIC_FLIST_DIR); \ - $(SOCLABS_SOCTOOLS_FLOW_DIR)/bin/filelist_compile.py -t -s -a -f $(DESIGN_VC) -o $(SYNOPSYS_OUTPUT_FILELIST) -i $(FLIST_INCLUDES) -r $(IMP_SRAM_CHIPLET_ASIC_DIR)/src;) + $(SOCLABS_SOCTOOLS_FLOW_DIR)/bin/filelist_compile.py -t -s -a -f $(DESIGN_VC_ASIC) -o $(SYNOPSYS_OUTPUT_FILELIST) -i $(FLIST_INCLUDES) -r $(IMP_SRAM_CHIPLET_ASIC_DIR)/src;) + +gen_memories_frontend: + @mkdir -p $(MEMORIES_DIR) + @mkdir -p $(MEM_32K_DIR) + @mkdir -p $(MEM_16K_DIR) + echo "Generating 32K SRAM Memory" + cd $(MEM_32K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt ascii -spec $(SRAM_32K_SPEC_FILE) + cd $(MEM_32K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt emulation -spec $(SRAM_32K_SPEC_FILE) + cd $(MEM_32K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt verilog -spec $(SRAM_32K_SPEC_FILE) + cd $(MEM_32K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt liberty -spec $(SRAM_32K_SPEC_FILE) + echo "Generating 16K SRAM Memory" + cd $(MEM_16K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt ascii -spec $(MEM_16K_DIR) + cd $(MEM_16K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt emulation -spec $(MEM_16K_DIR) + cd $(MEM_16K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt verilog -spec $(MEM_16K_DIR) + cd $(MEM_16K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt liberty -spec $(MEM_16K_DIR) -gen_memories: +gen_memories_backend: @mkdir -p $(MEMORIES_DIR) - echo "Generating SRAM Memory" - cd $(MEMORIES_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt ascii -spec $(SRAM_SPEC_FILE) - cd $(MEMORIES_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt emulation -spec $(SRAM_SPEC_FILE) - cd $(MEMORIES_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt verilog -spec $(SRAM_SPEC_FILE) - cd $(MEMORIES_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt liberty -spec $(SRAM_SPEC_FILE) - cd $(MEMORIES_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt lef-fp -spec $(SRAM_SPEC_FILE) - cd $(MEMORIES_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt gds2 -spec $(SRAM_SPEC_FILE) + @mkdir -p $(MEM_32K_DIR) + @mkdir -p $(MEM_16K_DIR) + echo "Generating 32K SRAM Memory" + cd $(MEM_32K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt lef-fp -spec $(SRAM_32K_SPEC_FILE) + cd $(MEM_32K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt gds2 -spec $(SRAM_32K_SPEC_FILE) + echo "Generating 16K SRAM Memory" + cd $(MEM_16K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt lef-fp -spec $(MEM_16K_DIR) + cd $(MEM_16K_DIR); $(PHYS_IP)/arm/tsmc/cln28ht/sram_sp_hde_2_svt_mvt/r0p0/bin/sram_sp_hde_2_svt_mvt gds2 -spec $(MEM_16K_DIR) + +gen_memories: gen_memories_frontend gen_memories_backend \ No newline at end of file diff --git a/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v b/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v index 08ab779..99cea2b 100644 --- a/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v +++ b/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM.v @@ -10,6 +10,7 @@ module SRAM ( ); localparam N_MEMS = 8; +localparam SEL_W = 3; reg [N_MEMS-1:0] CEN_i; //Active low chip select wire [31:0] wena_i; @@ -26,7 +27,7 @@ generate for(i=0; i<N_MEMS; i = i + 1) begin: g_srams .CLK(clk), .CEN(CEN_i[i]), .GWEN(gwen_i), - .A(memaddr[14:0]), + .A(memaddr[16:2]), .D(memd), .WEN(wena_i), .STOV(1'b0), @@ -38,97 +39,15 @@ generate for(i=0; i<N_MEMS; i = i + 1) begin: g_srams end endgenerate +integer j; always @(*) begin - case(memaddr[20:15]) - 6'h00 : begin - CEN_i[0]=memcen; - CEN_i[1]=1'b1; - CEN_i[2]=1'b1; - CEN_i[3]=1'b1; - CEN_i[4]=1'b1; - CEN_i[5]=1'b1; - CEN_i[6]=1'b1; - CEN_i[7]=1'b1; - memq = q_i[0]; - end - 6'h01 : begin - CEN_i[0]=1'b1; - CEN_i[1]=memcen; - CEN_i[2]=1'b1; - CEN_i[3]=1'b1; - CEN_i[4]=1'b1; - CEN_i[5]=1'b1; - CEN_i[6]=1'b1; - CEN_i[7]=1'b1; - memq = q_i[1]; - end - 6'h02 : begin - CEN_i[0]=1'b1; - CEN_i[1]=1'b1; - CEN_i[2]=memcen; - CEN_i[3]=1'b1; - CEN_i[4]=1'b1; - CEN_i[5]=1'b1; - CEN_i[6]=1'b1; - CEN_i[7]=1'b1; - memq = q_i[2]; - end - 6'h03 : begin - CEN_i[0]=1'b1; - CEN_i[1]=1'b1; - CEN_i[2]=1'b1; - CEN_i[3]=memcen; - CEN_i[4]=1'b1; - CEN_i[5]=1'b1; - CEN_i[6]=1'b1; - CEN_i[7]=1'b1; - memq = q_i[3]; - end - 6'h04 : begin - CEN_i[0]=1'b1; - CEN_i[1]=1'b1; - CEN_i[2]=1'b1; - CEN_i[3]=1'b1; - CEN_i[4]=memcen; - CEN_i[5]=1'b1; - CEN_i[6]=1'b1; - CEN_i[7]=1'b1; - memq = q_i[4]; - end - 6'h05 : begin - CEN_i[0]=1'b1; - CEN_i[1]=1'b1; - CEN_i[2]=1'b1; - CEN_i[3]=1'b1; - CEN_i[4]=1'b1; - CEN_i[5]=memcen; - CEN_i[6]=1'b1; - CEN_i[7]=1'b1; - memq = q_i[5]; - end - 6'h06 : begin - CEN_i[0]=1'b1; - CEN_i[1]=1'b1; - CEN_i[2]=1'b1; - CEN_i[3]=1'b1; - CEN_i[4]=1'b1; - CEN_i[5]=1'b1; - CEN_i[6]=memcen; - CEN_i[7]=1'b1; - memq = q_i[6]; - end - 6'h07 : begin - CEN_i[0]=1'b1; - CEN_i[1]=1'b1; - CEN_i[2]=1'b1; - CEN_i[3]=1'b1; - CEN_i[4]=1'b1; - CEN_i[5]=1'b1; - CEN_i[6]=1'b1; - CEN_i[7]=memcen; - memq = q_i[7]; - end - endcase + for(j=0; j<N_MEMS; 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]]; end endmodule diff --git a/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v b/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v index 1615cb2..b5bc425 100644 --- a/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v +++ b/logical/SRAM/TSMC28nm_hpcp/verilog/SRAM_wrapper.v @@ -18,7 +18,7 @@ module SRAM_wrapper( input wire AWVALID, output wire AWREADY, - input wire [4:0] AWID, + input wire [3:0] AWID, input wire [31:0] AWADDR, input wire [7:0] AWLEN, input wire [2:0] AWSIZE, @@ -36,12 +36,12 @@ module SRAM_wrapper( output wire BVALID, input wire BREADY, - output wire [4:0] BID, + output wire [3:0] BID, output wire [1:0] BRESP, input wire ARVALID, output wire ARREADY, - input wire [4:0] ARID, + input wire [3:0] ARID, input wire [31:0] ARADDR, input wire [7:0] ARLEN, input wire [2:0] ARSIZE, @@ -52,7 +52,7 @@ module SRAM_wrapper( output wire RVALID, input wire RREADY, - output wire [4:0] RID, + output wire [3:0] RID, output wire [31:0] RDATA, output wire [1:0] RRESP, output wire RLAST, diff --git a/logical/SRAM/glib/verilog/SRAM.v b/logical/SRAM/glib/verilog/SRAM.v index 42fd655..a7ec6e0 100644 --- a/logical/SRAM/glib/verilog/SRAM.v +++ b/logical/SRAM/glib/verilog/SRAM.v @@ -28,6 +28,15 @@ module SRAM ( reg [31:0] mem [MEM_DEPTH-1:0]; assign WriteEnable = (memwen != {4{1'b1}}) ? 1'b1 : 1'b0; +`ifdef INITIALIZE_MEMORY + integer i; + initial begin + #0; + for(i=0;i < MEM_DEPTH;i = i + 1) + mem[i] = {32{1'b0}}; + end +`endif + always @ (posedge clk) begin : p_memaccess // Only access the memory when the chip is enabled 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 8c366c7..566c48a 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,6 +1,251 @@ module sram_chiplet_apb_subsystem( + input wire ref_clk, + input wire PCLK, + input wire aRESETn, + input wire [31:0] PADDR_APB_PVT, + input wire [31:0] PWDATA_APB_PVT, + input wire PWRITE_APB_PVT, + input wire [2:0] PPROT_APB_PVT, + input wire [3:0] PSTRB_APB_PVT, + input wire PENABLE_APB_PVT, + input wire PSELx_APB_PVT, + output wire [31:0] PRDATA_APB_PVT, + output wire PSLVERR_APB_PVT, + output wire PREADY_APB_PVT ); +localparam SNPS_PVT_TS_0_ENABLE=1; +localparam SNPS_PVT_PD_0_ENABLE=1; +localparam SNPS_PVT_VM_0_ENABLE=1; +localparam SNPS_PLL_ENABLE=1; + +wire snps_PVT_ts0_psel; +wire snps_PVT_ts0_pready; +wire [31:0] snps_PVT_ts0_prdata; +wire snps_PVT_ts0_pslverr; + +wire snps_PVT_pd0_psel; +wire snps_PVT_pd0_pready; +wire [31:0] snps_PVT_pd0_prdata; +wire snps_PVT_pd0_pslverr; + +wire snps_PVT_vm0_psel; +wire snps_PVT_vm0_pready; +wire [31:0] snps_PVT_vm0_prdata; +wire snps_PVT_vm0_pslverr; + +wire snps_PLL_psel; +wire snps_PLL_pready; +wire [31:0] snps_PLL_prdata; +wire snps_PLL_pslverr; + + +cmsdk_apb_slave_mux #( + .PORT0_ENABLE (SNPS_PVT_TS_0_ENABLE), + .PORT1_ENABLE (0), + .PORT2_ENABLE (0), + .PORT3_ENABLE (0), + .PORT4_ENABLE (0), + .PORT5_ENABLE (0), + .PORT6_ENABLE (SNPS_PVT_PD_0_ENABLE), + .PORT7_ENABLE (SNPS_PVT_VM_0_ENABLE), + .PORT8_ENABLE (SNPS_PLL_ENABLE), + .PORT9_ENABLE (0), + .PORT10_ENABLE (0), + .PORT11_ENABLE (0), + .PORT12_ENABLE (0), + .PORT13_ENABLE (0), + .PORT14_ENABLE (0), + .PORT15_ENABLE (0) +) u_apb_PVT_slave_mux ( + // Inputs + .DECODE4BIT (PADDR_APB_PVT[15:12]), + .PSEL (PSELx_APB_PVT), + // PSEL (output) and return status & data (inputs) for each port + .PSEL0 (snps_PVT_ts0_psel), + .PREADY0 (snps_PVT_ts0_pready), + .PRDATA0 (snps_PVT_ts0_prdata), + .PSLVERR0 (snps_PVT_ts0_pslverr), + + .PSEL1 (), + .PREADY1 (1'b1), + .PRDATA1 ({32{1'b0}}), + .PSLVERR1 (1'b1), + + .PSEL2 (), + .PREADY2 (1'b1), + .PRDATA2 ({32{1'b0}}), + .PSLVERR2 (1'b1), + + .PSEL3 (), + .PREADY3 (1'b1), + .PRDATA3 ({32{1'b0}}), + .PSLVERR3 (1'b1), + + .PSEL4 (), + .PREADY4 (1'b1), + .PRDATA4 ({32{1'b0}}), + .PSLVERR4 (1'b1), + + .PSEL5 (), + .PREADY5 (1'b1), + .PRDATA5 ({32{1'b0}}), + .PSLVERR5 (1'b1), + + .PSEL6 (snps_PVT_pd0_psel), + .PREADY6 (snps_PVT_pd0_pready), + .PRDATA6 (snps_PVT_pd0_prdata), + .PSLVERR6 (snps_PVT_pd0_pslverr), + + .PSEL7 (snps_PVT_vm0_psel), + .PREADY7 (snps_PVT_vm0_pready), + .PRDATA7 (snps_PVT_vm0_prdata), + .PSLVERR7 (snps_PVT_vm0_pslverr), + + .PSEL8 (snps_PLL_psel), + .PREADY8 (snps_PLL_pready), + .PRDATA8 (snps_PLL_prdata), + .PSLVERR8 (snps_PLL_pslverr), + + .PSEL9 (), + .PREADY9 (1'b1), + .PRDATA9 ({32{1'b0}}), + .PSLVERR9 (1'b1), + + .PSEL10 (), + .PREADY10 (1'b1), + .PRDATA10 ({32{1'b0}}), + .PSLVERR10 (1'b1), + + .PSEL11 (), + .PREADY11 (1'b1), + .PRDATA11 ({32{1'b0}}), + .PSLVERR11 (1'b1), + + .PSEL12 (), + .PREADY12 (1'b1), + .PRDATA12 ({32{1'b0}}), + .PSLVERR12 (1'b1), + + .PSEL13 (), + .PREADY13 (1'b1), + .PRDATA13 ({32{1'b0}}), + .PSLVERR13 (1'b1), + + .PSEL14 (), + .PREADY14 (1'b1), + .PRDATA14 ({32{1'b0}}), + .PSLVERR14 (1'b1), + + .PSEL15 (), + .PREADY15 (1'b1), + .PRDATA15 ({32{1'b0}}), + .PSLVERR15 (1'b1), + + // Output + .PREADY (PREADY_APB_PVT), + .PRDATA (PRDATA_APB_PVT), + .PSLVERR (PSLVERR_APB_PVT) + ); + +generate if(SNPS_PVT_TS_0_ENABLE==1)begin: gen_snps_PVT_ts0 + synopsys_TS_sensor_integration u_snps_PVT_ts0( + .PCLK(PCLK), + .aRESETn(aRESETn), + + .PSELx(snps_PVT_ts0_psel), + .PADDR(PADDR_APB_PVT[3:2]), + .PENABLE(PENABLE_APB_PVT), + .PPROT(PPROT_APB_PVT), + .PSTRB(PSTRB_APB_PVT), + .PWRITE(PWRITE_APB_PVT), + .PWDATA(PWDATA_APB_PVT), + .PRDATA(snps_PVT_ts0_prdata), + .PREADY(snps_PVT_ts0_pready), + .PSLVERR(snps_PVT_ts0_pslverr), + + .ts_vcal(TS_VCAL), + .ts_an_test_0(), + .ts_an_test_1(), + .ts_an_test_2(), + .ts_an_test_3(), + .ts_vss_sense(TS_VSS_SENSE), + .irq_ts_rdy(irq_ts_rdy) + ); +end else begin: gen_no_snps_PVT_ts0 + assign snps_PVT_ts0_prdata = {32{1'b0}}; + assign snps_PVT_ts0_pready = 1'b1; + assign snps_PVT_ts0_pslverr = 1'b1; + assign irq_ts_rdy = 1'b0; +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), + .aRESETn(aRESETn), + .PSELx(snps_PVT_pd0_psel), + .PADDR(PADDR_APB_PVT[3:2]), + .PENABLE(PENABLE_APB_PVT), + .PPROT(PPROT_APB_PVT), + .PSTRB(PSTRB_APB_PVT), + .PWRITE(PWRITE_APB_PVT), + .PWDATA(PWDATA_APB_PVT), + .PRDATA(snps_PVT_pd0_prdata), + .PREADY(snps_PVT_pd0_pready), + .PSLVERR(snps_PVT_pd0_pslverr), + .irq_pd_rdy(irq_pd_rdy) + ); +end else begin: gen_no_snps_PVT_pd0 + assign snps_PVT_pd0_prdata = {32{1'b0}}; + assign snps_PVT_pd0_pready = 1'b1; + assign snps_PVT_pd0_pslverr = 1'b1; + assign irq_pd_rdy = 1'b0; +end endgenerate + +generate if(SNPS_PVT_VM_0_ENABLE==1)begin: gen_snps_PVT_vm0 + + +end else begin: gen_no_snps_PVT_vm0 + assign snps_PVT_vm0_prdata = {32{1'b0}}; + assign snps_PVT_vm0_pready = 1'b1; + assign snps_PVT_vm0_pslverr = 1'b1; + assign irq_vm_rdy = 1'b0; +end endgenerate + +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) + .DEFAULT_DIVVCOP(4'h0), // Divider = 1 + .DEFAULT_DIVVCOR(4'h0), // Divider = 1 + .DEFAULT_P(6'h01), // Divider = 2 (out 1 GHz) + .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), + .resetn(aRESETn), + .pll_lock(), + + .out_clk1(), + .out_clk2(), + + .PSELx(snps_PLL_psel), + .PADDR(PADDR_APB_PVT[11:2]), + .PENABLE(PENABLE_APB_PVT), + .PPROT(PPROT_APB_PVT), + .PSTRB(PSTRB_APB_PVT), + .PWRITE(PWRITE_APB_PVT), + .PWDATA(PWDATA_APB_PVT), + .PRDATA(snps_PLL_prdata), + .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; +end endgenerate + + 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 9c80679..34510f4 100644 --- a/logical/top_sram_chiplet/verilog/top_sram_chiplet.sv +++ b/logical/top_sram_chiplet/verilog/top_sram_chiplet.sv @@ -488,7 +488,18 @@ nic400_cd_pl_fwd_M1_m_tlx_tlx_sram_chiplet u_pl_fwd_M1_m_tlx_m( ); sram_chiplet_apb_subsystem u_sram_chiplet_apb_subsystem( - + .PCLK(SYS_CLK), + .aRESETn(aRESETn), + .PADDR_APB_PVT(PADDR_APB_PVT), + .PWDATA_APB_PVT(PWDATA_APB_PVT), + .PWRITE_APB_PVT(PWRITE_APB_PVT), + .PPROT_APB_PVT(PPROT_APB_PVT), + .PSTRB_APB_PVT(PSTRB_APB_PVT), + .PENABLE_APB_PVT(PENABLE_APB_PVT), + .PSELx_APB_PVT(PSELx_APB_PVT), + .PRDATA_APB_PVT(PRDATA_APB_PVT), + .PSLVERR_APB_PVT(PSLVERR_APB_PVT), + .PREADY_APB_PVT(PREADY_APB_PVT) ); SRAM_wrapper u_SRAM_wrapper( diff --git a/makefile b/makefile index c389567..f60a4ca 100644 --- a/makefile +++ b/makefile @@ -43,6 +43,7 @@ SIM_DIR ?= $(SIM_TOP_DIR) ifeq ($(ASIC),yes) + DESIGN_VC_ASIC ?= $(SOCLABS_SRAM_CHIPLET_DIR)/flist/Top/sram_chiplet_TSMC28nm_ASIC.flist DESIGN_VC ?= $(SOCLABS_SRAM_CHIPLET_DIR)/flist/Top/sram_chiplet_TSMC28nm.flist else DESIGN_VC ?= $(SOCLABS_SRAM_CHIPLET_DIR)/flist/Top/sram_chiplet.flist diff --git a/pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv b/pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv new file mode 100644 index 0000000..e344f36 --- /dev/null +++ b/pad_level/tsmc28nm_hpcp/SRAM_chiplet.sv @@ -0,0 +1,145 @@ +//----------------------------------------------------------------------------- +// Top pad level of SRAM chiplet for TSMC 28nm HPC+ +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// Daniel Newbrook (d.newbrook@soton.ac.uk) +// +// Copyright (C) 2021-4, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- + +`include "tlx_interfaces.sv" +module SRAM_chiplet( +`ifdef POWER_PINS + inout wire VDDIO, + inout wire VSSIO, + inout wire VDD, + inout wire VSS, +`endif + input wire clk_in, + input wire aresetn, + + // TLX_IN_data_rev_0 tlx out + output wire [15:0] TLX_IN_data_rev_0_tdata, + output wire TLX_IN_data_rev_0_tvalid, + input wire TLX_IN_data_rev_0_tready, + + //TLX_IN_flow_rev_0 tlx out + output wire [2:0] TLX_IN_flow_rev_0_tdata, + output wire TLX_IN_flow_rev_0_tvalid, + input wire TLX_IN_flow_rev_0_tready, + + //tlx in + input wire [1:0] TLX_IN_flow_fwd_0_tdata, + input wire TLX_IN_flow_fwd_0_tvalid, + output wire TLX_IN_flow_fwd_0_tready, + + //tlx in + input wire [15:0] TLX_IN_data_fwd_0_tdata, + input wire TLX_IN_data_fwd_0_tvalid, + output wire TLX_IN_data_fwd_0_tready, + + //tlx in + input wire [15:0] TLX_data_rev_1_tdata, + input wire TLX_data_rev_1_tvalid, + output wire TLX_data_rev_1_tready, + + //tlx in + input wire [2:0] TLX_flow_rev_1_tdata, + input wire TLX_flow_rev_1_tvalid, + output wire TLX_flow_rev_1_tready, + + // tlx out + output wire [1:0] TLX_flow_fwd_1_tdata, + output wire TLX_flow_fwd_1_tvalid, + input wire TLX_flow_fwd_1_tready, + + // 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 +); + + +// 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(); + + // TLX_IN_data_rev_0 tlx out +assign TLX_IN_data_rev_0_tdata = TLX_IN_data_rev_0.tdata; +assign TLX_IN_data_rev_0_tvalid = TLX_IN_data_rev_0.tvalid; +assign TLX_IN_data_rev_0.tready = TLX_IN_data_rev_0_tready; + + //TLX_IN_flow_rev_0 tlx out +assign TLX_IN_flow_rev_0_tdata = TLX_IN_flow_rev_0.tdata; +assign TLX_IN_flow_rev_0_tvalid = TLX_IN_flow_rev_0.tvalid; +assign TLX_IN_flow_rev_0.tready = TLX_IN_flow_rev_0_tready; + + //tlx in +assign TLX_IN_flow_fwd_0.tdata = TLX_IN_flow_fwd_0_tdata; +assign TLX_IN_flow_fwd_0.tvalid = TLX_IN_flow_fwd_0_tvalid; +assign TLX_IN_flow_fwd_0_tready = TLX_IN_flow_fwd_0.tready; + + //tlx in +assign TLX_IN_data_fwd_0.tdata = TLX_IN_data_fwd_0_tdata; +assign TLX_IN_data_fwd_0.tvalid = TLX_IN_data_fwd_0_tvalid; +assign TLX_IN_data_fwd_0_tready = TLX_IN_data_fwd_0.tready; + + //tlx in +assign TLX_data_rev_1.tdata = TLX_data_rev_1_tdata; +assign TLX_data_rev_1.tvalid = TLX_data_rev_1_tvalid; +assign TLX_data_rev_1_tready = TLX_data_rev_1.tready; + + //tlx in +assign TLX_flow_rev_1.tdata = TLX_flow_rev_1_tdata; +assign TLX_flow_rev_1.tvalid = TLX_flow_rev_1_tvalid; +assign TLX_flow_rev_1_tready = TLX_flow_rev_1.tready; + + // tlx out +assign TLX_flow_fwd_1_tdata = TLX_flow_fwd_1.tdata; +assign TLX_flow_fwd_1_tvalid = TLX_flow_fwd_1.tvalid; +assign TLX_flow_fwd_1.tready = TLX_flow_fwd_1_tready; + + // tlx out +assign TLX_data_fwd_1_tdata = TLX_data_fwd_1.tdata; +assign TLX_data_fwd_1_tvalid = TLX_data_fwd_1.tvalid; +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), + + // 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), + + // FT1248 + + + // Address Select pins + .addr_sel(3'b000) +); + +endmodule \ No newline at end of file diff --git a/pad_level/tsmc28nm_hpcp/SRAM_chiplet.v b/pad_level/tsmc28nm_hpcp/SRAM_chiplet.v deleted file mode 100644 index 3dadbfe..0000000 --- a/pad_level/tsmc28nm_hpcp/SRAM_chiplet.v +++ /dev/null @@ -1,53 +0,0 @@ -//----------------------------------------------------------------------------- -// Top pad level of SRAM chiplet for TSMC 28nm HPC+ -// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. -// -// Contributors -// -// Daniel Newbrook (d.newbrook@soton.ac.uk) -// -// Copyright (C) 2021-4, SoC Labs (www.soclabs.org) -//----------------------------------------------------------------------------- - -module SRAM_chiplet( -`ifdef POWER_PINS - inout wire VDDIO, - inout wire VSSIO, - inout wire VDD, - inout wire VSS, -`endif - -); - - - -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), - - // Axi stream master (tdata out) from PL - .tvalid_pl_rev_m1_m_tlx_m_stream(tvalid_pl_rev_m1_m_tlx_m_stream), - .tready_pl_rev_m1_m_tlx_m_stream(tready_pl_rev_m1_m_tlx_m_stream), - .tdata_pl_rev_m1_m_tlx_m_stream(tdata_pl_rev_m1_m_tlx_m_stream), - - // Axi Stream master (tdata out) from PL - .tvalid_pl_rev_m1_m_tlx_m_flow(tvalid_pl_rev_m1_m_tlx_m_flow), - .tready_pl_rev_m1_m_tlx_m_flow(tready_pl_rev_m1_m_tlx_m_flow), - .tdata_pl_rev_m1_m_tlx_m_flow(tdata_pl_rev_m1_m_tlx_m_flow), - - // Axi Stream Slave (tdata in) to DL - .tvalid_m1_m_tlx_pl_fwd_to_dl_fwd_flow(tvalid_m1_m_tlx_pl_fwd_to_dl_fwd_flow), - .tready_m1_m_tlx_pl_fwd_to_dl_fwd_flow(tready_m1_m_tlx_pl_fwd_to_dl_fwd_flow), - .tdata_m1_m_tlx_pl_fwd_to_dl_fwd_flow(tdata_m1_m_tlx_pl_fwd_to_dl_fwd_flow), - - // Axi Stream slave (tdata in) to DL - .tvalid_m1_m_tlx_pl_fwd_to_dl_fwd_data(tvalid_m1_m_tlx_pl_fwd_to_dl_fwd_data), - .tready_m1_m_tlx_pl_fwd_to_dl_fwd_data(tready_m1_m_tlx_pl_fwd_to_dl_fwd_data), - .tdata_m1_m_tlx_pl_fwd_to_dl_fwd_data(tdata_m1_m_tlx_pl_fwd_to_dl_fwd_data) -); - -endmodule \ No newline at end of file diff --git a/synopsys_28nm_slm_integration b/synopsys_28nm_slm_integration new file mode 160000 index 0000000..e9f59a1 --- /dev/null +++ b/synopsys_28nm_slm_integration @@ -0,0 +1 @@ +Subproject commit e9f59a1bd14b8350d3b493a42943fcfef07de5ba diff --git a/verif/cocotb/makefile b/verif/cocotb/makefile index b188645..3a69115 100644 --- a/verif/cocotb/makefile +++ b/verif/cocotb/makefile @@ -32,7 +32,8 @@ TOPLEVEL = sram_chiplet_cocotb MODULE = sram_chiplet_tests VERILOG_SOURCES += ./sram_chiplet_cocotb.sv - +EXTRA_ARGS += +define+BEHAVIOURAL_SIM +EXTRA_ARGS += +define+INITIALIZE_MEMORY ifeq ($(SIM), icarus) PLUSARGS += -fst diff --git a/verif/cocotb/sram_chiplet_tests.py b/verif/cocotb/sram_chiplet_tests.py index 429d946..71921bc 100644 --- a/verif/cocotb/sram_chiplet_tests.py +++ b/verif/cocotb/sram_chiplet_tests.py @@ -25,6 +25,15 @@ 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_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 +CHIPLET_0_PLL_BASE = CHIPLET_0_APB_BASE + 8*0x1000 + +CHIPLET_0_SRAM_MAX_ADDR = 0x100000 + class TB: def __init__(self,dut): self.dut = dut @@ -32,7 +41,7 @@ class TB: self.log = logging.getLogger("cocotb.tb") self.log.setLevel(logging.DEBUG) - cocotb.start_soon(Clock(dut.clk_in, 1, units="ns").start()) + cocotb.start_soon(Clock(dut.clk_in, 4, 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: @@ -50,10 +59,7 @@ class TB: self.axi_ram.read_if.ar_channel.set_pause_generator(generator()) async def cycle_reset(self): self.dut.aresetn.setimmediatevalue(0) - await RisingEdge(self.dut.clk_in) - await RisingEdge(self.dut.clk_in) - await RisingEdge(self.dut.clk_in) - await RisingEdge(self.dut.clk_in) + await Timer(time=4,units='us') self.dut.aresetn.value = 1 await RisingEdge(self.dut.clk_in) async def delay(self, cycle): @@ -62,13 +68,13 @@ class TB: async def init_sram(dut, tb, base_addr, size=0x8000): data = bytearray([0]*2048) - for offset in range(0, size-0x800, 0x800): + for offset in range(0, size, 0x800): await tb.axi_master.write(base_addr+offset, data) await RisingEdge(dut.clk_in) async def SRAM_test_write(dut, tb, base_addr, byte_lanes, size): for length in list(range(1, byte_lanes*2))+[8192]: - for offset in list(range(byte_lanes))+list(range(0x1EE000-byte_lanes, 0x1EE000)): + for offset in list(range(byte_lanes))+list(range(CHIPLET_0_SRAM_MAX_ADDR-0x20000, CHIPLET_0_SRAM_MAX_ADDR-0x20000+byte_lanes)): tb.log.info("length %d, offset %d", length, offset) addr = offset + base_addr test_data = bytearray([x % 256 for x in range(length)]) @@ -79,7 +85,149 @@ async def SRAM_test_write(dut, tb, base_addr, byte_lanes, size): await RisingEdge(dut.clk_in) await RisingEdge(dut.clk_in) + +async def SRAM_bank_test(dut, tb, bank_addrs): + length = 2048 + data = bytearray([x % 256 for x in range(length)]) + for bank_addr in 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 +@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) + # 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' + + # Wait for PLL Lock + PLL_LOCK = await tb.axi_master.read(CHIPLET_0_PLL_BASE+24,1) + tb.log.info(PLL_LOCK.data) + while (PLL_LOCK.data == b'\x00'): + await Timer(time=100, units='ns') + PLL_LOCK = await tb.axi_master.read(CHIPLET_0_PLL_BASE+24,1) + # Read write to register + PLL_0 = await tb.axi_master.read(CHIPLET_0_PLL_BASE,4) + tb.log.info(PLL_0.data) + await tb.axi_master.write(CHIPLET_0_PLL_BASE, bytearray(b'\x31\x00\x00\x00'), 4) + # Read write to PLL internal register + PLL_800 = await tb.axi_master.read(CHIPLET_0_PLL_BASE + 0x800, 4) + await tb.axi_master.write(CHIPLET_0_PLL_BASE + 0x800, bytearray(b'\x31\x00\x00\x00'), 4) + + +@cocotb.test() +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 + + await tb.cycle_reset() + tb.set_idle_generator(idle_insterter) + tb.set_backpressure_generator(backpressure_inserter) + + # Test ID of PD integration layer + PD_ID = await tb.axi_master.read(CHIPLET_0_PD_BASE+0xC,4) + assert PD_ID.data == b'dpns' + + # Check config registers + PD_CONFIG = await tb.axi_master.read(CHIPLET_0_PD_BASE+0x8,4) + tb.log.info(PD_CONFIG.data) + + # Enable PD + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE,4) + PD_STATUS_WRITE=bytearray(PD_STATUS.data) + PD_STATUS_WRITE[0] = PD_STATUS_WRITE[0]^1 + await tb.axi_master.write(CHIPLET_0_PD_BASE, PD_STATUS_WRITE, 4) + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE, 4) + tb.log.info(PD_STATUS.data[0]) + + # Load config + PD_REGS = await tb.axi_master.read(CHIPLET_0_PD_BASE + 0x8, 4) + PD_REGS_WRITE = bytearray(PD_REGS.data) + PD_REGS_WRITE[3] = PD_REGS_WRITE[3] ^ 1 + await tb.axi_master.write(CHIPLET_0_PD_BASE + 0x8, PD_REGS_WRITE, 4) + PD_REGS = await tb.axi_master.read(CHIPLET_0_PD_BASE + 0x8, 4) + PD_REGS_WRITE = bytearray(PD_REGS.data) + PD_REGS_WRITE[3] = PD_REGS_WRITE[3] ^ 1 + await tb.axi_master.write(CHIPLET_0_PD_BASE + 0x8, PD_REGS_WRITE, 4) + + # Start PD + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE,4) + PD_STATUS_WRITE=bytearray(PD_STATUS.data) + PD_STATUS_WRITE[0] = PD_STATUS_WRITE[0]^2 + await tb.axi_master.write(CHIPLET_0_PD_BASE, PD_STATUS_WRITE, 4) + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE,4) + while(PD_STATUS.data[3] != 1): + await Timer(time=100, units='ns') + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE,4) + + PD_DATA = await tb.axi_master.read(CHIPLET_0_PD_BASE + 0x4, 4) + prescaler = 32 + window_size = 63 + f_clk = 250/42 + + pd_out = PD_DATA.data[0] + PD_DATA.data[1]*pow(2,8) + frequency = pd_out * prescaler * f_clk / window_size + tb.log.info(frequency) + + # Clear ready reg + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE,4) + PD_STATUS_WRITE=bytearray(PD_STATUS.data) + PD_STATUS_WRITE[0] = PD_STATUS_WRITE[0]^8 + await tb.axi_master.write(CHIPLET_0_PD_BASE, PD_STATUS_WRITE, 4) + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE, 4) + tb.log.info(PD_STATUS.data[0]) + + + + # Set LVT delay chain + PD_REGS = await tb.axi_master.read(CHIPLET_0_PD_BASE + 0x8, 4) + PD_REGS_WRITE = bytearray(PD_REGS.data) + PD_REGS_WRITE[1] = 32 #0x20 set bits [7:5] to 001 + await tb.axi_master.write(CHIPLET_0_PD_BASE + 0x8, PD_REGS_WRITE, 4) + PD_REGS = await tb.axi_master.read(CHIPLET_0_PD_BASE + 0x8, 4) + PD_REGS_WRITE = bytearray(PD_REGS.data) + PD_REGS_WRITE[3] = PD_REGS_WRITE[3] ^ 1 + await tb.axi_master.write(CHIPLET_0_PD_BASE + 0x8, PD_REGS_WRITE, 4) + PD_REGS = await tb.axi_master.read(CHIPLET_0_PD_BASE + 0x8, 4) + PD_REGS_WRITE = bytearray(PD_REGS.data) + PD_REGS_WRITE[3] = PD_REGS_WRITE[3] ^ 1 + await tb.axi_master.write(CHIPLET_0_PD_BASE + 0x8, PD_REGS_WRITE, 4) + + # Start PD + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE,4) + PD_STATUS_WRITE=bytearray(PD_STATUS.data) + PD_STATUS_WRITE[0] = PD_STATUS_WRITE[0]^2 + await tb.axi_master.write(CHIPLET_0_PD_BASE, PD_STATUS_WRITE, 4) + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE,4) + while(PD_STATUS.data[3] != 1): + await Timer(time=100, units='ns') + PD_STATUS = await tb.axi_master.read(CHIPLET_0_PD_BASE,4) + + PD_DATA = await tb.axi_master.read(CHIPLET_0_PD_BASE + 0x4, 4) + prescaler = 32 + window_size = 63 + f_clk = 250/42 + + pd_out = PD_DATA.data[0] + PD_DATA.data[1]*pow(2,8) + frequency = pd_out * prescaler * f_clk / window_size + tb.log.info(frequency) + + + @cocotb.test() async def SRAM_TEST(dut,idle_inserter=None, backpressure_inserter=None, size=None): tb = TB(dut) @@ -92,9 +240,11 @@ async def SRAM_TEST(dut,idle_inserter=None, backpressure_inserter=None, size=Non await tb.cycle_reset() tb.set_idle_generator(idle_inserter) tb.set_backpressure_generator(backpressure_inserter) - await init_sram(dut, tb, 0x00000000) - await init_sram(dut, tb, 0x1F0000 - 0x8000, size=0x8000) 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) + await SRAM_bank_test(dut, tb, bank_addrs) @cocotb.test() async def SRAM_TEST_MULTI_CHIPLET(dut,idle_inserter=None, backpressure_inserter=None, size=None): -- GitLab