FPGAs mit C/C++ programmieren: Herausforderungen bei HLS Design Flows

| Autor / Redakteur: Loren Hobbs * / Sebastian Gerstl

Tools zur High-Level Synthese (HLS) haben die Programmierung von FPGAs für viele Entwickler zugänglicher gemacht, da sie die automatische Umwandlung von C- oder C++-Code in RTL-Sprachen wie Verilog oder VHDL ermöglichen. Doch diese Umwandlung von C/C++ Code ist nicht immer unproblematisch. Entwickler müssen sich häufig mit den fünf hier geschilderten Problemen auseinandersetzen.
Tools zur High-Level Synthese (HLS) haben die Programmierung von FPGAs für viele Entwickler zugänglicher gemacht, da sie die automatische Umwandlung von C- oder C++-Code in RTL-Sprachen wie Verilog oder VHDL ermöglichen. Doch diese Umwandlung von C/C++ Code ist nicht immer unproblematisch. Entwickler müssen sich häufig mit den fünf hier geschilderten Problemen auseinandersetzen. (Bild: Silexica)

Moderne FPGA-Tools erlauben es, mittels High-Level Synthese (HLS) C oder C++-Code zu verwenden, um die Hardwarebausteine zu programmieren. Dieser Ansatz bringt aber einige besondere Herausforderungen mit sich. Hier sind fünf typische Problemstellungen und dazu passende Lösungsansätze.

Tools für High-level Synthesis (HLS), die C/C++ Quellcode in Verilog/VHDL umwandeln, sind bereits seit mehr als 15 Jahren im Handel erhältlich. HLS-Tools von FPGA-Halbleiterherstellern sowie EDA-Firmen (Electronic Design Automation), wie beispielsweise Synopsys, Cadence oder Mentor, versprechen verbesserte Produktivität durch ein höheres Abstraktionslevel, schnellere Verifizierung und schnellere Design-Iterationen.

Vorzüge des Einsatzes von HLS-Tools beim FPGA-Design

Die Simulation eines Designs in C/C++ kann beispielsweise 10 bis 100 mal schneller erfolgen als eine Simulation in RTL (Register-Transfer Level). Zusätzlich ist eine visuelle Überprüfung in vielen Prozessen der Bildverarbeitung und in Bilderkennungsalgorithmen notwendig. Eine solche Verifizierung ist bei der Durchführung von RTL-Simulationen schwierig, kann jedoch auf C/C++ - Ebene leicht implementiert werden. Die Vorteile in der Simulationsgeschwindigkeit durch die Nutzung einer HLS-basierenden Methodik führt somit zu schnelleren Design-Iterationen und einer erheblichen Produktivitätssteigerung.

Die Verwendung von HLS kann die Nutzung von FPGAs für eine wesentlich breiteres Spektrum von Entwicklern ermöglichen, z.B. Entwickler, die sich in der C/C++ Programmierung für Embedded Systems spezialisiert haben. Traditionelle Methoden für die FPGA-Entwicklung erfordern sehr spezialisierte Fähigkeiten und Kenntnisse für die Beschreibung des Designs in einer Hardware Description Language (HDL), z.B. Verilog oder VHDL. Diese Fähigkeiten sind sehr selten bei Embedded Software Entwicklern aufzufinden und schränken dadurch die Nutzung von FPGAs auf eine sehr kleine Nutzergruppe ein. HLS ermöglicht es Embedded Software Entwickler ihre Algorithmen in Hardware unter Nutzung von höheren Programmiersprachen wie C und C++ zu implementieren.

Aber warum hat sich die Nutzung von HLS für Designs von FPGAs nicht durchgesetzt, wenn die Vorteile der Nutzung von HLS so beträchtlich sind?

Schwierigkeiten und Herausforderungen

Die einfache Antwort ist, dass die Einführung einer HLS-Design Methodik in der realen Welt besondere Herausforderungen darstellen, die im Design Prozess berücksichtigt und überwunden werden müssen. Diese Herausforderungen werden leider oft von den Herstellern verschwiegen und können zu vermehrter Arbeit für den Designer führen, was wiederum die Produktivitätssteigerung von HLS zunichte macht. Fünf dieser Herausforderungen werden im Folgenden näher betrachtet.

1. C/C++ Code, der nicht vom HLS Compiler synthetisiert werden kann

Die Richtlinien der C/C++ Codierung für HLS-Compiler sind umfangreich und beinhalten mehr als 1000 Seiten Dokumentation, die bei der Programmierung des C/C++ Codes für HLS verstanden und umgesetzt werden müssen. Beispielsweise unterstützt HLS nicht den Speicherzugriff auf eine Variable innerhalb eines Arrays mit dynamischer Größe.

Zudem ist der Umfang des Speichers innerhalb eines ausgewählten FPGAs fix, so dass Code nicht unterstützt wird, der dynamisch Speicher mit variabler Größe allokiert – etwa mit Hilfe von Funktionsaufrufen wie malloc, calloc und new. Das HLS Tool muss die erforderliche Speichernutzung zum Kompilierzeitpunkt erkennen, um so eine effiziente Hardwareimplementierung ermöglichen zu können.

2. C/C++ Code, der nicht die besonderen Hardwareeigenschaften berücksichtigt

Die Erstellung von C/C++ Code mit besonderen Speicherkonstruktionen, die nicht die besonderen Hardwareeigenschaften eines FPGAs berücksichtigen, kann zu ungewollten Konsequenzen führen. Dazu zählen beispielsweise aufgeblähte Geräte-Ressourcen und deutlich langsamere Ausführung im Vergleich zu einer Implementierung in einer Hardware Description Language (HDL, z.B. Verilog oder VHDL). Dies führt dann vielmals zu dem generellen Vorurteil, dass von der Nutzung von HLS für Einsätze in kommerziellen Produktentwicklungen abzuraten ist.

Vorsicht ist geboten bei der Nutzung von zu großen Datentypen. Beispielsweise ist es beim Einsetzen eines Standard-Prozessors irrelevant, ob ein 32-Bit Integer in der Software verwendet wird, obwohl nur ein 10-Bit Integer erforderlich ist, da Register und Speicher bereits eine festgelegte Größe haben. Allerdings haben diese nicht genutzten Bits zur Folge, dass sie bei der Implementierung in Hardware wertvolle FPGA-Speicherkapazität verbrauchen.

3. (Mangelnde) Erkennung der Parallelität

C/C++ Code wird normalerweise sequenziell auf Desktop oder Embedded Prozessoren ausgeführt. Die Implementierung von Funktionen auf einem FPGA ermöglicht jedoch eine hochgradig parallele Ausführung von Operations, wobei die Ausführung des Codes signifikant beschleunigt wird.

Das Erkennen solcher potenzieller Parallelität im Design stellt jedoch häufig eine abschreckende und langwierige Herausforderung dar, besonders wenn die Komplexität der Algorithmen und die Größe des Source Codes steigt.

4. Aufteilung von Software- und Hardware-Funktionalität

Viele Projekte nutzen heterogene Systeme, in diesem Fall FPGAs mit eingebetteten Prozessoren, wie z.B. die Xilinx Zynq Reihe, welche FPGAs mit ARM Prozessoren verbindet. Es kann enorm viel Zeit und Iterationen in Anspruch nehmen zu identifizieren, was auf dem Prozessor und was auf der Hardware laufen soll, um optional die parallele Beschaffenheit des FPGA auszunutzen.

5. Einfügen von Pragmas oder Anweisungen des HLS-Compilers in den C/C++ Code

Damit der HLS-Compiler die Software effektiv in Hardware implementieren kann, muss der Benutzer dem Compiler eine genau Anleitung in Form von Pragmas mitgeben. Das Festlegen, wann Pragmas verwendet werden sollen, wie ihre Parameter genutzt werden sollen, wo sie in den Code eingefügt werden sollen, und wie alle Pragmas gemeinsam auf System-Ebene innerhalb einer Anwendung zu optimieren sind, ist schwierig und zeitaufwändig für Experten und beinahe unmöglich für unerfahrene FPGA Nutzer.

Event-Tipp: FPGA-Kongress 2019 Auf dem FPGA-Kongress 2019 werden renommierte Referenten von Bausteinherstellern wir Intel, Xilinx sowie erfahrene Toolentwickler wie Cadence, Synopsys oder Silexica ihre Erkenntnisse und Errungenschaften in der FPGA-Entwicklung demonstrieren. Der Fachkongress, der von ELEKTRONIKPRAXIS und dem Schulungscenter PLC2 veranstaltet wird, fokussiert sich auf anwendergerechte Lösungen, die Sie schnell in Ihren eigenen Entwicklungs-Alltag integrieren können. Näheres zu Programm und Anmeldung finden Sie unter www.fpga-kongress.de .

Lösungsansätze für diese Herausforderungen

Zusammenfassend stellen diese Herausforderungen ein erhebliches Hindernis für Nutzung von HLS dar, obwohl die Vorteile des HLS-Designs einen signifikanten Mehrwert bringen können. HLS-Anbieter stellen eine umfassende Dokumentation und Schulungen bereit, um Kunden bei der Bewältigung dieser Herausforderungen zu helfen. Dies ist jedoch nach wie vor ein manueller Prozess, der viel Zeit in Anspruch nimmt.

Das SLX FPGA Tool von Silexica, das auf mehr als 10 Jahren Forschung im Compilerbau basiert, bietet praktische Lösungen für die in diesem Artikel beschriebenen Herausforderungen.

Zuerst analysiert SLX FPGA den C/C++ Quellcode auf Synthetisierbarkeit und bietet eine automatische und Tool-geführte Code-Umgestaltung des nicht-synthetisierbaren Codes. SLX führt den Benutzer hierbei durch jeden Abschnitt des Codes, der nicht synthetisierbar ist. Es konvertiert den Code automatisch oder gibt Anweisungen, wie der zu synthetisierende Code umgestaltet werden muss. In einer zukünftigen Version wird SLX FPGA nicht Hardware-freundliche Daten-Konstrukte identifizieren können, welche zu einer ineffizienten Hardware-Implementierung führen.

Das SLX Tool wird zudem auch eine Methode zur schnellen Durchführung von „What-If“ Analysen unterstützen, um festzustellen, welche verschiedenen Datentypen für eine effiziente Implementierung möglich sind. Ebenfalls für die Zukunft geplant ist eine Geschwindigkeits- und Flächenabschätzung für nicht-synthetisierbaren Code, um so wertvolle Erkenntnisse zu generiere, noch bevor der Code synthetisierbar gemacht werden muss.

Die nächste Herausforderung, welche SLX FPGA adressiert, ist die Analyse des Algorithmus oder der Anwendung nach Parallelität, die von sequentieller Ausführung zu einer parallelen Ausführungen umgewandelt werden kann. Durch das Identifizieren der Parallelität bietet SLX eine effiziente Hardwareimplementierung des C/C++ Codes. Falls ein Entwickler ein FPGA mit einem Embedded-Prozessorsystem nutzt, kann SLX FPGA auch die effiziente Verteilung zwischen den Software- und Hardware-Domänen vorschlagen.

Nachdem die Software- und Hardware- Partitionierung definiert wurde, fügt SLX FPGA die Pragmas in den Source Code ein, so dass der HLS-Compiler dann die Optimierungen in der Hardware implementieren kann.

FPGA-Grundlagen

Grundwissen zu programmierbarer Logik

FPGA-Grundlagen

Wie ist ein FPGA aufgebaut? Welche Vorteile bietet mir ein FPGA gegenüber einem Mikrocontroller? Und wie integriere ich die programmierbaren Logik-Bausteine in mein System-Design. Dieser Leitfaden bietet einen Überblick über die FPGA-Basics. weiter...

Wie nutzt man programmierbare Logik bei der Entwicklung von Applikations-Software?

Wie nutzt man programmierbare Logik bei der Entwicklung von Applikations-Software?

29.01.18 - Der Einsatz von FPGAs und programmierbarer SoCs bietet großes Potential, um die Leistung darauf basierender Anwendungs-Software signifikant zu beschleunigen. Es kommt nur auf den Einsatz der richtigen Toolchains und Bibliotheken an. lesen

* Loren Hobbs ist für das Produktmarketing bei Silexica verantwortlich und verfügt über mehr als 20 Jahre Berufserfahrung in den Bereichen Entwicklung und Marketing bei weltweit führenden Halbleiterherstellern wie Intel, Altera, Cypress und NXP.

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 45902356 / FPGA)