Suchen

AXI4-Registerbänke nie wieder von Hand programmieren

| Autor / Redakteur: Guy Eschemann * / Sebastian Gerstl

Fast jedes modernes FPGA-Design hat sie: Hardware/Software-Schnittstellen in Form von AXI4-Registerbänken. Diese von Hand anzulegen ist meist sehr aufwändig, doch der web-basierte Codegenerator airhdl bietet eine grafische Eingabe und automatische Register-Generierung.

Firma zum Thema

Waveform eines AXI4-Interfaces beim Abgleich mit einer Verification IP. Die Generierung von Axi4-Registerbänken von Hand ist oft mühselig und birgt hihes Fehlerpotential. Einfacher ist es, sich den zugehörigen HDL-Code automatisch generieren zu lassen.
Waveform eines AXI4-Interfaces beim Abgleich mit einer Verification IP. Die Generierung von Axi4-Registerbänken von Hand ist oft mühselig und birgt hihes Fehlerpotential. Einfacher ist es, sich den zugehörigen HDL-Code automatisch generieren zu lassen.
(Bild: Xilinx)

Registerbänke bestehen aus Kontroll- und Statusregistern. Kontrollregister können von der Software aus geschrieben werden, und steuern oder konfigurieren die Hardware. Über Statusregister kann die Software den aktuellen Zustand der Hardware abfragen. Es gibt auch Interruptregister, welche von der Hardware gesetzt werden um bestimmte Ereignisse zu signalisieren, und von der Software zurückgesetzt werden, nachdem das Ereignis verarbeitet wurde.

Die einzigartige Stellung von Registerbänken, an der Schnittstelle zwischen Hardware und Software, macht diese zu besonders kritischen Elementen in jedem FPGA-Projekt. Nicht selten werden Hardware und Software von unterschiedlichen Personen entwickelt.

Bildergalerie
Bildergalerie mit 10 Bildern

So kann es schnell passieren, dass der Hardwareentwickler ein Register an eine andere Adresse verlegt ohne das der Softwareentwickler es mitbekommt. Die Software liest dann den Registerinhalt von einer falschen Adressen, und man wundert sich, dass das System plötzlich nicht mehr funktioniert. Welcher Entwickler kennt diese Situation nicht?

Weil wir alle Besseres zu tun haben als Registerbänke von Hand zu programmieren, mühsam in Microsoft Word zu dokumentieren, und Inkonsistenzen zwischen Registerdefinitionen in Hardware und Software zu debuggen habe ich airhdl entwickelt. Airhdl ist ein webbasierter Codegenerator, mit dem sich Registerbänke komfortabel im Web-Browser beschreiben und generieren lassen. Da airhdl in der „Cloud“ läuft gibt es—anders als bei anderen EDA Tools—nichts zu installieren oder zu lizensieren.

Es ist denkbar einfach: airhdl.com besuchen, (kostenlos) registrieren, Registerbänke erstellen, den generierten Code herunterladen und in das Design integrieren.

Arbeiten mit airhdl

Die Registereingabe besteht in airhdl aus folgenden Schritten:

  • 1. Eine neue Registerbank erstellen
  • 2. Die Registerbank mit Kontroll-, Status- und Interruptregistern füllen
  • 3. Die Register mit (Bit-)Feldern füllen

Es können jederzeit folgende Dateien generiert und heruntergeladen werden:

  • C Header mit allen Registerdefinitionen (d.h. Registeradressen, Bit-Offsets der Felder innerhalb der Register, Bit-Masks für alle Felder usw.)
  • Synthetisierbare VHDL- und SystemVerilog Komponenten mit AXI4-Lite Schnittstelle
  • Registerdokumentation im HTML Format
  • Registerbeschreibung im XML (IP-XACT) und JSON Format

Da alle Dateien aus einer zentralen, in einer Datenbank abgelegten Registerdefinition generiert werden ist die Konsistenz zwischen C-Header, HDL-Dateien und Dokumentation automatisch sichergestellt. Zudem enthalten alle generierten Dateien eine Revision ID welche bei jeder Änderung der Registerbank automatisch hochgezählt wird. Anhand der Revision ID lässt sich sofort (und bei Bedarf sogar automatisch) prüfen, ob z.B. C-Header und HDL-Komponente zusammen passen.

Beispiele zur Funktionsweise von airhdl

Anhand eines kleinen Beispiels möchte ich nun demonstrieren, wie leicht sich mit airhdl eine Registerbank mit einem Kontroll- und einem Statusregister zum Anschliessen an ein Xilinx Zynq-System erstellen und integrieren lässt. Als Zielsystem dient das Base Zynq Design, welches Xilinx Vivado als Beispielprojekt zur Verfügung stellt.

Als erstes werden wir in airhdl eine neue Register Map erstellen und ihr einen Namen und eine Basisadresse geben. Die Basisadresse sollte so gewählt werden, dass sie im Zynq-System nicht mit anderen Komponenten kollidiert. Das lässt sich im Vivado Adress-Editor leicht überprüfen.

Bildergalerie
Bildergalerie mit 10 Bildern

Anschließend wird die Register Map mit Registern gefüllt. Die Eingabe erfolgt ebenfalls im Web-Browser, in einem übersichtlichen Dialogfenster. Jedes Register bekommt einen Namen, ein Adressoffset innerhalb der Registerbank, eine optionale Beschreibung (für Dokumentationszwecke) und einen Zugriffsmodus (Access Mode). Airhdl unterstützt für Register folgende Zugriffsmodi:

  • read-write Register können vom AXI4 Bus aus (z.B. von der CPU) geschrieben und gelesen werden
  • read-only Register erhalten ihren Wert von der User Logik und können vom AXI4 Bus aus nur gelesen werden
  • write-only Register können vom AXI4 Bus aus nur geschrieben werden. Der Verzicht auf die Lesemöglichkeit spart etwas Logik und entspannt das Timing im internen Lesepfad
  • interrupt Register können von der Logik aus gesetzt und vom AXI4 Bus aus gelesen und im write-one-to-clear Verfahren zurückgesetzt werden

Bild 3 zeigt die Übersicht der Register Map, nachdem ein „control“ und ein „status“ Register erstellt wurden.

Anschließend müssen wir die Register noch mit Leben—also mit Feldern—befüllen. Der Einfachheit halber haben in airhdl alle Felder innerhalb eines Registers den gleichen Zugriffsmodus. Alle Felder eines read-write Registers sind also automatisch read-write Felder.

Jedes Registerfeld verfügt über einen Namen, eine optionale Beschreibung, ein Bit Offset und eine Bit Width welche das Feld innerhalb des 32-Bit Registers positionieren, und einen Reset-Wert. Natürlich sind Änderungen wie das Umbenennen oder Verschieben eines Feldes in airhdl jederzeit möglich.

In unserem Beispiel bekommt das „control” Register ein 4-Bit Feld namens „led” und das „status” Register ein 2-Bit Feld namens „button”.

Bild 5 zeigt die Übersicht des „control“ Registers nach Erstellen„led” Registerfeldes sieht das „control” Feldes.

Nachdem auch im “status” Register ein „button“ Feld erstellt wurde können generierte Dateien heruntergeladen werden. Airhdl stellt folgende Dateien zur Verfügung:

  • C-Header mit allen Registerdefinitionen in Form von Konstanten
  • SystemVerilog Modul
  • VHDL Komponente und Testbench
  • HTML Registerdokumentation
  • Registerdefinitionen im XML (IP-XACT) und JSON Format

Relevant für unser Zynq-System sind lediglich der C-Header (welcher in der Software eingebunden wird) und die VHDL-Komponente, die dem Vivado-Projekt hinzugefügt wird. Nachdem das VHDL-Package und die VHDL-Komponente im Vivado-Projekt importiert wurden kann die Registerbank im Block Diagramm über die “Add Module…” Funktion instanziiert werden (siehe auch Bilder 7 und 8).

Die Vivado-Wizards erledigen können das Anschließen der Registerkomponente an die AXI-Infrastruktur auf Wunsch vollautomatisch erledigen (Bild 9).

Anschluss der Registerkomponente an die User-Logik

Als letzter Schritt bleibt nun der Anschluss der Registerkomponente an die User-Logik. Dazu stellt die Registerkomponente folgende User-Ports zur Verfügung: Für jedes Register gibt es ein Strobe-Port, welches die User-Logik über Schreibzugriffe (für read-write oder write-only Register) oder Lesezugriffe (für read-only Register) informiert. Für jedes Registerfeld gibt es einen Port, welcher den Zustand des Registerfeldes reflektiert. Bei read-write oder write-only Register ist das ein Ausgangsport, bei read-only Register ein Eingangsport.

Bildergalerie
Bildergalerie mit 10 Bildern

In unserem Beispielprojekt stehen daher folgende User-Ports zur Verfügung:

Name Breite (Bits) Richtung Beschreibung
control_strobe 1 out Write-Strobe des „control“ Registers.
Wird bei jedem Schreibzugriff auf das „control“
Register gepulst.
control_led 4 out Aktueller Wert des „led“ Feldes im „control“ Register.
status_strobe 1 out Read-Strobe des „status“ Registers.
Wird bei jedem Lesezugriff auf das „status“ Register
gepulst.
status_button 2 in Aktueller Wert des „button“ Feldes im „status“ Register.

Die User-Ports können mit interner User-Logik, oder einfach mit externen Ports verbunden werden.

Das Zynq-System kann anschließend kompiliert werden. Mithilfe des generieten C-Headers stehen der Zynq-Software alle Registerdefinitionen zur Verfügung, so daß die Software-Integration leicht erfolgen kann.

Damit auch die Dokumentation immer auf dem aktuellen Stand bleibt kann airhdl ebenfalls eine Registertabelle im HTML-Format generieren. Es gibt wirklich keinen Grund mehr, AXI4 Registerbänke von Hand zu programmieren.

Airhdl ist ein kostenloser, web-basierter Codegenerator für AXI4 Registerbänke. Die Webseite ist seit Ende 2014 in Betrieb und hat aktuell über 300 registrierte Benutzer.

* Guy Eschemann (@geschema auf Twitter), Entwickler von airhdl, ist FPGA-Entwickler und Geschäftsführer der noasic GmbH mit Sitz in Kehl. Sein Schwerpunkt liegt im Bereich VHDL-Entwicklung und -Verifikation, und in der Entwicklung von kundenspezifischen EDA-Werkzeugen. Er ist seit 2015 Repräsentant der Firma Enclustra in Deutschland und Frankreich.

(ID:45017592)