Einleitung
Wenn ein FPGA-Design seine Zeitvorgaben (timing constraints) nicht erfüllt, ist es das Naheliegendste, sich die kritischen Pfade (critical paths) genau anzusehen. Diese Betrachtung erfolgt anhand eines Timing-Reports, der die Verzögerungen zeigt, die durch die einzelnen Logikelemente entlang jedes Pfads verursacht werden.
Wenn man nicht gerade ein intensiver Nutzer von Intels FPGAs ist, ist es vielleicht nicht so offensichtlich, wie man diesen Report bekommt. Und schlimmer noch: Möglicherweise sieht man sich – ohne es zu wissen – den falschen Report an.
Als Erstes muss man sich mit dem Konzept der Multi-Corner-Timing-Analyse beschäftigen. Üblich ist es, die Timing-Korrektheit eines FPGA zu verifizieren, indem man sicherstellt, dass die Zeitvorgaben in vier Fällen erfüllt werden: Bei minimaler und maximaler Temperatur, jeweils kombiniert mit einem „langsamen“ und einem „schnellen“ Timing-Modell. Die Analyse wird also für vier Kombinationen durchgeführt – den sogenannten vier Ecken (corners).
Deshalb ist es wichtig, die Timing-Reports aller vier Ecken zu betrachten, wenn man kritische Pfade untersucht. Diese Tatsache wird oft übersehen. TimeQuest erzeugt zum Beispiel normalerweise einen Timing-Report nur für eine einzige Ecke.
In diesem Beitrag beschreibe ich also, wie man zu einem aussagekräftigen Report kommt. Die Beispiele beziehen sich auf Quartus Prime 17.1 Lite.
Erwähnen möchte ich noch zwei verwandte Beiträge: Ein Beitrag wirft einen Blick auf den Zusammenhang zwischen Eingangs-/Ausgangs-Zeitvorgaben und dem Timing-Report, und ein weiterer Beitrag experimentiert ein wenig mit Tcl-Skripten in TimeQuest.
Wichtig: Auf dieser Seite wird erklärt, wie man den Timing-Report für die Setup-Anforderung erhält. Es gibt jedoch auch Timing-Reports für Hold, Recovery und Removal. Auch sie können aufdecken, wenn die Zeitvorgaben nicht erfüllt werden.
Einen Multi-Corner-Report erstellen: Schnell per Skript
Zuerst kopiert man das folgende Tcl-Skript (script) in eine Datei, zum Beispiel timing.tcl:
create_timing_netlist
read_sdc
update_timing_netlist
foreach_in_collection op [get_available_operating_conditions] {
set_operating_conditions $op
report_timing -setup -npaths 20 -detail full_path -multi_corner \
-panel_name "Critical paths"
}
Beachte, dass sich der Timing-Report auf das Setup beschränkt.
Durch das Flag „multi_corner“ sollte man sich nicht verwirren lassen: Jeder Aufruf von report_timing deckt nur eine Ecke ab. Ob das Flag überhaupt etwas bewirkt, ist unklar.
Deshalb verwendet das Skript eine Schleife über alle vier Optionen (mit foreach_in_collection) und erzeugt für jede Ecke einen separaten Report.
Und so geht's zur Umsetzung:
- In Quartus klappt man im Aufgabenbereich (Task pane) die TimeQuest-Gruppe auf und öffnet den TimeQuest Timing Analyzer.
- Im TimeQuest Timing Analyzer wählt man in der Menüleiste Script > Run Tcl Script… und danach das Tcl-Skript aus (z.B. timing.tcl).
- Im Report-Bereich des TimeQuest Timing Analyzer wird ein Eintrag mit der Bezeichnung „Critical paths“ angelegt. Klickt man auf Multi-Corner Summary, erscheint in den Hauptbereichen eine Liste der Pfade samt Details.
- Um alle Pfadinformationen als Textdatei zu exportieren, klickt man mit der rechten Maustaste auf Multi-Corner Summary und wählt „Export…“. Danach vergibt man einen Namen für eine Ausgabedatei mit der Endung .rpt. HTML-Reports werden nicht unterstützt; sie wären leer.
Unter demselben Eintrag erscheinen außerdem vier getrennte Reports, einer für jede Ecke. Bei älteren Quartus-Versionen sind nur diese vorhanden – also kein Multi-Corner Summary.
Nur HTML- und Text-Reports erzeugen
Die Werkzeuge können ordentliche HTML-Reports erzeugen, die sich deutlich angenehmer lesen als die GUI von TimeQuest selbst. Leider deckt jeder dieser Reports nur je eine Ecke ab. Das Skript erzeugt vier separate HTML-Reports, einen für jede Ecke – das sind eine ganze Menge Dateien, JQuery-Skriptdateien, CSS und was weiß ich. Viel Tamtam, aber eben kein Multi-Corner-Report.
Man verwende zum Beispiel das folgende Skript und nenne es timing-html.tcl:
#project_open myproj
create_timing_netlist
read_sdc
update_timing_netlist
foreach_in_collection op [get_available_operating_conditions] {
set_operating_conditions $op
report_timing -setup -npaths 20 -detail full_path -multi_corner \
-file "timing_paths_$op.html" \
-panel_name "Critical paths for $op"
}
Für einen einfachen Text-Report ändert man das Argument des -file-Flags so, dass die Endung .rpt oder .txt statt .html lautet.
Man beachte den Befehl „project_open“, der am Anfang des Skripts auskommentiert ist. Wenn man die Kommentierung entfernt und „myproj“ durch den tatsächlichen Projektnamen ersetzt, kann man die HTML-Reports auch direkt über eine Shell-Kommandozeile erzeugen, etwa so:
$ /path/to/quartus/bin/quartus_sta -t timing-html.tcl
Einen Multi-Corner-Report auf diese Weise zu erzeugen, habe ich allerdings nicht herausgefunden.
Damit diese Reports bei jedem Implementierungslauf erzeugt werden (was empfehlenswert ist), fügt man der QSF-Datei eine Zeile wie die folgende hinzu:
set_global_assignment -name TIMEQUEST_REPORT_SCRIPT relative/path/to/timing-html.tcl
Wenn das Tcl-Skript auf diese Weise in eine QSF-Datei eingebunden ist, darf das Skript kein project_open verwenden.
Nur über die grafische Oberfläche (GUI)
Einen Multi-Corner-Report bekommt man auch rein durch Zeigen und Klicken:
- In Quartus klappt man im Aufgabenbereich (Task pane) die TimeQuest-Gruppe auf und öffnet den TimeQuest Timing Analyzer.
- Im Aufgabenbereich (Tasks pane) des Timing Analyzer doppelklickt man auf „Update Timing Netlist“.
- Im selben Bereich scrollt man zu „Custom Reports“ und doppelklickt auf „Report Timing…“.
- Ein Dialogfenster öffnet sich. Man wählt zwischen setup, hold, recovery oder removal. Alles andere kann man auf den Standardwerten lassen und unten auf „Report Timing“ klicken.
- Im Report-Bereich wird ein Eintrag „Report Timing“ angelegt. Diesen Eintrag klappt man auf und klickt mit der rechten Maustaste darauf. Im daraufhin erscheinenden Menü wählt man „Generate in All Corners“.
- Nun klickt man auf die Gruppe „Multi Corner Summary“. Den Report kann man – wie oben beschrieben – exportieren.