Field Programmable Gate Arrays (FPGAs) sind allgegenwärtig in Hochgeschwindigkeits-Digitalsystemen mit Echtzeitanforderungen geworden. Sie können für zeitkritische Anwendungen, digitale Signalverarbeitung oder sogar Krypto-Mining verwendet werden. Ihre Effizienz in Bezug auf Geschwindigkeit und Energieverbrauch macht sie perfekt für wiederverwendbare Hochgeschwindigkeitsanwendungen. Die Geschwindigkeit, mit der FPGAs arbeiten, nimmt in einem schwindelerregenden Tempo zu, doch ihre Einführung in Continuous Integration (CI)-Pipelines scheint nicht im gleichen Maße voranzuschreiten. In diesem Artikel werden wir das Konzept von CI-Pipelines, deren Anwendung auf FPGAs und Beispiele zur Einrichtung betrachten.
Falls es Ihnen noch nicht aufgefallen ist: Ich beschäftige mich praktisch ununterbrochen mit Continuous Integration. Egal, ob es sich um CI für das PCB-Design oder um CI für eingebettete Systeme handelt, ich suche stets nach Möglichkeiten, Builds für jedes System kontinuierlich zu verbessern und zu automatisieren. In letzter Zeit habe ich Rückmeldungen erhalten, dass bei FPGAs und CI-Systemen nicht viel Fortschritt erzielt wurde. Der Grundgedanke hinter CI und FPGAs folgt jedoch der gleichen Logik wie bei allen anderen CI-Systemen: Es geht darum, eine wiederholbare Build-Umgebung zu schaffen, die uns die schwere Arbeit abnimmt. In einem auf FPGAs basierenden CI-System würden wir in der Regel die folgenden drei Phasen sehen:
Abbildung 1: Phasen einer FPGA-CI-Pipeline
Jede Phase ist für sich wichtig und erfordert ihre eigene Einrichtung. Sehen wir uns jede Phase an, um zu verstehen, was sie darstellen und wie man sie implementiert.
Die Simulation ist ein wesentlicher Bestandteil des FPGA-Designs. Der Bau eines FPGA-Images, das auf ein Ziel geladen werden kann, erfordert viel Zeit. Anstatt Code zu schreiben, zu kompilieren und auf der Hardware zu testen, ermöglicht uns die Simulation, unseren Code oder Register-Transfer-Level (RTL) in einer Umgebung zu testen, die das Verhalten eines FPGAs simuliert. Dies wird in der Regel auf Benutzerebene durchgeführt, es wird jedoch immer beliebter, FPGA-Simulationen in CI-Pipelines zu integrieren. Das bedeutet, dass jemand seinen Code in sein Repository überträgt und eine Pipeline startet, um die (selbstüberprüfende) Simulation irgendwo in der Cloud auszuführen. Um dies tatsächlich „irgendwo in der Cloud“ zu tun, muss man eine Umgebung schaffen, die gekapselt oder containerisiert werden kann, um eine selbsttragende Umgebung zu schaffen. Wir tun dies mithilfe sogenannter Docker-Container. Diese funktionieren fast wie virtuelle Maschinen, die überall ausgeführt werden können. Dieser spezielle Docker-Container beispielsweise erstellt eine containerisierte Umgebung, die es einem Benutzer ermöglicht, Icarus Verilog innerhalb eines beliebigen Linux-Systems auszuführen. Wir nehmen diesen Container dann und verwenden ihn, um unsere FPGA-Simulationspipeline zu erstellen. In diesem Beispiel sehen Sie eine einfache „Hello World“-Pipeline, die in der Cloud unter Verwendung von Icarus Verilog ausgeführt wird. Beachten Sie, dass dies mit jedem FPGA-Simulationstool durchgeführt werden kann.
Abbildung 2: Pipeline-Lauf einer FPGA-Simulation mit Gitlab CI
Eine zweite, ebenfalls sehr wichtige Phase innerhalb der FPGA-Pipeline ist die Build-Phase. Wir möchten in der Lage sein, zu synthetisieren, Platzierung und Routing durchzuführen und einen Bitstream für unser FPGA-Design zu erzeugen. Dies wird normalerweise von den Nutzern mit dem Werkzeug durchgeführt, das vom Anbieter bereitgestellt wird (z. B. Xilinx, Intel, Microchip usw.). Anstatt diesen Build lokal auszuführen, möchten wir ihn an einem anderen Ort durchführen. Das kann jedoch etwas kompliziert sein, da die FPGA-Tools in der Regel sehr groß sind. Ein Ansatz, den viele Nutzer verfolgen, besteht darin, eine dedizierte "Build-Maschine" zu haben, die alle Build-Pipelines ausführt. Dieser Ansatz ist nicht schlecht, skaliert jedoch nicht und kann zu einem Single Point of Failure werden. Andere haben versucht, FPGA-Tools zu containerisieren, aber diese Images können über 100 GB groß werden, was sie im Wesentlichen für Cloud-Anwendungen unbrauchbar macht. Ein Mittelweg, der sich gut bewährt hat, ist die Netzwerkinstallationsmethode. Als Beispiel habe ich einen Container erstellt, der Vivado 2019.1 ausführt, aber das Tool selbst ist nicht auf dem Image installiert (somit ist die Imagegröße kleiner als 300 MB). Was ich getan habe, ist, Vivado auf einem Netzlaufwerk zu installieren (in diesem Fall EFS in AWS) und es dann in meinen Docker-Container einzubinden. Da ich meine Pipeline in AWS ausführe, ist die Latenz zwischen dem EFS und der EC2-Instanz (Kubernetes Node) vernachlässigbar.
In diesem Beispiel verwende ich ein Arty A7-Gerät von Digilent, um einen digitalen Filter zu erstellen. Ich benutze ein automatisiertes Build-Skript, um die Bitstream-Datei für mein Gerät bei jedem Push in mein Repository zu generieren. Wie Sie im Output sehen können, rufe ich erfolgreich Vivado auf, obwohl es nicht im Docker-Container vorhanden ist (d. h. es ist als externes Laufwerk eingebunden).
Abbildung 3: Pipeline-Lauf eines FPGA-Builds unter Verwendung von Gitlab CI
Die Testphase hängt wirklich von jedem Einzelnen und Projekt ab. Das Ziel des Testens innerhalb einer CI-Pipeline ist es, so viel wie möglich zu automatisieren. Genau wie ich mein DSP-Beispiel für Arduinos automatisiert habe mit meinem Analog Discovery 2, könnte ich das auch hier tun. Eine automatisierte Testlösung für FPGAs zu erörtern, würde jedoch den Rahmen dieses Artikels sprengen. Das Hauptprinzip besteht darin sicherzustellen, dass es wiederholbar ist und in einer gekapselten oder containerisierten Umgebung ausgeführt werden kann. Es ist wichtig, daran zu denken, dass das Testen ein wichtiger Bestandteil der CI-Pipeline ist und auf dem Level implementiert werden sollte, das der Benutzer bewältigen kann.
In diesem Artikel haben wir das Konzept von CI-Pipelines für FPGAs behandelt. Wir haben die drei kritischen Phasen, die FPGA-Pipelines ausmachen, überprüft: Simulation, Build und Test. Wir haben uns Beispiele für Simulations- und Build-Pipelines angesehen und die Bedeutung des Testens diskutiert. Nach Durchsicht dieses Artikels und der Beispiele sollte der Benutzer in der Lage sein, die grundlegende Zusammensetzung einer FPGA-basierten CI-Pipeline zu verstehen.
Wenn Sie bereit sind, Ihre eigene maßgeschneiderte FPGA-Platine zu entwickeln, um Ihr eingebettetes System zu unterstützen, nutzen Sie das vollständige Set an PCB-Design- und Layoutfunktionen in Altium Designer®. Sobald Sie Ihre PCB abgeschlossen haben und bereit sind, Ihre Entwürfe mit Mitarbeitern oder Ihrem Hersteller zu teilen, können Sie Ihre abgeschlossenen Entwürfe über die Altium 365™-Plattform teilen. Alles, was Sie benötigen, um fortschrittliche Elektronik zu entwerfen und zu produzieren, finden Sie in einem Softwarepaket.
Wir haben nur an der Oberfläche dessen gekratzt, was mit Altium Designer auf Altium 365 möglich ist. Starten Sie noch heute Ihre kostenlose Testversion von Altium Designer + Altium 365.