mirror of https://github.com/efabless/caravel.git
Merge pull request #250 from efabless/update_signoff_scripts
update signoff scripts
This commit is contained in:
commit
8b5f57f3f1
|
@ -41,7 +41,7 @@ optional arguments:
|
|||
-a, --all run all checks
|
||||
````
|
||||
### How to run Caravel top-level STA including user project wrapper
|
||||
1. edit in [pt_sta.tcl](./pt_sta.tcl) the spef mapping section to add the user project module instantiated in user project wrapper
|
||||
1. edit in [pt_sta.tcl](https://github.com/efabless/caravel/blob/caravel_redesign/scripts/pt_sta.tcl#L69) the spef mapping section to add the user project module instantiated in user project wrapper
|
||||
2. run the command
|
||||
````
|
||||
python3 signoff_automation.py -d caravel -sta
|
||||
|
|
|
@ -6,7 +6,7 @@ import os
|
|||
|
||||
|
||||
def klayout_gds_drc_check(design_name, drc_script_path, gds_input_file_path, signoff_directory, logs_directory):
|
||||
report_file_path = signoff_directory / 'caravel' / f'{design_name}_klayout_drc.xml'
|
||||
report_file_path = signoff_directory / f'{design_name}' / f'{design_name}_klayout_drc.xml'
|
||||
run_drc_check_cmd = ['klayout', '-b', '-r', drc_script_path,
|
||||
'-rd', f"input={gds_input_file_path}",
|
||||
'-rd', f"report={report_file_path}",
|
||||
|
|
|
@ -233,29 +233,38 @@ if {\
|
|||
report_constraint -all_violators -significant_digits 4 -nosplit > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-all_viol.rpt
|
||||
|
||||
report_timing -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit \
|
||||
-max_paths 1000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-min_timing.rpt
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-min_timing.rpt
|
||||
|
||||
report_timing -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit \
|
||||
-max_paths 1000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-max_timing.rpt
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-max_timing.rpt
|
||||
|
||||
if {$design == "caravel"} {
|
||||
report_timing -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit -group clk \
|
||||
-max_paths 1000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-clk-min_timing.rpt
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-clk-min_timing.rpt
|
||||
|
||||
report_timing -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit -group clk \
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-clk-max_timing.rpt
|
||||
|
||||
report_timing -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit -group hk_serial_clk \
|
||||
-max_paths 1000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hk_serial_clk-min_timing.rpt
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hk_serial_clk-min_timing.rpt
|
||||
|
||||
report_timing -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit -group hk_serial_clk \
|
||||
-max_paths 1000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hk_serial_clk-max_timing.rpt
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hk_serial_clk-max_timing.rpt
|
||||
|
||||
report_timing -delay max -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit -group hkspi_clk \
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hkspi_clk-max_timing.rpt
|
||||
|
||||
report_timing -delay min -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit -group hkspi_clk \
|
||||
-max_paths 1000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hkspi_clk-min_timing.rpt
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-hkspi_clk-min_timing.rpt
|
||||
|
||||
report_timing -delay min -through [get_cells soc] -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit \
|
||||
-max_paths 1000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-soc-min_timing.rpt
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-soc-min_timing.rpt
|
||||
|
||||
report_timing -delay max -through [get_cells soc] -path_type full_clock_expanded -transition_time -capacitance -nets -nosplit \
|
||||
-max_paths 1000 -nworst 10 -slack_lesser_than 100 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-soc-max_timing.rpt
|
||||
-max_paths 10000 -nworst 10 -slack_lesser_than 10 -significant_digits 4 -include_hierarchical_pins > $::env(OUT_DIR)/reports/${rc_corner}/${design}.${proc_corner}${proc_corner}-soc-max_timing.rpt
|
||||
|
||||
report_case_analysis -nosplit > $::env(OUT_DIR)/reports/${design}.case_analysis.rpt
|
||||
report_exceptions -nosplit > $::env(OUT_DIR)/reports/${design}.false_paths.rpt
|
||||
}
|
||||
|
||||
write_sdf -version 3.0 -significant_digits 4 $::env(OUT_DIR)/sdf/${rc_corner}/${design}.${proc_corner}${proc_corner}.sdf
|
||||
|
|
|
@ -34,12 +34,12 @@ def build_caravel(caravel_root, mcw_root, pdk_root, log_dir, pdk_env):
|
|||
subprocess.run(build_cmd, stderr=build_log, stdout=build_log)
|
||||
|
||||
|
||||
def run_drc(caravel_root, log_dir, signoff_dir, pdk_root, design):
|
||||
def run_drc(design_root, log_dir, signoff_dir, pdk_root, design):
|
||||
klayout_drc_cmd = [
|
||||
"python3",
|
||||
"klayout_drc.py",
|
||||
"-g",
|
||||
f"{caravel_root}/gds/{design}.gds",
|
||||
f"{design_root}/gds/{design}.gds",
|
||||
"-l",
|
||||
f"{log_dir}",
|
||||
"-s",
|
||||
|
@ -383,6 +383,8 @@ if __name__ == "__main__":
|
|||
sta = args.primetime_sta
|
||||
design = args.design
|
||||
antenna = args.antenna
|
||||
if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256"):
|
||||
signoff_dir = os.path.join(mcw_root, "signoff")
|
||||
|
||||
if not os.path.exists(f"{log_dir}"):
|
||||
os.makedirs(f"{log_dir}")
|
||||
|
@ -423,7 +425,10 @@ if __name__ == "__main__":
|
|||
sta = True
|
||||
|
||||
if drc:
|
||||
drc_p1 = run_drc(caravel_root, log_dir, signoff_dir, pdk_root, design)
|
||||
if (design == "mgmt_core_wrapper" or design == "RAM128" or design == "RAM256"):
|
||||
drc_p1 = run_drc(mcw_root, log_dir, signoff_dir, pdk_root, design)
|
||||
else:
|
||||
drc_p1 = run_drc(caravel_root, log_dir, signoff_dir, pdk_root, design)
|
||||
logging.info(f"Running klayout DRC on {design}")
|
||||
if lvs:
|
||||
lvs_p1 = run_lvs(
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
### Caravel Signoff SDC
|
||||
### Rev 1
|
||||
### Date: 5/10/2022
|
||||
### Rev 2
|
||||
### Date: 14/10/2022
|
||||
|
||||
## MASTER CLOCKS
|
||||
create_clock -name clk -period 25 [get_ports {clock}]
|
||||
|
@ -99,13 +99,71 @@ set_case_analysis 0 [get_pins padframe/*_pad/DM[0]]
|
|||
set_case_analysis 0 [get_pins padframe/*_pad/SLOW]
|
||||
set_case_analysis 0 [get_pins padframe/*_pad/ANALOG_EN]
|
||||
|
||||
set_case_analysis 1 [get_pins padframe/*_io_pad*/DM[2]]
|
||||
set_case_analysis 1 [get_pins padframe/*_io_pad*/DM[1]]
|
||||
set_case_analysis 0 [get_pins padframe/*_io_pad*/DM[0]]
|
||||
set_case_analysis 0 [get_pins padframe/*_io_pad*/SLOW]
|
||||
set_case_analysis 0 [get_pins padframe/*_io_pad*/ANALOG_EN]
|
||||
|
||||
set_case_analysis 0 [get_pins padframe/*area1_io_pad[4]/DM[2]]
|
||||
set_case_analysis 0 [get_pins padframe/*area1_io_pad[4]/DM[1]]
|
||||
set_case_analysis 1 [get_pins padframe/*area1_io_pad[4]/DM[0]]
|
||||
|
||||
set_case_analysis 0 [get_pins padframe/*area1_io_pad[2]/DM[2]]
|
||||
set_case_analysis 0 [get_pins padframe/*area1_io_pad[2]/DM[1]]
|
||||
set_case_analysis 1 [get_pins padframe/*area1_io_pad[2]/DM[0]]
|
||||
|
||||
|
||||
set_case_analysis 0 [get_pins padframe/clock_pad/DM[2]]
|
||||
set_case_analysis 0 [get_pins padframe/clock_pad/DM[1]]
|
||||
set_case_analysis 1 [get_pins padframe/clock_pad/DM[0]]
|
||||
|
||||
## FALSE PATHS (ASYNCHRONOUS INPUTS)
|
||||
set_false_path -from [get_ports {resetb}]
|
||||
set_false_path -from [get_ports mprj_io[*]]
|
||||
|
||||
set_false_path -from [get_ports mprj_io[0]] -through [get_pins housekeeping/mgmt_gpio_in[0]]
|
||||
set_false_path -from [get_ports mprj_io[1]] -through [get_pins housekeeping/mgmt_gpio_in[1]]
|
||||
set_false_path -from [get_ports mprj_io[3]] -through [get_pins housekeeping/mgmt_gpio_in[3]]
|
||||
set_false_path -from [get_ports mprj_io[5]] -through [get_pins housekeeping/mgmt_gpio_in[5]]
|
||||
set_false_path -from [get_ports mprj_io[6]] -through [get_pins housekeeping/mgmt_gpio_in[6]]
|
||||
set_false_path -from [get_ports mprj_io[7]] -through [get_pins housekeeping/mgmt_gpio_in[7]]
|
||||
set_false_path -from [get_ports mprj_io[8]] -through [get_pins housekeeping/mgmt_gpio_in[8]]
|
||||
set_false_path -from [get_ports mprj_io[9]] -through [get_pins housekeeping/mgmt_gpio_in[9]]
|
||||
set_false_path -from [get_ports mprj_io[10]] -through [get_pins housekeeping/mgmt_gpio_in[10]]
|
||||
set_false_path -from [get_ports mprj_io[11]] -through [get_pins housekeeping/mgmt_gpio_in[11]]
|
||||
set_false_path -from [get_ports mprj_io[12]] -through [get_pins housekeeping/mgmt_gpio_in[12]]
|
||||
set_false_path -from [get_ports mprj_io[13]] -through [get_pins housekeeping/mgmt_gpio_in[13]]
|
||||
set_false_path -from [get_ports mprj_io[14]] -through [get_pins housekeeping/mgmt_gpio_in[14]]
|
||||
set_false_path -from [get_ports mprj_io[15]] -through [get_pins housekeeping/mgmt_gpio_in[15]]
|
||||
set_false_path -from [get_ports mprj_io[16]] -through [get_pins housekeeping/mgmt_gpio_in[16]]
|
||||
set_false_path -from [get_ports mprj_io[17]] -through [get_pins housekeeping/mgmt_gpio_in[17]]
|
||||
set_false_path -from [get_ports mprj_io[18]] -through [get_pins housekeeping/mgmt_gpio_in[18]]
|
||||
set_false_path -from [get_ports mprj_io[19]] -through [get_pins housekeeping/mgmt_gpio_in[19]]
|
||||
set_false_path -from [get_ports mprj_io[20]] -through [get_pins housekeeping/mgmt_gpio_in[20]]
|
||||
set_false_path -from [get_ports mprj_io[21]] -through [get_pins housekeeping/mgmt_gpio_in[21]]
|
||||
set_false_path -from [get_ports mprj_io[22]] -through [get_pins housekeeping/mgmt_gpio_in[22]]
|
||||
set_false_path -from [get_ports mprj_io[23]] -through [get_pins housekeeping/mgmt_gpio_in[23]]
|
||||
set_false_path -from [get_ports mprj_io[24]] -through [get_pins housekeeping/mgmt_gpio_in[24]]
|
||||
set_false_path -from [get_ports mprj_io[25]] -through [get_pins housekeeping/mgmt_gpio_in[25]]
|
||||
set_false_path -from [get_ports mprj_io[26]] -through [get_pins housekeeping/mgmt_gpio_in[26]]
|
||||
set_false_path -from [get_ports mprj_io[27]] -through [get_pins housekeeping/mgmt_gpio_in[27]]
|
||||
set_false_path -from [get_ports mprj_io[28]] -through [get_pins housekeeping/mgmt_gpio_in[28]]
|
||||
set_false_path -from [get_ports mprj_io[29]] -through [get_pins housekeeping/mgmt_gpio_in[29]]
|
||||
set_false_path -from [get_ports mprj_io[30]] -through [get_pins housekeeping/mgmt_gpio_in[30]]
|
||||
set_false_path -from [get_ports mprj_io[31]] -through [get_pins housekeeping/mgmt_gpio_in[31]]
|
||||
set_false_path -from [get_ports mprj_io[32]] -through [get_pins housekeeping/mgmt_gpio_in[32]]
|
||||
set_false_path -from [get_ports mprj_io[33]] -through [get_pins housekeeping/mgmt_gpio_in[33]]
|
||||
set_false_path -from [get_ports mprj_io[34]] -through [get_pins housekeeping/mgmt_gpio_in[34]]
|
||||
set_false_path -from [get_ports mprj_io[35]] -through [get_pins housekeeping/mgmt_gpio_in[35]]
|
||||
set_false_path -from [get_ports mprj_io[36]] -through [get_pins housekeeping/mgmt_gpio_in[36]]
|
||||
set_false_path -from [get_ports mprj_io[37]] -through [get_pins housekeeping/mgmt_gpio_in[37]]
|
||||
|
||||
set_false_path -from [get_ports mprj_io[*]] -through [get_pins housekeeping/mgmt_gpio_out[*]]
|
||||
set_false_path -from [get_ports mprj_io[*]] -through [get_pins housekeeping/mgmt_gpio_oeb[*]]
|
||||
|
||||
# reset_path -from [get_ports mprj_io[4]]
|
||||
# reset_path -from [get_ports mprj_io[2]]
|
||||
|
||||
set_false_path -from [get_ports gpio]
|
||||
#set_false_path -through [get_nets mprj_io_inp_dis[*]]
|
||||
# set_timing_derate -early 1
|
||||
|
|
Loading…
Reference in New Issue