Wenn Sie den Zeitpunkt für ein Design schließen, ist es oft nützlich zu wissen, wie viele Logikebenen sich in fehlerhaften Pfaden befinden. Der Timing Analyzer zeigt die Anzahl der Logikstufen an, wenn Sie das Timing für einen Pfad melden. Es gibt jedoch keinen Standardbericht, der die Anzahl der Logikebenen für einen Pfadsatz auflistet. Dieses Designbeispiel definiert ein benutzerdefiniertes Verfahren, das Sie verwenden können, um Berichte zu erstellen, die die Anzahl der Logikebenen für Pfadesätze anzeigen.
Das benutzerdefinierte Verfahren unterstützt den gleichen Befehl wie report_timing. Sie sollten die gleichen Optionen mit dem benutzerdefinierten Verfahren verwenden, wie mit dem Befehl report_timing. Das benutzerdefinierte Verfahren unterstützt auch drei zusätzliche Optionen: -greater_than <value>, -less_than <value> und -file <report file>. Sie können die Optionen -greater_than und -less_than verwenden, um die Berichterstattung auf Pfade mit mehr oder weniger als den angegebenen Logikebenen zu beschränken. Sie können die Option -file verwenden, um den Bericht in eine Datei zu schreiben.
Im benutzerdefinierten Verfahren werden die Anzahl der Logikstufen für die Pfade mit dem schlechtesten Timing-Slack angezeigt. Es zeigt nicht unbedingt die Pfade im Design mit der größten Anzahl von Logikebenen an. Die Pfade mit dem schlechtesten Timing-Slack sind nicht immer die Pfade mit der größten Anzahl von Logikebenen, obwohl das oft zutrifft.
Vorgehensweise
Im benutzerdefinierten Verfahren werden die folgenden Schritte verwendet.
- Eine Liste der Pfade, die die Reporting-Kriterien erfüllen
- Holen Sie sich die Anzahl der Logikebenen für jeden Pfad
- Zeigt die Anzahl der Logikebenen und Pfadinformationen in einem Diagramm an
Schritt 1: Holen Sie sich eine Liste der Pfade
Im benutzerdefinierten Verfahren wird der Befehl get_timing_paths verwendet, der den gleichen Befehl wie report_timing unterstützt. Sie können alle Optionen für report_timing verwenden, um die Zeitablaufanalyse zu steuern. Sie können beispielsweise den Bericht der Anzahl der Logikstufen auf Pfade beschränken, die in einem bestimmten Registernamen enden. Der folgende Tcl-Code zeigt die Verfahrensdefinition und übergibt alle Vorgehensweisen an den Befehl get_timing_paths.
proc report_levels_of_logic { args } { # Übergeben Sie alle antwortenden Antworten direkt an get_timing_paths, wenn { [catch { eval get_timing_paths $args } paths_col] } { post_message -type error $paths_bmc return } }
Schritt 2: Holen Sie sich die Anzahl der Logikstufen für jeden Pfad
Verwenden Sie eine Schleife, um die Pfadsammlung in der paths_col Variable zu iterieren und die Anzahl der Logikebenen in jedem Pfad zu extrahieren. Speichern Sie Informationen über den Pfad in einer TCL-Matrix-Datenstruktur, die zum Ausdrucken der Ergebnisse verwendet wird. Die gespeicherten Informationen sind die Anzahl der Logikebenen, die "Slack" des Pfads und die Namen der Quellen- und Zielknoten.
foreach_in_collection path_obj $paths_bmc { # Wie viele Logikebenen sind auf dem Weg? set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Hinzufügen der Pfadinformationen zu einer Matrix. $logic_levels_matrix fügen Sie die Zeile [list \ $levels_of_logic \ [get_path_info -slack $path_obj] \ [get_node_info -name [get_path_info -from $path_obj]] \ [get_node_info -name [get_path_info -to $path_obj]] }
Schritt 3: Pfadinformationen in einem Diagramm anzeigen
Schließlich zeigen Sie alle Pfadinformationen an, die in der Matrixvariablen gespeichert sind. Dieses Beispiel verwendet das Tcl-Berichtpaket, um die Matrix zum Ausdrucken zu formatieren. Der folgende Code fügt der Matrix eine Überschriftenzeile hinzu, definiert die visuelle Art des Berichts, legt die Zelle fest und zeigt den Bericht an.
anzahl Put in der Header-Zeile $logic_levels_matrix insert row 0 \ [list "Levels of logic" "Slack" "From" "To"] # Wir benötigen einen Stil, der definiert ist, um die Tabelle der Ergebnisse auszudrucken catch { ::report::rmstyle basicrpt } ::report::d efstyle basicrpt {{cap_rows 1}} { data set [split "[string repeat " " [columns];"] top set [split "[string repeat "+ - " [columns]]+"] bottom set [top get] topcapsep set [top get] topdata set [data get] top enable topcapsep enable bottom enable tcaption $cap_rows } # Create the report, set the columns to have one space of aws, and # print out the matrix with the specified format catch { r destroy }:report::report r 4 style basicrpt für { set 0 } { $col < [r columns]} { incr} { r pad $col both " } post_message "Levels of logic\n[r printmatrix $logic_levels_matrix]"
Benutzerdefiniertes Verfahren
Der Code für das unten aufgeführte benutzerdefinierte Verfahren enthält Optionen zum Schreiben des Berichts in eine Datei und zur Begrenzung der gemeldeten Pfade, es sei denn, die Anzahl der Logikebenen ist größer oder kleiner als die vom Benutzer angegebenen Werte.
Dies sind einige Beispiele dafür, wie Sie das benutzerdefinierte Verfahren verwenden können.
- report_levels_of_logic -setup -greater_than 10 -to [get_registers data*] -npaths 1000
- report_levels_of_logic -hold -from_clock core_50 -npaths 50 -file levels.txt
Um das benutzerdefinierte Verfahren zu verwenden, speichern Sie den Tcl-Code unten in einer Datei namens report_levels_of_logic.tcl. Verwenden Sie dann die Befehlsquelle report_levels_of_logic.tcl in der Tcl-Eingabeaufforderung des Timing Analyzer. Die Beschaffung der Datei definiert das benutzerdefinierte Verfahren. Sie können dann den neu definierten Befehl report_levels_of_logic verwenden, bis Sie den Timing Analyzer beenden.
package require cmdline package require struct::matrix package require report proc report_levels_of_logic { args } { set options { {"less_than.arg" "" "Limit to paths with less than this number" } { "greater_than.arg" "" "Beschränken Sie sich auf Pfade mit mehr als dieser Zahl" } {"file.arg" "" "Output file name" } } array set opts [::cmdline::getKnownOptions args $options] # Stellen Sie sicher, dass das Verfahren mit einigen Argumenten aufgerufen wird wenn { [string equal "" $opts(less_than)] && [string equal "" $opts(greater_than)] } { post_message -type warning "Sie müssen einen numerischen Wert\ für -less_than oder -greater_than" return } # eingeben, stellen Sie sicher, dass das Verfahren mit numerischen Argumentwerten aufgerufen wird, wenn { ![ string is double $opts(less_than)] } { post_message -type warning "You must specify a numeric value\ for -less_than" return } if { ![ string is double $opts(greater_than)] } { post_message -type warning "You must specify a numeric value\ for -greater_than" return } # Create a matrix to hold information about the failing paths set logic_levels_matrix [::struct:: matrix] $logic_levels_matrix Spalten hinzufügen 4 # Alle unbekannten get_timing_paths direkt zu get_timing_paths übergeben, wenn { [catch { eval get_timing_paths $args } paths_col] } { post_message -type error $paths_bmc return } # Gehen Sie durch die Liste der Timing-Pfade und erhalten Sie Informationen nr. zu den Ebenen der Logik foreach_in_collection path_obj $paths_entity { # Angenommen, der Pfad wird gemeldet, es sei denn, die Anzahl der Ebenen der # Logik ist außerhalb der angegebenen Grenzen. set include_path 1 # Wie viele Logikebenen sind im Pfad? set levels_of_logic [get_path_info -num_logic_levels $path_obj] # Wenn wir eine Untergrenze angegeben haben, melden wir den Pfad nicht, wenn die Anzahl der Logikebenen größer oder gleich der unteren Grenzen ist, wenn {! [string equal "" $opts(less_than)] } { if { $levels_of_logic >= $opts(less_than) } { set include_path 0 } } # Wenn wir eine obergrenze angegeben haben, melden wir den Pfad nicht, wenn die Anzahl der Logikstufen kleiner oder gleich der oberen Begrenzung ist, wenn { ! [string equal "" $opts(greater_than)] } { if { $levels_of_logic <= $opts(greater_than) } { set include_path 0 } } # Wenn der Pfad Logikebenen hat, die in unsere Grenzen fallen, # bericht darüber, wenn { $include_path } { $logic_levels_matrix add row [list \ $levels_of_logic \ [get_path_info -slack $path_obj] \ [get_node_info -name [get_path_info -from $path_obj]] \ [get_node_info -name [get_path_info -to $path_obj]] } } # Nach abschluss des Durchlaufens aller Pfade von get_timing_paths # Wenn es Zeilen in der Matrix gibt, entsprechen die Pfade den Kriterien. Anzahl wir müssen die Tabelle mit diesen Informationen ausdrucken. wenn { 0 == [$logic_levels_matrix rows] } { # No paths meet the criteria # Print out a quick message post_message "No paths meet the criteria to report levels of logic" #Wenn ein Fehler beim Öffnen der Datei vorliegt, drucken Sie eine Nachricht mit der Aufschrift # that aus. Andernfalls sagen Sie, dass es keine Pfade gibt, die die Kriterien erfüllen, wenn { ! [String gleich "" $opts(Datei)] } { if { [catch { open $opts(file) w } fh] } { post_message -type error "Couldn't open file: $fh" } else { puts $fh "No paths meet the criteria to report levels of logic" catch { close $fh "No paths meet the criteria to report levels of logic" (Keine Pfade erfüllen die Kriterien zur Meldung von Logikebenen) catch { close $fh $fh } } } else { # Put in der Header-Zeile $logic_levels_matrix insert row 0 \ [list "Levels of logic" "Slack" "From" "To"] # Wir benötigen einen Stil, der definiert ist, um die Tabelle mit dem Ergebnisfang {:: bericht::rmstyle basicrpt } ::report::d efstyle basicrpt {{cap_rows 1}} { datensatz [split "[string repeat " " [columns]];"] top set [split "[string repeat "+ - " [columns]]+"] bottom set [top get] topcapsep set [top get] topdata set [data get] top enable topcapsep enable bottom enable tcaption $cap_rows } # Create the report, set the columns to have one space of aws, and # print out the matrix with the specified format catch { r destroy }:report::report r 4 style basicrpt für { set 0 } { $col < [r columns]} { incr ascii } { r pad $col both " " } post_message "Levels of logic\n[r printmatrix $logic_levels_matrix]" # Speichern Sie den Bericht in einer Datei, wenn ein Dateiname angegeben wird, wenn { ! [String gleich "" $opts(Datei)] } { if { [catch { open $opts(file) w } fh] } { post_message -type error "Couldn't open file: $fh" } else { puts $fh "Levels of logic" r printmatrix2channel $logic_levels_matrix $fh catch {close $fh } } } } }