Quartus® II Tcl Beispiel: Berichtebenen der Logik

author-image

Von

Wenn Sie ein Design optimieren, ist es sinnvoll, Informationen zu den Logikebenen zwischen Registern anzuzeigen. Das folgende Skript generiert einen Comma Separated Value (. csv)Datei mit der Anzahl der Pfade mit verschiedenen Logikebenen in Ihrem Design. Sie können diese Daten diagrammieren oder ein Excel-Diagramm erstellen, das die Verteilung von Pfaden nach Logikebenen anzeigt.

Wenn zwei Register mehrere Logikpfade zwischen ihnen haben, wird von diesem Skript nur der Pfad mit den meisten Logikebenen gerechnet. Beispielsweise würden zwei Register mit einem vierstufigen und einem zweistufigen Pfad als ein vierstufiger Pfad gerechnet werden.

Das Skript generiert eine CSV-Datei mit dem Namen <Revisionsnamen>.levels_of_logic.csv.

Unter der Annahme, dass Sie das Skript in einer Datei namens report_levels_of_logic.tclspeichern, können Sie es mit dem folgenden Befehl ausführen:

quartus_tan -t report_levels_of_logic.tcl -project <sinte> [-revision <revision name>] [-name_pattern <( Übereinstimmung>]

Sie können die Option -name_pattern verwenden, um den Pfad auf eine bestimmte Hierarchie in Ihrem Design einzuschränken. Geben Sie eine Zeichenkette an, die mit dem Tool Command Language (Tcl) Platzhaltervergleich übereinstimmt. Wenn Sie keinen Wert für die Option -name_pattern angeben, ist der Standardwert auf *. Wenn Sie beispielsweise Logikebenen zwischen Registern in der mult:inst6|lpm_mult:lpm_mult_component Hierarchie Ihres Designs melden möchten, geben Sie mult:inst6|lpm_mult:lpm_mult_component* für den Wert der Option -name_pattern an.

load_package advanced_timing Paket
erfordert cmdline

Set-Optionen {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" } \ {
    "name_pattern.arg" "*" "Restrict to registers matching this pattern"}
} array set

opts [::cmdline::getoptions quartus(args) $options]
Array-Set num_levels [list]

# Öffnen Sie das Projekt und erhalten Sie den Revisionsnamen,
wenn { [string equal "" $opts(revision)] } {
    project_open $opts(project) -current_revision
} else {
    project_open $opts(project) -revision $opts(revision)
} set rev
[get_current_revision]

# Bereiten Sie die Timing-Netliste
vor, wenn { [catch { create_timing_netlist; create_p2p_delays } res] } {
    post_message -type error $res project_close
    qexit -error
} #

Iterate durch jedes Register im Design
foreach_in_collection dest [get_timing_nodes -type reg] {

    # Eine Liste der Keeper (Register,  Pins, Taktfrequenzen),
    die zum Registerknoten füttern,
    werden delays_from_keepers [get_delays_from_keepers $dest]
    
    # gesetzt, wenn der Name des Zielregisters nicht mit dem Muster übereinstimmt,
    fahren Sie einfach mit der nächsten Weiter.
    setzen Sie dest_name [get_timing_node_info -info name $dest]
    if { ! [string match $opts(name_pattern) $dest_name] } {
        continue } # Gehen Sie durch alle
    Keeper, die den Registerknoten
    foreach delay $delays_from_keepers {

        set src [$delay 0] #

        Keeper füttern, können Pins und Takte enthalten, und wir wollen nur  Register.
        wenn { ! [String gleich "reg" [get_timing_node_info -info-Typ $src]] } {
            continue } # Wenn der Name des

        Quellregisters nicht mit dem Muster übereinstimmt,
        gehen Sie einfach zum nächsten Satz src_name
        [get_timing_node_info -info name $src]
        wenn { ! [string match $opts(name_pattern) $src_name] } {
            continue } # Zu diesem Zeitpunkt stimmen sowohl die

        Quell- als auch die Zielnamen
        #mit dem Muster überein, und es handelt sich um einen Register-zu-Register-Pfad.
        # Der get_delay_path Befehl gibt eine Liste der Knoten auf
        # a Path zurück. Die Länge des Pfads ist die Länge der Liste.
        # Die Liste enthält die Quellen- und Zielregister,
        Anzahl, so dass die Logikebenen zwischen Registern
  
  


- 2
        festgelegter Pfad [get_delay_path -typ der längste -von $src -zu $dest]
        festgelegt levels_of_logic [expr { [llength $path] - 2 } ]
        
        # Speichern Sie die Informationen in einem Array wenn {
        [info exists num_levels($levels_of_logic)] } {
            incr num_levels($levels_of_logic)
        } else { set
            num_levels($levels_of_logic) 1
        } }

project_close

# Schreiben Sie die Informationen in eine
Datei, wenn { [catch {open ${rev}.levels_of_logic.csv w} fh] } {
    post_message -type error $fh
} else { # Einen

    beschreibenden Header in die Datei schreiben
    $fh "Logikebenen für die Project $opts(Project)-Revision $rev"
    setzt $fh "Von Quartus® II $quartus(Version) generierte Datei auf \
        [Taktformat [Taktsekunden]]"
    setzt $fh "\nReporting-Pfade für Registernamen, die mit $opts(name_pattern)übereinstimmen".
    setzt $fh "Levels of Logic,Number in Design"

    foreach level [lsort -integer [array names num_levels]] {

        if { [catch { puts $fh "$level,$num_levels($level)" } res] } {
            post_message -type error $res break
            } } 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.