Logikebenen melden

author-image

Von

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.

  1. Eine Liste der Pfade, die die Reporting-Kriterien erfüllen
  2. Holen Sie sich die Anzahl der Logikebenen für jeden Pfad
  3. 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 } }
            } }
}

Der Inhalt dieser Seite ist eine Kombination aus menschlicher und computerbasierter Übersetzung des originalen, englischsprachigen Inhalts. Dieser Inhalt wird zum besseren Verständnis und nur zur allgemeinen Information bereitgestellt und sollte nicht als vollständig oder fehlerfrei betrachtet werden. Sollte eine Diskrepanz zwischen der englischsprachigen Version dieser Seite und der Übersetzung auftreten, gilt die englische Version. Englische Version dieser Seite anzeigen.