Files
vortex/hw/syn/altera/analyze_timing.tcl
Blaise Tine c1e168fdbe Vortex 2.0 changes:
+ Microarchitecture optimizations
+ 64-bit support
+ Xilinx FPGA support
+ LLVM-16 support
+ Refactoring and quality control fixes

minor update

minor update

minor update

minor update

minor update

minor update

cleanup

cleanup

cache bindings and memory perf refactory

minor update

minor update

hw unit tests fixes

minor update

minor update

minor update

minor update

minor update

minor udpate

minor update

minor update

minor update

minor update

minor update

minor update

minor update

minor updates

minor updates

minor update

minor update

minor update

minor update

minor update

minor update

minor updates

minor updates

minor updates

minor updates

minor update

minor update
2023-11-10 02:47:05 -08: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