Files
kernels/hw/syn/altera/analyze_timing.tcl
Blaise Tine d47cccc157 Vortex 2.0 changes:
+ Microarchitecture optimizations
+ 64-bit support
+ Xilinx FPGA support
+ LLVM-16 support
+ Refactoring and quality control fixes
2023-10-19 20:51:22 -07:00

145 lines
6.4 KiB
Tcl

# Copyright © 2019-2023
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set ProjectName [lindex $argv 0]
set SynMode [lindex $argv 1]
if { $SynMode == "map" } {
set FileSuffix "map"
} else {
set FileSuffix "fit"
}
proc do_timing_checks { ProjectName FileSuffix } {
# Validate timing DRC rules
# REF: http://quartushelp.altera.com/14.0/mergedProjects/tafs/tafs/tcl_pkg_sta_ver_1.0_cmd_check_timing.htm
check_timing -include {no_clock multiple_clock loops latches } -file $ProjectName.$FileSuffix.timing.check_errors.html
# NOTE: metastability requires QSF setting of Synchronizer Identification = Auto
# can also embed in Verilog: (* altera_attribute = "-name SYNCHRONIZER_IDENTIFICATION FORCED_IF_ASYNCHRONOUS" *)
report_metastability -nchains 100 -file $ProjectName.$FileSuffix.timing.check_metastability.html
}
proc do_timing_detailed_slackpaths { ProjectName FileSuffix SynMode } {
# Detailed info for top 100 setup/hold paths
if { $SynMode == "fit" } {
set npaths_detailed 200
set npaths_pairs 10000
set npaths_maxslack 0.2
# Create html reports showing details of each of the top 100 paths (creates html index + subdir with css/images/etc)
set ExtraRTArgs "-show_routing"
report_timing -setup -nworst $npaths_detailed -detail full_path $ExtraRTArgs -file $ProjectName.$FileSuffix.timing.setup.html
report_timing -hold -nworst $npaths_detailed -detail full_path $ExtraRTArgs -file $ProjectName.$FileSuffix.timing.hold.html
report_timing -recovery -nworst $npaths_detailed -detail full_path $ExtraRTArgs -file $ProjectName.$FileSuffix.timing.recovery.html
report_timing -removal -nworst $npaths_detailed -detail full_path $ExtraRTArgs -file $ProjectName.$FileSuffix.timing.removal.html
# Create txt with (slack,src,dst) for cross-seed comparisons
report_timing -setup -nworst $npaths_pairs -less_than_slack $npaths_maxslack -detail summary -pairs_only -file $ProjectName.$FileSuffix.timing_paths.setup.txt
report_timing -hold -nworst $npaths_pairs -less_than_slack $npaths_maxslack -detail summary -pairs_only -file $ProjectName.$FileSuffix.timing_paths.hold.txt
report_timing -recovery -nworst $npaths_pairs -less_than_slack $npaths_maxslack -detail summary -pairs_only -file $ProjectName.$FileSuffix.timing_paths.recovery.txt
report_timing -removal -nworst $npaths_pairs -less_than_slack $npaths_maxslack -detail summary -pairs_only -file $ProjectName.$FileSuffix.timing_paths.removal.txt
# Histogram of setup/hold slacks across all clocks
set allclocks [get_clocks]
foreach_in_collection curclk $allclocks {
set clkname [ get_clock_info -name $curclk ]
create_slack_histogram -clock_name $clkname -setup -file $ProjectName.$FileSuffix.timing_histogram.$clkname.setup.html
#create_slack_histogram -clock_name $clkname -hold -file $ProjectName.$FileSuffix.timing_histogram.$clkname.hold.html
}
# Just emit simple setup paths if analyzing MAP netlist
} else {
set ExtraRTArgs ""
report_timing -setup -nworst 100 -detail full_path $ExtraRTArgs -file $ProjectName.$FileSuffix.timing.setup.html
}
}
proc do_timing_summary { ProjectName FileSuffix } {
# Save summary into to single txt file
create_timing_summary -setup -file $ProjectName.$FileSuffix.timing.summary.txt
create_timing_summary -hold -append -file $ProjectName.$FileSuffix.timing.summary.txt
report_clocks -summary -append -file $ProjectName.$FileSuffix.timing.summary.txt
report_clock_fmax_summary -append -file $ProjectName.$FileSuffix.timing.summary.txt
}
proc do_timing_detailed_bottleneck_paths { ProjectName FileSuffix } {
# Create bottleneck timing analysis with different metrics to analyze setup paths
#proc custom_metric_fanins {arg} {
# upvar $arg metric
# set rating $metric(num_fanins)
# return $rating
#}
#report_bottleneck -cmetric custom_metric_fanins -file timing.bottlneck.num_fanins.html $tpaths
set tpaths [ get_timing_paths -nworst 1000 -setup ]
set tns_paths [ report_bottleneck -metric tns $tpaths -stdout ]
set np_paths [ report_bottleneck -metric num_paths $tpaths -stdout ]
set nfp_paths [ report_bottleneck -metric num_fpaths $tpaths -stdout ]
set nfo_paths [ report_bottleneck -metric num_fanouts $tpaths -stdout ]
set nfi_paths [ report_bottleneck -metric num_fanins $tpaths -stdout ]
set fo [ open "$ProjectName.$FileSuffix.timing.setup.bottlenecks.txt" "w" ]
puts $fo "Bottlenecks by TNS"
puts $fo $tns_paths
puts $fo "Bottlenecks by NumPaths"
puts $fo $np_paths
puts $fo "Bottlenecks by NumFailingPaths"
puts $fo $nfp_paths
puts $fo "Bottlenecks by NumFanOuts"
puts $fo $nfo_paths
puts $fo "Bottlenecks by NumFanIns"
puts $fo $nfi_paths
}
# Iterate over all known operating conditions
# 3_H2_slow_850mv_100c / 3_H2_slow_850mv_100c / 3_H2_slow_850mv_0c / MIN_fast_850mv_100c / MIN_fast_850mv_0c
#foreach_in_collection oc [get_available_operating_conditions] {
# set_operating_conditions $oc
# post_message "Setting Operating Conditions $oc"
# update_timing_netlist
# report_timing -setup -npaths 100 -file $ProjectName.timing.setup.html
# report_timing -hold -npaths 100 -file $ProjectName.timing.hold.html
#}
project_open $ProjectName
# => allows comparison of raw logic vs impact of routing delays
if { $SynMode == "map" } {
create_timing_netlist -post_map
read_sdc
update_timing_netlist
do_timing_detailed_slackpaths $ProjectName $FileSuffix $SynMode
do_timing_summary $ProjectName $FileSuffix
delete_timing_netlist
# normal post-par analysis (includes routing congestion/physical placement constraints)
} else {
create_timing_netlist
read_sdc
update_timing_netlist
# Iterate over a single worst-case operating condition (grade/speed pre-selected based on netlist)
set_operating_conditions -voltage 900 -temperature 100
update_timing_netlist
do_timing_checks $ProjectName $FileSuffix
do_timing_detailed_slackpaths $ProjectName $FileSuffix $SynMode
do_timing_detailed_bottleneck_paths $ProjectName $FileSuffix
do_timing_summary $ProjectName $FileSuffix
delete_timing_netlist
}
project_close