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 } }