Ein Fachportal der eVision Systems GmbH

EDA Praxis / Praxiswissen

Bibliotheken und Projektstruktur für reproduzierbare HDL-Projekte

Wie Quelllisten, logische Bibliotheken und getrennte Buildverzeichnisse den Aufbau eines HDL-Projekts nachvollziehbar machen.

Ein HDL-Projekt besteht nicht nur aus seinen Quelldateien. Spracheinstellungen, Bibliothekszuordnungen, Abhängigkeiten, generierte Quellen und Werkzeugversionen bestimmen mit, welches Design tatsächlich analysiert wird. Wenn ein Projekt nur auf dem Rechner seines ursprünglichen Entwicklers läuft, ist dieses Wissen häufig in lokalen Einstellungen versteckt. Reproduzierbarkeit bedeutet, dass ein anderer Arbeitsplatz aus demselben freigegebenen Stand einen erklärbaren Aufbau durchführen kann.

Logische Bibliothek und Verzeichnis unterscheiden

Eine VHDL-Bibliothek ist ein logischer Namensraum für analysierte Designeinheiten. Das physische Verzeichnis, in dem ein Simulator seine Daten ablegt, ist eine Implementierungsentscheidung des Werkzeugs. Ein Ordner namens common wird daher nicht automatisch zur Bibliothek common. Ebenso bedeutet eine vorhandene Datei noch nicht, dass ihre Entity oder ihr Package in der richtigen Bibliothek verfügbar ist. Diese Unterscheidung hilft, viele scheinbare Sprachprobleme als Konfigurationsproblem zu erkennen.

Der besondere Name work bezeichnet die aktuelle Arbeitsbibliothek des jeweiligen Analysekontexts. Er ist kein guter Ersatz für einen bewusst benannten gemeinsamen IP-Namensraum. Werden Quellen in verschiedene Bibliotheken analysiert, muss die Referenz dazu passen. Bei einer Fehlermeldung über eine fehlende Designeinheit sollten deshalb Name, Zielbibliothek, Analysefolge und die tatsächlich ausgewählte Architecture gemeinsam untersucht werden.

Eine einfache Struktur mit klaren Grenzen

project/
  rtl/              # eigene synthetisierbare Quellen
  tb/               # Testbenches und Referenzmodelle
  scripts/          # Build- und Testeinstiege
  config/           # Quelllisten und Spracheinstellungen
  docs/             # Anforderungen und Bedienhinweise
  vendor/           # freigegebene Fremdquellen oder Verweise
  build/            # erzeugte Bibliotheken, Logs, Ergebnisse

Die Namen sind ein Vorschlag, keine notwendige Norm. Wichtiger ist die Trennung von Eingaben und erzeugten Ergebnissen. Ein frischer Build darf ausschließlich erzeugbare Verzeichnisse neu anlegen. Quellen oder manuell gepflegte Constraints gehören deshalb nicht zwischen Simulatorartefakte. Auch eine schnell angelegte Diagnose-Datei sollte vor dem nächsten Bereinigungsschritt in einen sicheren, eindeutig benannten Bereich verschoben werden.

Versionieren Sie kleine Textdateien, die den Aufbau erklären. Große heruntergeladene Bibliotheken oder geschützte IP müssen nicht ungeprüft in ein Repository kopiert werden. Dokumentieren Sie stattdessen Bezugsquelle, freigegebene Version, Prüfsumme soweit verfügbar und erforderliche Nutzungsrechte. Ein reiner Downloadlink ohne Versionsbezug ist für eine langfristig nachvollziehbare Wiederherstellung zu wenig.

Abhängigkeiten explizit halten

Eine Package-Deklaration muss vor ihren Verwendern analysiert sein. Bei größeren Projekten reicht eine alphabetische Dateiliste dafür nicht aus. Entweder pflegt das Projekt eine korrekte Reihenfolge oder ein geeignetes Werkzeug ermittelt sie aus einem vollständigen Projektmodell. Beide Wege brauchen eine Quelle der Wahrheit. Wenn IDE und Simulationsskript unterschiedliche Dateimengen betrachten, sind widersprüchliche Diagnoseergebnisse vorprogrammiert.

VUnit dokumentiert einen Python-gesteuerten Projektaufbau und die Zuordnung von Quellen zu Bibliotheken. Sigasi dokumentiert wiederum externe Compileraufgaben auf Grundlage des ausgewählten Projekt-Targets. Diese Möglichkeiten können helfen, den Zusammenhang zwischen Entwicklungsumgebung und Simulation sichtbar zu halten. Ihre konkrete Konfiguration gehört zum Projekt und muss gegen die tatsächlich eingesetzten Versionen geprüft werden. VUnit user guide; Sigasi: Integrating with external tools.

Quelldatei, Bibliothek und Build sind verschiedene DingeDie Projektkonfiguration verbindet versionierte Eingaben mit logischen Namensräumen und erzeugten Arbeitsdaten.
Beispiel einer expliziten Quellzuordnung; Namen sind frei gewählt
Versionierte QuelleLogische ZielbibliothekAufgabe im Beispiel
rtl/types_pkg.vhdcommonGemeinsame Typen deklarieren.
rtl/counter.vhddesign_libDen Baustein analysieren; benötigte Packages müssen verfügbar sein.
tb/tb_counter.vhdtest_libDie Testbench analysieren; Referenzen müssen zu den Bibliotheken passen.

Auf schmalen Bildschirmen lässt sich die Tabelle horizontal verschieben.

Reihenfolge folgt AbhängigkeitenPackage-Deklaration → Verwender. Eine alphabetische Dateiliste ist dafür keine Garantie.
Build-Verzeichnis ist physischDer Simulator legt erzeugte Arbeitsdaten ab. Ein Ordnername allein ordnet keine Quelle einer logischen Bibliothek zu.

work bezeichnet die aktuelle Arbeitsbibliothek des jeweiligen Analysekontexts. Eine Quellliste muss Zielbibliotheken und Abhängigkeiten ausdrücklich beschreiben.

Generierte Quellen und FPGA-Bibliotheken

Generierte Dateien verdienen eine eigene Entscheidung: Sind sie reproduzierbar aus versionierten Eingaben ableitbar oder müssen sie als freigegebenes Ergebnis archiviert werden? Ein Generator benötigt möglicherweise dieselbe Version wie bei der letzten Freigabe. Festzuhalten sind daher Eingaben, Parameter und Werkzeugstand. Sonst kann ein scheinbar unveränderter HDL-Build nach einem Update andere Quellen erhalten.

FPGA-Herstellerbibliotheken werden häufig für eine bestimmte Simulator- und Werkzeugkombination vorbereitet. Behandeln Sie sie als versionierte Abhängigkeit und vermeiden Sie ein gemeinsam beschriebenes, ständig wechselndes Bibliotheksverzeichnis für alle Projekte. Verschiedene parallele Builds dürfen nicht versehentlich dieselben Artefakte überschreiben. Ein unveränderlicher vorbereiteter Bibliotheksstand plus projektbezogene Arbeitsbibliothek ist leichter zu kontrollieren.

Den sauberen Aufbau wirklich prüfen

Ein inkrementeller Lauf kann fehlende Buildschritte verbergen, weil alte analysierte Einheiten noch verfügbar sind. Ergänzen Sie deshalb regelmäßig einen Aufbau in einem neuen Ausgabeverzeichnis. Verwenden Sie dafür einen klar begrenzten Projektpfad; ein allgemein zusammengesetzter rekursiver Löschbefehl ist unnötig riskant. Der neue Aufbau soll sämtliche benötigten Eingaben selbst finden und bei fehlenden Abhängigkeiten verständlich abbrechen.

Zu jedem Ergebnis gehören mindestens Quellstand, Werkzeugversion, Testauswahl, Einstellungen und ein Zeitstempel. Wenn Zufall eingesetzt wird, kommt der Seed hinzu. Auch Umgebungsvariablen können relevant sein, etwa für Include-Verzeichnisse oder Lizenzserver. Geheimnisse dürfen dabei nicht ungefiltert in ein Buildprotokoll gelangen. Dokumentieren Sie die Bedeutung einer Einstellung, ohne vollständige Umgebungsabbilder zu veröffentlichen.

Eine Übergabe ist der stärkste Alltagstest

Bitten Sie eine zweite Person, ausschließlich mit der Projektanleitung einen kleinen Test zu starten. Jede mündliche Zusatzinformation ist ein Hinweis auf fehlende Dokumentation. Verbessern Sie die Anleitung danach und wiederholen Sie den Versuch auf einem getrennten Arbeitsverzeichnis. Das Ziel ist nicht eine besonders komplizierte Buildarchitektur, sondern ein verständlicher Einstieg, der kleine Änderungen und spätere Wiederholungen zuverlässig trägt.

Die Application Note zu reproduzierbaren Regressionen ergänzt diese Struktur um ausführbare Teststeuerung und Fehlerbehandlung. Der Beitrag über Syntaxprüfung, Linting und Simulation erklärt, welche Ergebnisse dabei getrennt aufbewahrt werden sollten.

Quellen und Stand

Recherche geprüft am 19.10.2026. VUnit user guide, Sigasi: Integrating with external tools.

Sie möchten diese Vorgehensweise in Ihrem Projekt einsetzen?

Entwicklungsablauf gemeinsam prüfen

EDA PRAXIS / NEWSLETTER

Neue Perspektiven.
Direkt ins Postfach.

Praxiswissen zu HDL, Simulation und Verifikation. Neue Beiträge, Application Notes und Hinweise zu passenden Werkzeugen.