aufmacher.jpg

Der Leistungsverbrauch eines Boards oder Systems ist eine wichtige betriebliche Kenngröße. Der Entwickler muss daher ein Power-Budget einhalten und dazu den Ressourceneinsatz sowie den Leistungsbedarf anpassen. Bereits vor der eigentlichen Entwicklung braucht er daher eine Abschätzung, wie viel Leistung das System verbrauchen wird.

Xilinx bietet eine Reihe von Tools, mit denen sich der Leistungsverbrauch virtuell auf der Basis der Nutzer-Eingaben oder Synthese-Reports ermitteln lässt. Dazu zählt das XPE-Spreadsheet (Xilinx Power Estimator). Dieses Excel-basierte Tool erlaubt die Eingabe der Kenngrößen des Designs, wie Ressourceneinsatz, Umschaltraten (Toggle Rate) und Taktfrequenz, und schätzt auf dieser Grundlage den Leistungsverbrauch entsprechend den Bausteindaten. Ein anderes Tool ist der Xilinx Power Analyzer (XPA). Er importiert nach dem Place-and-Route-Schritt eines Designs die dabei entstandene NCD-Datei. Da er die Leistung anhand der Details der Implementierung und den Simulationsergebnissen schätzt, erzielt der XPA ein genaueres Ergebnis als der XPE.

Messung am lebenden FPGA

Die Autoren dieses Beitrags haben nun eine weitere Methodik entwickelt, um den Leistungsverbrauch eines FPGA-Designs auf einem realen Baustein abzuschätzen. Ein generisches, bausteinunabhängiges VHDL-Design soll dabei verschiedene Implementierungs-Szenarios nachbilden. Darin kann man die Anzahl der aktivierten Ressourcen – etwa DSP-Slices, Block-RAMs und Slice-Register – zusammen mit ihren Betriebsbedingungen (Junction-Temperatur, Taktfrequenz und Umschaltraten) über einen seriellen Kanal variieren, während das reale FPGA läuft. Das Verfahren überwacht dabei simultan die Strom- und Spannungspegel, so dass man das dynamische Verhalten eines Bausteins bei unterschiedlichen Ressourceneinsätzen und Umgebungsbedingungen leicht beobachten kann.

Eckdaten

Die Autoren stellen eine eigene Methode vor, um den Energieverbrauch eines FPGA-Designs abzuschätzen, noch bevor man die exakte Schaltung für den FPGA entwickelt. Dazu setzen sie generische, simple Schaltungen für DSP-Slices, Block-RAMs und Slice-Register ein und laden sie in ein FPGA. Über ein eigens entwickeltes GUI kann der Anwender die Menge aktiver Ressourcen und viele weitere Parameter variieren und damit Verbrauchskurven plotten.

Die Autoren haben dieses Design auf einem Xilinx KC702 Evaluation Board implementiert. Doch es lässt sich mit geringfügigen Abänderungen ebenso gut auf jedem anderen System einrichten, wenn der FPGA-Baustein die im Design verwendeten IP-Kerne unterstützt.

Generisches Design

Das generische VHDL-Design lässt sich auch als Test-Design für FPGA-Boards verwenden. Wer zum Beispiel ein General-Purpose-Kintex-7-Board entwickelt, kann vorab nicht wissen welchen Ressourcen-Umfang der Anwender tatsächlich nutzen wird. Um die Stabilität und Robustheit des Boards zu gewährleisten, muss er die Grenzen beim Betrieb ausloten. Dazu kann er den Baustein bei der höchsten und niedrigsten Umgebungstemperatur unterschiedlich stark auslasten, um zu verifizieren, dass das FPGA in allen Situationen mit unterschiedlichem Ressourceneinsatz stabil arbeitet. Statt jedes erdenkliche Szenario der Ressourcen-Nutzung mit einem eigenen VHDL-Design zu prüfen, gibt die hier vorgeschlagene Methode dem Entwickler die Flexibilität, sein Test-Design in Echtzeit anzupassen.

Das VHDL-Design sollte so einfach wie möglich sein, damit die Synthese-Tools keine Slice-LUTs (Look-Up Table) an Stelle von Registern als Logik einsetzen. Die LUTs würden Leistung verbrauchen, die der Anwender gar nicht steuern kann.

Register, RAM und DSP

Die einfachste Methode, Slice-Register zu implementieren, ist sie in einem Schieberegisterblock zusammenzufassen. Bild 1a zeigt ein Schaltungsdiagramm der Implementierung von Slice-Registern. Dabei ist zu beachten, dass die Synthese-Tools beim Erstellen von Slice-Registern dazu neigen, Slice-LUTs als 32-Bit-Schieberegister (SRL32) anstelle der Slice-Register zu verwenden. Mit dem folgenden VHDL-Attribut kann man die Synthese-Software zur Verwendung von Slice-Registern veranlassen:

Bild 1: Blockschaltbilder der Implementierung für die Leistungsbestimmung: (a) Slice-Register, (b) Block-RAMs und (c) DSP-Slices.

Bild 1: Blockschaltbilder der Implementierung für die Leistungsbestimmung: (a) Slice-Register, (b) Block-RAMs und (c) DSP-Slices.Xilinx

  • attribute SHREG_EXTRACT : string;
  • attribute SHREG_EXTRACT of <signal_name> : signal is „no“;

Der „LogiCORE Block Memory Generator“ erstellt Block-RAMs als Single-Port-RAMs. Das VHDL-Design ändert dazu kontinuierlich die Bits eines 16-Bit-Worts und schreibt dieses Wort an eine beliebig gewählte Adresse der aktivierten Block-RAMs, um sie belegt zu halten. Bild 1b zeigt das Diagramm eines BRAM-Elements.

Ganz ähnlich nutzt das Design DSP-Slices zur Multiplikation eines 25-Bit-Multiplikanden und eines 18-Bit-Multiplikators. Dabei entsteht ein 43-Bit-Ausgangssignal: das ist die maximale Wortlänge, die ein einzelner DSP48E1 verarbeiten kann. Das Design ändert regelmäßig den Multiplikand aller DSP-Elemente, um den Leistungsverbrauch der DSPs zu dynamisieren. Dies ist in Bild 1c zu sehen. Die Synthese-Tools tendieren jedoch dazu, Ressourcen bei der Optimierung zu entfernen, wenn die Ausgänge dieser Module nicht mit irgendeinem Ausgangs-Pin verbunden sind. Mit dem folgenden Attribut kann man die Ressourcen ungetrimmt erhalten:

  • attribute KEEP : string;
  • attribute KEEP of <signal_name> : signal is „TRUE“;

Ressourcen schalten

In dieser Anordnung lassen sich die Ressourcen per Clock-Enable-Signale aktivieren. Vom Takt getrennte Ressourcen verbrauchen so wenig Leistung, dass man sie als nicht genutzt ansehen kann. Spezifischer ausgedrückt: Der Leistungsverbrauch von 50 DSP-Slices mit 100-prozentiger Toggle-Rate liegt bei 0,112 W. Wenn ihre Clock-Enable-Signale nicht anliegen, sinkt der Verbrauch auf vernachlässigbare 0,001 W. Wenn er die Clock-Enable-Signale jedes Ressourcen-Elements über eine serielle Kommunikation ansteuert, kann der Entwickler unterschiedliche Auslastungsgrade des FPGA-Bausteins simulieren, ohne dazu weitere Design- oder Implementierungsstufen durchlaufen zu müssen.

Ein wichtiger Faktor, der den Leistungsverbrauch erheblich beeinflusst, ist die mittlere Umschaltrate der Ressourcen. Die Toggle-Rate ist die Zahl der Wechsel des Ausgangssignals einer spezifischen Ressource pro Taktzyklus. Man erreicht eine konstant 100-prozentige Umschaltrate durch alternierende Eingänge derjenigen Ressourcen, die in jedem Zyklus den Status des Ausgangs ändern. Für einen DSP-Slice wählt man zwei sich abwechselnde Multiplikanden und einen Multiplikator so, dass sich jedes Ausgangs-Bit in jedem Zyklus ändert. Die Umschaltrate einer Ressource hängt nun von der Wechselrate der alternierenden Eingänge ab. Somit lässt sich die Umschaltrate einer Ressource on-the-fly über den seriellen Kanal steuern.

Einfluss der Taktfrequenz

Der Leistungsverbrauch eines Systems ist außerdem direkt proportional zur Taktfrequenz. Das hier vorgestellte Design nutzt einen Mixed-Mode-Clock-Manager (MMCM), um Takte mit variabler Frequenz zu erzeugen. Ein Satz von Registern bestimmt Frequenz, Phase und Einschaltdauer des MMCM-Ausgangs, der im Normalfall nur dann initialisiert wird, wenn das Design implementiert ist, und eine Bitstream-Datei generiert wird. Doch der Dynamic-Reconfiguration-Port des MMCM erlaubt die Änderung dieser Charakteristik als Ausgangstakt, während der FPGA läuft. Taktphase und Einschaltdauer sind hier nicht von Interesse, da die Phase den Leistungsverbrauch nicht beeinflusst, und das Tastverhältnis sich in den meisten Fällen nicht ändert.

Andererseits ist die Frequenz mit der Verlustleistung eng korreliert. Der interne Mechanismus eines MMCM dividiert die VCO-Frequenz durch den Wert des „CLKOUT0_DIVIDE“-Registers, um die Ausgangsfrequenz zu erhalten. Die Xilinx Application Note XAPP888 beschreibt, wie man diesem Register neue Werte zuweist: Ein Zustandsautomat sorgt für störungsfreie Übergänge. Außerdem lässt sich die Taktfrequenz dieses Designs in Echtzeit über die Eingaben in einem eigens entwickelten grafischen Nutzer-Interface (GUI) ändern. Damit kann der Entwickler die Leistungscharakteristik des Designs für unterschiedliche Frequenzen beobachten.

Für Hitze sorgen

Das Leistungsverhalten unter Hochtemperaturbedingungen ist ein weiterer wichtiger Gesichtspunkt, den der Entwickler genau verfolgen und verifizieren sollte. Die Kerntemperatur im Silizium hängt vom Design des Boards, der Verarbeitungsgeschwindigkeit, der Umgebungstemperatur, der Wärmeableitung und vom Kühlluftstrom des Ventilators ab. Die Autoren steuern die Junction-Temperatur ihres Designs, indem sie die Geschwindigkeit des Ventilators ändern, der über dem FPGA-Chip sitzt. Dazu verwenden sie einen einfachen Ein/Aus-PWM-Controller. Wer kürzere Aufheizzeiten braucht, kann auch eine externe Wärmequelle verwenden, etwa eine Heißluftpistole.

On-Chip-Sensoren messen die Kerntemperatur, und ein passender AD-Wandler (XADC) lässt sich per „LogiCORE XADC Wizard“ generieren. Die im GUI eingegebene Referenztemperatur sendet der PC über den seriellen Kanal zum Baustein und dieser vergleicht sie mit der per Sensoren gemessenen Kerntemperatur. Die Schaltung steuert dann die Geschwindigkeit des Ventilators, um die Junction-Temperatur auf dem gewünschten Wert stabil zu halten. Auf diese Weise kann man den Leistungsverbrauch verfolgen und über der Kerntemperatur plotten, um zu bestätigen, dass er das Power-Budget des Designs einhält und innerhalb der kritischen Grenzen des geforderten Aufheizprofils bleibt.

Bild 2: Die Autoren haben ein eigenes GUI entwickelt, um ihr Design vom PC aus zu steuern und Messwerte zu plotten.

Bild 2: Die Autoren haben ein eigenes GUI entwickelt, um ihr Design vom PC aus zu steuern und Messwerte zu plotten.Xilinx

Eigenes GUI

Das grafische Nutzer-Interface (Bild 2) ist speziell für die Kommunikation mit dem FPGA ausgelegt, um die oben erwähnten Parameter schnell variieren zu können. Man verbindet zunächst den Baustein per Standard-UART mit einem der verfügbaren Ports. Dann öffnet man den Xilinx Power Estimator, um die von ihm ermittelten Schätzwerte mit den gemessenen Werten zu vergleichen. Im GUI erscheint dann ein Plot mit der Leistung über der Zeit, sowohl für die geschätzte wie die gemessene Leistung, anhand der Default-Werte der Parameter. Diese Parameter kann man in den zugehörigen Anzeigepanels modifizieren und die Zahl der genutzten Slice-Ressourcen mit ihren Umschaltraten im Ressource-Panel spezifizieren. Per Utilization-Sweep-Panel kann der Anwender den Auslastungsgrad einer spezifischen Ressource durchfahren, mit gleichmäßigen Intervallen von 0 bis 100 %. Damit kann er eine Kurve der Leistung über der Auslastung mit den gemessenen Leistungswerten in jedem Intervall plotten.

In ähnlichere Weise kann man den Ausgang des MMCM verändern und einen Sweep der Taktfrequenz im Clock-Select-Panel anzeigen. In der nächsten Spalte wird die Versorgungsspannung des FPGA-Chips gemessen und fortlaufend im Vccint-Panel aufgetragen. Das Kerntemperatur-Panel zeigt und plottet die Kerntemperatur. Man kann eine Referenztemperatur eingeben, um die Junction-Temperatur in der vorgesehenen Box zu variieren.

Messtechnik

Für die Messung der Spannungs- und Strompegel der Versorgung kommt ein UCD9248 Digital-PWM-System-Controller von TI zum Einsatz, der bereits auf dem KC702-Board integriert ist. Dieser Multirail-/Multiphase-PWM-Controller für Leistungswandler unterstützt das PMBus-Protokoll (Power Management Bus). Sein PWM-Signal treibt einen UCD7242-IC zur Regelung der Versorgungsspannung Vccint. Mit einem Satz von PMBus-Befehlen konfiguriert man die Funktionen des IC. Er enthält On-Chip-Spannungs- und Stromsensoren und kommuniziert mit dem UCD9248. Die von den Autoren entwickelte GUI-Software überträgt laufend die zugehörigen PMBus-Befehle zum Baustein, der im Gegenzug die Spannungs- und Stromwerte des DC/DC-Wandlers im Standard-PMBus-Datenformat zurückmeldet. Die Software wandelt die ankommenden Bytes in physikalische Werte um und ermittelt daraus die Spannungs- und Stromwerte der Versorgung.

Beim Betrieb eines komplexen und unübersichtlichen Designs bei hohen Temperaturen können die Pegel der Versorgungsspannung vom Sollwert abweichen. Leider haben FPGA-Chips einen eng begrenzten Toleranzbereich gegenüber Schwankungen der Eingangsspannung. Das Überschreiten dieser Werte kann Fehlfunktionen oder bleibende Schäden im Chip bewirken. Deshalb ist die Stabilität der Versorgungsspannung bei schwierigen Betriebsbedingungen ein wichtiger Faktor beim Austesten eines neu entwickelten Boards. Das Vccint-Panel soll sicherstellen und verifizieren, dass die Stromversorgung des Boards in der Lage ist, die Spannungsvariationen bei sehr hohen Verarbeitungsgeschwindigkeiten und hohen Betriebstemperaturen aufzufangen.

Einen weiteren wichtigen Punkt sollten die Entwickler immer im Blick behalten: Jeder einzelne Baustein besitzt infolge leichter Abweichungen im Fertigungsprozess eine unterschiedliche Verlustleistung. Deshalb wird für jeden Virtex-7-FPGA-Chip nach seiner Herstellung in mehreren Testdurchläufen die minimale Versorgungsspannung bestimmt, mit der er ordnungsgemäß arbeitet, und in die E-Fuses eingeschrieben. Die Einstellung des Spannungsregler-Ausgangs auf diesen minimalen Spannungspegel verändert aber den statischen Leistungsverbrauch. Somit kann ein Offset in der statischen Leistung zu einer Differenz in den Ergebnissen zwischen dem XPE und dem hier vorgestellten Design führen. Zum Beispiel weicht die Abschätzung der statischen Leistung eines Kintex-7-Chips im XPE um 0,7 W von der typischen und der Worst-Case-Berechnung ab.

Gute Übereinstimmung mit XPE

Die Autoren haben ihr Design in vielen Design-Szenarios mit verschiedenen Faktoren getestet, um die Genauigkeit und Zuverlässigkeit sicher zu stellen. Die Ergebnisse der XPE-Schätzungen sind in den Graphen der Messungen ebenfalls aufgetragen, um die geschätzte Verlustleistung mit der gemessenen zu vergleichen.

Bild 3: Ein Plot der Leistung über der Nutzung. Die durchgezogenen Linien zeigen die gemessenen Werte, die gestrichelten die XPE-Abschätzungen.

Bild 3: Ein Plot der Leistung über der Nutzung. Die durchgezogenen Linien zeigen die gemessenen Werte, die gestrichelten die XPE-Abschätzungen.Xilinx

Als Beispiel haben die Autoren das Leistungsverhalten des Kintex-7-Bausteins mit einem Durchlauf des Ressourcen-Einsatzes von Null bis zum anfangs im Design implementierten Maximalwert ermittelt. Bild 3 zeigt die Änderung der Verlustleistung beim Durchgang durch den Auslastungsbereich einer Ressource. Die durchgezogenen Linien repräsentieren die Leistungsmessungen, während die XPE-Schätzungen gestrichelt dargestellt sind. Offensichtlich verlaufen beide Kurven sehr dicht benachbart, auch wenn die Auslastung und der Leistungsverbrauch hohe Werte annehmen.

Diese Ergebnisse zeigen, dass die Abschätzung mit dem Xilinx Power Estimator konsistent mit der hier vorgeschlagenen Methode arbeitet. Idealerweise nutzen Entwickler beide Methoden, um die Ergebnisse zu verifizieren und Fehler zu erkennen. Wenn man zum Beispiel in XPE die mittlere Fan-out-Zahl eines Taktgebers nicht korrekt eingibt oder ein bestimmtes Konzept nicht ganz verstanden hat und einen Wert in eine falsche Box einträgt, überlappen sich die resultierenden Plots nicht und signalisieren damit einen Fehler. So lassen sich irreführende Abschätzungen vermeiden.

Drum prüfe…

Die Kenndaten und Spezifikationen eines FPGA-Boards, wie die maximale Verlustleistung oder der erlaubte Kerntemperaturbereich, stehen im Datenblatt. Doch ein spezielles Design mit hoher Ressourcennutzung und hoher Taktfrequenz kann diese Nennwerte überschreiten. Daher ist es wichtig, zu verifizieren, dass die Leistungsregler genügend Strom liefern und das Kühlsystem ausreichend dimensioniert ist. Die hier vorgestellte Methode ermöglicht einen Zuverlässigkeitstest des Boards für High-Performance-Anforderungen, indem man den Ressourceneinsatz und die Taktfrequenz entsprechend erhöht. Damit können Entwickler abschätzen, welche Signalverarbeitungsrate ihr Board ermöglicht, oder ob die Kühlvorrichtungen ein Upgrade benötigen.

Nachdem etliche Testergebnisse die Zuverlässigkeit der Methode belegt haben, steht den Entwicklern hiermit eine weitere Option für das Leistungsmanagement in der Pre-Design-Phase zur Verfügung. Mit einigen weiteren Verbesserungen, etwa einem JTAG-Interface, einem voll Baustein-unabhängigem VHDL-Code oder einem üblichen Strommesssystem, kann dieses Design zu einem Schlüsselinstrument für FPGA-Projekte werden.