166 lines
6.4 KiB
Tcl
166 lines
6.4 KiB
Tcl
# Test advanced exception path features for code coverage
|
|
# Targets: ExceptionPath.cc (priority, comparison, rise/fall/through combinations),
|
|
# WriteSdc.cc (writeException, writeExceptionFrom/To/Thru),
|
|
# Sdc.cc (exception management, matching)
|
|
source ../../test/helpers.tcl
|
|
|
|
read_liberty ../../test/nangate45/Nangate45_typ.lib
|
|
read_verilog sdc_test2.v
|
|
link_design sdc_test2
|
|
|
|
############################################################
|
|
# Setup clocks and basic delays
|
|
############################################################
|
|
|
|
create_clock -name clk1 -period 10 [get_ports clk1]
|
|
create_clock -name clk2 -period 20 [get_ports clk2]
|
|
set_input_delay -clock clk1 2.0 [get_ports in1]
|
|
set_input_delay -clock clk1 2.0 [get_ports in2]
|
|
set_input_delay -clock clk2 2.0 [get_ports in3]
|
|
set_output_delay -clock clk1 3.0 [get_ports out1]
|
|
set_output_delay -clock clk2 3.0 [get_ports out2]
|
|
|
|
############################################################
|
|
# False path with rise/fall from/to combinations
|
|
############################################################
|
|
|
|
# rise_from to specific port
|
|
set_false_path -rise_from [get_ports in1] -to [get_ports out1]
|
|
|
|
# fall_from to specific port
|
|
set_false_path -fall_from [get_ports in2] -to [get_ports out1]
|
|
|
|
# from port to rise_to
|
|
set_false_path -from [get_ports in1] -rise_to [get_ports out2]
|
|
|
|
# from port to fall_to
|
|
set_false_path -from [get_ports in2] -fall_to [get_ports out2]
|
|
|
|
# rise_from + fall_to combination
|
|
set_false_path -rise_from [get_ports in3] -fall_to [get_ports out1]
|
|
|
|
# fall_from + rise_to combination
|
|
set_false_path -fall_from [get_ports in3] -rise_to [get_ports out2]
|
|
|
|
# Report after false paths
|
|
report_checks
|
|
|
|
############################################################
|
|
# Write SDC (to cover exception writing with rise/fall)
|
|
############################################################
|
|
|
|
set sdc_file1 [make_result_file sdc_exception_adv1.sdc]
|
|
write_sdc -no_timestamp $sdc_file1
|
|
|
|
############################################################
|
|
# Unset all false paths and create through paths
|
|
############################################################
|
|
|
|
unset_path_exceptions -rise_from [get_ports in1] -to [get_ports out1]
|
|
unset_path_exceptions -fall_from [get_ports in2] -to [get_ports out1]
|
|
unset_path_exceptions -from [get_ports in1] -rise_to [get_ports out2]
|
|
unset_path_exceptions -from [get_ports in2] -fall_to [get_ports out2]
|
|
unset_path_exceptions -rise_from [get_ports in3] -fall_to [get_ports out1]
|
|
unset_path_exceptions -fall_from [get_ports in3] -rise_to [get_ports out2]
|
|
|
|
############################################################
|
|
# False path with -through
|
|
############################################################
|
|
|
|
set_false_path -from [get_ports in1] -through [get_pins buf1/Z] -to [get_ports out1]
|
|
|
|
set_false_path -from [get_ports in2] -through [get_pins inv1/ZN] -through [get_pins and1/ZN] -to [get_ports out1]
|
|
|
|
set_false_path -from [get_ports in1] -through [get_pins or1/ZN] -to [get_ports out2]
|
|
|
|
# Write to cover through paths
|
|
set sdc_file2 [make_result_file sdc_exception_adv2.sdc]
|
|
write_sdc -no_timestamp $sdc_file2
|
|
|
|
# Unset through paths
|
|
unset_path_exceptions -from [get_ports in1] -through [get_pins buf1/Z] -to [get_ports out1]
|
|
unset_path_exceptions -from [get_ports in2] -through [get_pins inv1/ZN] -through [get_pins and1/ZN] -to [get_ports out1]
|
|
unset_path_exceptions -from [get_ports in1] -through [get_pins or1/ZN] -to [get_ports out2]
|
|
|
|
############################################################
|
|
# Multicycle path with rise/fall combinations
|
|
############################################################
|
|
|
|
# Setup multicycle with rise_from
|
|
set_multicycle_path -setup 2 -rise_from [get_ports in1] -to [get_ports out1]
|
|
|
|
# Hold multicycle with fall_to
|
|
set_multicycle_path -hold 1 -from [get_ports in1] -fall_to [get_ports out1]
|
|
|
|
# Multicycle between clock domains
|
|
set_multicycle_path -setup 3 -from [get_clocks clk1] -to [get_clocks clk2]
|
|
|
|
set_multicycle_path -hold 2 -from [get_clocks clk1] -to [get_clocks clk2]
|
|
|
|
# Multicycle with -through
|
|
set_multicycle_path -setup 4 -from [get_ports in2] -through [get_pins and1/ZN] -to [get_ports out1]
|
|
|
|
# Write to cover multicycle writing
|
|
set sdc_file3 [make_result_file sdc_exception_adv3.sdc]
|
|
write_sdc -no_timestamp $sdc_file3
|
|
|
|
# Report
|
|
report_checks -from [get_ports in1] -to [get_ports out1]
|
|
|
|
############################################################
|
|
# Unset multicycles and add max/min delay
|
|
############################################################
|
|
|
|
unset_path_exceptions -setup -rise_from [get_ports in1] -to [get_ports out1]
|
|
unset_path_exceptions -hold -from [get_ports in1] -fall_to [get_ports out1]
|
|
unset_path_exceptions -setup -from [get_clocks clk1] -to [get_clocks clk2]
|
|
unset_path_exceptions -hold -from [get_clocks clk1] -to [get_clocks clk2]
|
|
unset_path_exceptions -setup -from [get_ports in2] -through [get_pins and1/ZN] -to [get_ports out1]
|
|
|
|
############################################################
|
|
# Max/min delay with various options
|
|
############################################################
|
|
|
|
set_max_delay -from [get_ports in1] -to [get_ports out1] 8.0
|
|
set_min_delay -from [get_ports in1] -to [get_ports out1] 1.0
|
|
|
|
set_max_delay -from [get_ports in2] -through [get_pins and1/ZN] -to [get_ports out1] 6.0
|
|
|
|
set_max_delay -rise_from [get_ports in3] -fall_to [get_ports out2] 7.0
|
|
|
|
# Write to cover max/min delay writing
|
|
set sdc_file4 [make_result_file sdc_exception_adv4.sdc]
|
|
write_sdc -no_timestamp $sdc_file4
|
|
|
|
# Write compatible mode to cover alternative writer paths
|
|
set sdc_file5 [make_result_file sdc_exception_adv5.sdc]
|
|
write_sdc -no_timestamp -compatible $sdc_file5
|
|
|
|
# Write with digits for coverage
|
|
set sdc_file6 [make_result_file sdc_exception_adv6.sdc]
|
|
write_sdc -no_timestamp -digits 6 $sdc_file6
|
|
|
|
############################################################
|
|
# Group paths (exercises group_path writing)
|
|
############################################################
|
|
|
|
group_path -name reg2reg -from [get_clocks clk1] -to [get_clocks clk1]
|
|
group_path -name in2out -from [get_ports {in1 in2 in3}] -to [get_ports {out1 out2}]
|
|
group_path -name clk_cross -from [get_clocks clk1] -to [get_clocks clk2]
|
|
|
|
report_checks -path_group reg2reg
|
|
|
|
report_checks -path_group in2out
|
|
|
|
# Write with group paths
|
|
set sdc_file7 [make_result_file sdc_exception_adv7.sdc]
|
|
write_sdc -no_timestamp $sdc_file7
|
|
|
|
############################################################
|
|
# Read back SDC to verify
|
|
############################################################
|
|
|
|
read_sdc $sdc_file4
|
|
|
|
report_checks
|