PCI Express in FPGAs der Intel V-Serie: Schnittstellengrundlagen und Hardware-Kernfunktionen

Einführung


Die PCI Express- oder PCIe-Schnittstelle, die vielen bekannt ist, stand Entwicklern von FPGA-Systemen bereits zur Verfügung, als sie sich gerade erst in der digitalen Technologie verbreitete. Zu diesem Zeitpunkt gab es eine Lösung, bei der der Softwarekern mit einem externen Mikrokreislauf auf physikalischer Ebene verbunden war [ 5 ]. Dies ermöglichte die Erstellung einer einspurigen PCIe-Leitung mit einer Geschwindigkeit von 2,5 Gigatransaktionen pro Sekunde. Dank der Entwicklung von Technologien wurde die physische Schicht der Schnittstelle auf die PCIe-Hardwareblöcke innerhalb der FPGAs selbst migriert. Die Anzahl der möglichen Kanäle stieg auf 8 und in einer Reihe neuer Mikroschaltungen auf 16. Nach modernen Standards sind die möglichen Datenübertragungsraten gestiegen.

Gleichzeitig ist es immer noch schwierig, Hilfsmaterialien für die Arbeit mit den Hardwarekernen moderner FPGAs in russischsprachigen Quellen zu finden, da auf der PCIe-Schnittstelle selbst nicht viele Informationen verfügbar sind. Leitfaden zur Hardware PCI Express-Kerne impliziert, dass der Entwickler bereits mit dem Standard vertraut ist und die Grundlagen der Datenübertragung zwischen dem Gerät und einem Personal Computer (PC) versteht. Die Fülle an Informationen im PCIe-Standard selbst versteht jedoch nicht sofort, welche Schritte unternommen werden müssen, um Daten erfolgreich vom Gerät in den PC-Speicher zu übertragen oder umgekehrt. Um ein vollständigeres Bild zu erhalten, muss ein beträchtlicher Teil der Informationen Stück für Stück aus verschiedenen Quellen gesammelt werden. Für Entwickler von Intel FPGA-Systemen ist die Schwierigkeit ebenfallsDie meisten verfügbaren Materialien und Artikel beschreiben die Arbeit mit Xilinx FPGA-Hardwarekernen.

In diesem Artikel wird der Autor versuchen, darüber zu sprechen, was der FPGA-Systemdesigner wissen muss, um mit der PCI Express-Schnittstelle arbeiten zu können. wird die Funktionen der Arbeit mit Hardwarekernen PCI Express FPGAs der V-Serie von Intel in der Avalon-ST-Version berücksichtigen.

PCIe-Ebenen und Pakettypen


Trotz der Tatsache, dass PCI Express oft als Bus bezeichnet wird, ist diese Schnittstelle ein Netzwerk von Geräten, die durch Gruppen von seriellen Duplexkanälen verbunden sind. Das PCI Express-Netzwerk selbst besteht aus mehreren Hauptknoten: dem Root (Root), dem Endpunkt (Endpoint) und dem Router (Switch) (Abbildung 1). Um Daten nur zwischen zwei Geräten zu übertragen, müssen ein Root und ein Endpunkt vorhanden sein. Bei modernen PCs befindet sich die Netzwerkwurzel zusammen mit den Kernen des Zentralprozessors auf einem Substrat. Unabhängig davon, wo sich das PCIe-Stammverzeichnis befindet, ist es dem Systemspeicher zugeordnet.


Abbildung 1 - PCIe-Netzwerk

Das PCIe-Datenübertragungsprotokoll ist in drei Schichten unterteilt: die Transaktionsschicht, die Datenverbindungsschicht und die physikalische Schicht. Schnittstellendaten werden in Form von Paketen übertragen. Eine verallgemeinerte Ansicht von Paketen ist in Abbildung 2 dargestellt.


Abbildung 2 - Eine verallgemeinerte Ansicht von PCIe-Paketen

Auf Transaktionsebene besteht jedes Paket (TLP) aus mindestens einem Header. Je nach Pakettyp können auf den Header Daten folgen - der nützliche Inhalt des Pakets. Eine zusätzliche Prüfsumme kann auch am Ende des Pakets hinzugefügt werden. Es gibt die folgenden Haupttypen von Paketen auf Transaktionsebene (Tabelle 1):

Tabelle 1 - Arten von Paketen auf Transaktionsebene
Nr. P.PaketansichtName des Pakettyps gemäß Spezifikation
1SpeicherleseanforderungSpeicherleseanforderung
2SpeicherschreibanforderungSpeicherschreibanforderung
3Leseanforderung für E / A-SpeicherplatzE / A-Leseanforderung
4Schreibanforderung für E / A-SpeicherplatzE / A-Schreibanforderung
5Konfigurationsanforderung lesenLeseanforderung für die Konfiguration
6Konfigurationsanforderung schreibenKonfigurationsschreibanforderung
7LeseantwortFertigstellung
8BotschaftBotschaft

Auf der Verbindungsschicht werden jedem Paket auf Transaktionsebene eine Paketsequenznummer und eine Verbindungsprüfsumme hinzugefügt. Die Datenverbindungsschicht bildet auch ihre eigenen Pakettypen (DLLP), einschließlich (Tabelle 2):

Tabelle 2 - Datenverbindungspakettypen
Nr. P.PaketansichtName des Pakettyps gemäß Spezifikation
1Paketbestätigung auf TransaktionsebeneTLP Ack
2Ablehnung von Paketen auf TransaktionsebeneTLP Nack
3EnergieverwaltungEnergieverwaltung
4DatenflusskontrolleAblaufsteuerung

Schließlich ergänzt die physikalische Schicht die Pakete mit Symbolen für den Anfang und das Ende der Pakete, die aus dem IEEE 802.3-Standard entlehnt sind. Für Pakete auf Transaktionsebene werden die Symbole K27.7 bzw. K29.7 verwendet; für Datenverbindungspakete die Symbole K28.2 und K29.7.
Bei der Arbeit mit FPGA-Hardwarekernen muss der Entwickler nur Pakete auf Transaktionsebene erstellen. Kanal- und physikalische Schichtpakete werden durch Kernelblöcke gebildet.

Paketrouting auf Transaktionsebene


Insgesamt können verschiedene Arten von Paketen auf drei Arten vom Absender zum Empfänger gelangen:

  • Weiterleitung an die Adresse;
  • ID-Routing
  • indirektes Routing.

Die Beziehung zwischen der Routing-Methode und dem Typ des Pakets auf Transaktionsebene ist in Tabelle 3 dargestellt.

Tabelle 3 - Entsprechung der Routing-Methode und des Pakettyps
№p
1.
I/O I/O
2.
ID.

3ID

.


Jeder Endpunkt verfügt über einen eigenen Konfigurationsbereich, in dem sich verschiedene Befehls- und Statusregister befinden. Darunter befinden sich das Basisadressregister oder die BAR. Bei der Initialisierung der Endpunkte durchsucht das BIOS oder Betriebssystem die BAR der Endpunkte, um festzustellen, wie viel Speicher und Speicherplatz für jeden Endpunkt erforderlich ist. Dann wird in jede aktive BAR die Startadresse des zugewiesenen Teils des Systemspeichers geschrieben. Infolgedessen erhält der Endpunkt eine Adresse, an die entsprechende Anforderungen gesendet werden können. Normalerweise wird am Endpunkt eine Registerkarte gebildet, die an die zugewiesenen Speicherbereiche gebunden ist.

Außerdem erhält jeder Endpunkt bzw. das darin enthaltene logische Gerät seine eindeutige Kennung, die aus drei Teilen besteht: Busnummer, Gerätenummer, Nummer des logischen Geräts (Funktion).

Auf diese Weise verfügt das System über genügend Informationen, um mit dem Endpunkt zu kommunizieren. Das Übertragen von Daten mithilfe von Abfragen in der BAR weist jedoch eine schlechte Leistung auf. Erstens ist für eine 32 Bit breite BAR die verwendbare Anforderungslänge auf ein Doppelwort (DWORD) begrenzt; für eine 64-Bit-Leiste zwei Doppelwörter. Zweitens erfolgt jede Anforderung unter Beteiligung des Zentralprozessors. Um die Belastung des Zentralprozessors zu verringern und die Größe jedes Pakets zu erhöhen, muss der Endpunkt Daten unabhängig voneinander in den oder aus dem Systemspeicher verschieben. Dazu muss der Endpunkt wissen, an welchen Systemspeicheradressen er Daten schreiben oder lesen kann.

In Anbetracht des Obigen kann das allgemeine Datenübertragungsschema zwischen dem Endpunkt und dem Systemspeicher wie folgt dargestellt werden:

  1. Der Endpunkttreiber weist Puffer im Systemspeicher zum Schreiben von Daten zu.
  2. Der Treiber bildet im Systemspeicher eine Reihe von Adressen und Puffergrößen - Pufferdeskriptoren zum Schreiben von Daten.
  3. Der Endpunkttreiber schreibt die Adresse des Satzes von Deskriptoren in die Geräteregister, die den BAR-Bereichen zugeordnet sind.
  4. der Endpunkttreiber programmiert Datenübertragungssteuerregister, die BAR-Bereichen zugeordnet sind;
  5. Der Endpunkt sendet eine Anforderung zum Lesen des Systemspeichers, um einen Satz von Deskriptoren zum Schreiben in den Systemspeicher zu erhalten.
  6. Der Endpunkt sendet Schreibanforderungen an den Systemspeicher und füllt die Speicherpuffer.
  7. / , , , ;
  8. PCIe.


In der Phase, in der der Treiber die Endpunktregister konfiguriert, erhält der Endpunkt abhängig von der Art des der BAR zugeordneten Adressraums eine Schreibanforderung in den Speicher (Abbildung 3) oder eine Schreibanforderung in den E / A-Bereich. Wenn der Treiber während der Registerkonfiguration ein Register liest, empfängt der Endpunkt auch die entsprechenden Leseanforderungen (Abbildung 4).

Bild
Abbildung 3 - Beispiel einer Anforderung zum Schreiben in den Speicher 1 DW lang


Abbildung 4 - Beispiel einer Anforderung zum Lesen aus dem Speicher 1 DW lang

Im Gegensatz zu Schreib- oder Leseanforderungen weisen E / A-Anforderungen eine Reihe von Einschränkungen auf. Erstens erfordern sowohl Schreib- als auch Leseanforderungen eine Antwort des Empfängers. Dies führt dazu, dass die Datenübertragungsrate unter Verwendung von Anforderungen an den E / A-Raum viel niedriger wird, als es die theoretische PCIe-Bandbreite zulässt. Zweitens ist die Adresse von E / A-Speicherplatzanforderungen auf 32 Bit begrenzt, wodurch kein Zugriff auf Fragmente des Systemspeichers über 4 GB hinaus möglich ist. Drittens dürfen E / A-Speicherplatzanforderungen ein Doppelwort nicht überschreiten und nicht mehrere virtuelle Kanäle für den Transport verwenden. Aus diesen Gründen werden Anfragen zum Schreiben und Lesen in den E / A-Bereich nicht weiter berücksichtigt. Dennoch,Der Inhalt der Header für den Schreib- / Lesespeicher und den E / A-Raum unterscheidet sich nur in einer Reihe von Feldern. Daher gelten die in den 3, 4 gezeigten Paketstrukturen auch für Anforderungen im E / A-Raum.

Wenn ein Endpunkt oder ein PCIe-Stamm eine Anforderung zum Lesen des Speichers oder des E / A-Speicherplatzes empfängt, muss das Gerät eine Antwort senden. Wenn der Absender der Anfrage innerhalb einer bestimmten Zeit keine Antwort erhält, führt dies zu einem Fehler beim Warten auf eine Antwort. Wenn das Gerät aus irgendeinem Grund die angeforderten Daten nicht senden kann, muss es eine Fehlerantwort generieren. Mögliche Gründe können sein: Der Empfänger unterstützt diese Anforderung nicht (nicht unterstützte Anforderung); Der Empfänger ist nicht bereit, die Konfigurationsanforderung anzunehmen, und fordert sie auf, sie später zu wiederholen (Wiederholungsstatus der Konfigurationsanforderung). Es ist ein interner Fehler aufgetreten, aufgrund dessen der Empfänger nicht antworten und die Anforderung ablehnen kann (Abbruch des Abschlusses).

Formate für eine erfolgreiche Antwort auf eine Leseanforderung und eine Fehlerantwort für eine nicht unterstützte Anforderung sind in den 5, 6 gezeigt.


Abbildung 5 - Beispiel für eine erfolgreiche Antwort auf das Lesen


Abbildung 6 - Beispiel für eine Antwort auf eine nicht unterstützte Anforderung

Während der Endpunkt auf einen Speicherbereich innerhalb von 4 GB zugreift, unterscheidet sich das Format der Paket-Header nicht von den in den Abbildungen 3, 4 gezeigten Headern. Für Schreibanforderungen Wenn Sie einen Speicher von mehr als 4 GB lesen, wird im Header ein zusätzliches Doppelwort mit höherwertigen Bits der Zieladresse verwendet (Abbildung 7).


Abbildung 7 - Ein Beispiel für einen 128-Byte-Schreibanforderungsheader.

Erläuterungen zu abgekürzten Namen von Paketheaderfeldern sind in Tabelle 4 aufgeführt.

Tabelle 4 - Liste der Abkürzungen für Headerfelder
Nr. P.FeldbezeichnungFeldnameGeplanter Termin
1TCVerkehrskategorie - VerkehrsklasseDefiniert die Mitgliedschaft im virtuellen Kanal
2AtrAttribute: , , ID, ID.
3TH‒ TLP Processing Hint, [1..0] .
4TD‒ TLP Digest, .
5EP, .
6AT‒ Address Translation, : , ,
7BE‒ Byte Enable
8PHPaketverarbeitungshinweis - VerarbeitungshinweisGibt dem Paketempfänger Tipps zur Verwendung des Pakets sowie zur Datenstruktur
9BCMDas Vorhandensein einer Änderung in der Anzahl der BytesGibt an, ob sich die Anzahl der Bytes im Paket geändert hat. Nur ein Absender angesichts eines PCI-X-Geräts kann ein Flag setzen

Wenn ein Endpunkt Interrupts verwendet, um ein Ereignis zu melden, muss er auch ein geeignetes Paket bilden. Insgesamt kann PCIe drei Arten von Interrupts verwenden:

  • Legacy-Interrupts (Legacy-Interrupts oder INT);
  • Unterbrechungen in Form von Nachrichten (Message Signaled Interrupts oder MSI);
  • erweiterte Nachrichteninterrupts (Message Signaled Interrupts Extended oder MSI-X).

Geerbte INT-Interrupts werden aus Gründen der Kompatibilität mit Systemen verwendet, die keine Nachrichteninterrupts unterstützen. Tatsächlich ist diese Art von Interrupt eine Nachricht (ein Paket vom Typ Nachricht), die den Betrieb einer physischen Interruptleitung simuliert. Bei einem bestimmten Ereignis sendet der Endpunkt eine Nachricht an das PCIe-Stammverzeichnis, dass der INT-Interrupt aktiviert wurde, und wartet dann auf die Aktion des Interrupt-Handlers. Bis der Interrupt-Handler die angegebene Aktion ausführt, befindet sich der INT-Interrupt im aktivierten Zustand. Bei geerbten Interrupts können Sie die Quelle des Ereignisses nicht bestimmen, wodurch der Interrupt-Handler gezwungen wird, alle Endpunkte im PCIe-Baum nacheinander zu scannen, um diesen Interrupt zu bedienen. Wenn der Interrupt bedient wird, sendet der Endpunkt eine Nachricht, die dies besagtdass der INT-Interrupt inaktiver ist. Die FPGA-Hardwarekerne erzeugen auf ein Signal von der Benutzerlogik unabhängig die erforderlichen Nachrichten für INT-Interrupts, sodass die Paketstruktur nicht berücksichtigt wird.

Nachrichteninterrupts sind zusammen mit ihrer erweiterten Version die Haupt- und obligatorische Art von Interrupt in PCIe. Beide Arten von Interrupts sind in der Tat eine Anforderung, mit einer Länge von einem Doppelwort in den Systemspeicher zu schreiben. Der Unterschied zu einer regulären Anforderung besteht darin, dass die Aufzeichnungsadresse und der Paketinhalt in der Phase der Systemkonfiguration jedem Gerät zugewiesen werden. In diesem Fall wird der lokale Advanced Programmable Interrupt Controller (LAPIC) im Zentralprozessor zum Ziel. Bei Verwendung dieser Art von Interrupt müssen nicht alle Geräte im PCIe-Baum nacheinander abgefragt werden. Wenn das System dem Gerät erlaubt, mehrere Interruptvektoren zu verwenden, kann darüber hinaus jedem Vektor ein eigenes Ereignis zugeordnet werden.Zusammen reduziert dies die Prozessorzeit für die Verarbeitung von Interrupts und erhöht die Gesamtsystemleistung.

MSI-Interrupts ermöglichen die Bildung von bis zu 32 separaten Vektoren. Die genaue Anzahl hängt von den Funktionen des Endpunkts ab. In diesem Fall kann das System die Verwendung nur eines Teils der Vektoren erlauben. In der Konfigurationsphase schreibt das System die Interruptadresse und die Anfangsdaten zum Schreiben in die speziellen Register des Konfigurationsraums des Endpunkts. Alle aktiven Interrupts verwenden dieselbe Adresse. Für jeden Vektor ändert der Endpunkt jedoch die Bits der Anfangsdaten. Lassen Sie beispielsweise einen Endpunkt maximal 4 Interruptvektoren unterstützen, alle 4 Vektoren sind im System zulässig und die Anfangsdaten zum Schreiben sind 0x4970. Um den ersten Vektor zu bilden, übergibt der Endpunkt die Anfangsdaten unverändert. Für den zweiten Vektor ändert das Gerät das erste Bit und sendet die Nummer 0x4971.Für den dritten und vierten Vektor sendet das Gerät die Nummern 0x4972 bzw. 0x4973.

Die FPGA-Hardwarekerne bilden unabhängig voneinander ein Paket mit einem MSI-Interrupt durch ein Signal von der Benutzerlogik. Bevor der Kernel jedoch angewiesen wird, einen Interrupt zu senden, muss die Benutzerlogik auch den Inhalt des Pakets für den erforderlichen Vektor an eine spezielle Kernelschnittstelle senden.

MSI-X-Interrupts ermöglichen die Bildung von bis zu 2048 einzelnen Vektoren. In den entsprechenden Registern des Konfigurationsraums gibt der Endpunkt an, in welchem ​​der BAR-Adressräume und mit welchem ​​Versatz von der Basisadresse sich die Interrupt-Tabelle (Abbildung 8) und die Tabelle der anstehenden Interrupt-Flags (Pending Bit Array - PBA, Abbildung 9) sowie die Größen beider befinden Tabellen. Das System schreibt eine separate Adresse und Daten zum Schreiben in jede Zeile der Interrupt-Tabelle und erlaubt oder verbietet auch die Verwendung eines bestimmten Vektors durch das erste Bit des Vektorsteuerungsfeldes. Für ein bestimmtes Ereignis setzt der Endpunkt ein Flag in der Flag-Tabelle der ausstehenden Interrupts. Wenn für diesen Interrupt im Feld Vector Control keine Maske festgelegt ist, sendet der Endpunkt einen Interrupt an die Adresse aus der Interrupt-Tabelle mit dem angegebenen Inhalt des Pakets.


Abbildung 8 - Tabelle der MSI-X-Interrupt-Vektoren


Abbildung 9 - Tabelle der Flags für ausstehende Interrupts

FPGA-Hardwarekerne verfügen nicht über eine spezielle Schnittstelle für MSI-X-Interrupts. Der Entwickler selbst muss eine Interrupt-Tabelle in der Benutzerlogik und eine Tabelle mit Flags ausstehender Interrupts erstellen. Ein Interrupt-Paket wird auch vollständig vom Benutzer generiert und zusammen mit anderen Pakettypen über die allgemeine Kernel-Schnittstelle übertragen. Das Paketformat entspricht in diesem Fall, wie oben bereits erwähnt, einer Anforderung zum Schreiben in den Systemspeicher mit einer Länge von einem Doppelwort.

Merkmale der Hardwarekerne PCI Express FPGA V-Serie von Intel in der Version Avalon-ST


Trotz der Tatsache, dass die Hardwarekerne von PCI Express-FPGAs verschiedener Hersteller ähnliche Funktionen implementieren, können sich die einzelnen Kernschnittstellen oder die Reihenfolge ihres Betriebs unterscheiden.
PCI Express FPGA-Hardwarekerne der Intel V-Serie sind in zwei Versionen erhältlich: mit Avalon-MM und Avalon-ST. Letzteres ermöglicht es Ihnen, die meiste Bandbreite zu erhalten, obwohl dies vom Entwickler mehr Aufwand erfordert. Aus diesem Grund wird ein Kernel mit einer Avalon-MM-Schnittstelle nicht berücksichtigt.

In der PCI Express-Kerndokumentation mit der Avalon-ST-Schnittstelle werden die Kernelparameter, Eingangs- und Ausgangssignale ausreichend detailliert beschrieben. Der Kernel verfügt jedoch über eine Reihe von Funktionen, auf die ein Entwickler achten sollte.

Die erste Gruppe von Funktionen bezieht sich auf Methoden, mit denen Sie FPGAs innerhalb von 100 ms gemäß den PCIe-Anforderungen konfigurieren können. Zusätzlich zum parallelen Laden des FPP-Typs werden dem Entwickler Methoden wie die Konfiguration über Protokoll (CvP) und den autonomen Modus des Kernels (autonomer Modus) angeboten. Der Entwickler muss sicherstellen, dass die Konfiguration über das Protokoll oder den Standalone-Kernel-Modus für die ausgewählte PCIe-Geschwindigkeit unterstützt wird (Parameter „Lane Rate“). Für die Konfiguration über das Protokoll finden Sie relevante Informationen in der Kerneldokumentation. Im Offline-Modus gibt es keine solchen Informationen, daher müssen Sie das Projekt kompilieren. Wenn der eigenständige Kernelmodus für die aktuelle Kernelgeschwindigkeit nicht unterstützt wird, generiert Quartus einen entsprechenden Fehler (Abbildung 10).


Abbildung 10 - Fehler beim Kompilieren eines PCIe-Kernels für den Offline-Modus

Wenn ein Entwickler die Konfiguration über ein Protokoll verwenden möchte, sollte er auch darauf achten, mit welchem ​​FPGA-Kern der PCIe-Anschluss verbunden ist. Dies gilt insbesondere dann, wenn der Entwickler kein fertiges Board, sondern sein eigenes Gerät verwendet. In FPGAs mit mehreren PCIe-Hardwarekernen kann CvP nur mit einem Kern aktiviert werden. Die Position des Kerns mit CvP-Unterstützung ist in der FPGA-Dokumentation angegeben.
Die zweite Gruppe von Merkmalen betrifft die Avalon-ST-Datenübertragungsschnittstelle selbst. Über diese Schnittstelle werden Pakete auf Transaktionsebene zwischen der Benutzerlogik und dem Kernel übertragen.

Auf der Empfangsseite verfügt der Kernel über zwei Signale, mit denen der Benutzer den Empfang empfangener Pakete unterbrechen kann: das Signal rx_st_mask und das Signal rx_st_ready.
Mit dem Signal rx_st_ready kann der Entwickler die Ausgabe aller Pakettypen anhalten. Wenn Sie dieses Signal jedoch aktivieren, stoppt der Kernel die Ausgabe von Paketen nach nur zwei Taktzyklen der Betriebsfrequenz. Daher muss die Benutzerlogik während der Signalaktivierung bereit sein, eine zusätzliche Datenmenge zu empfangen. Wenn ein Entwickler beispielsweise einen Puffer in Form eines FIFO verwendet, sollte er Pufferüberläufe vermeiden. Andernfalls geht ein Teil des Paketinhalts verloren.

Mit dem Signal "rx_st_mask" setzt der Entwickler die Ausgabe von Anfragen aus, für die Antworten gesendet werden müssen. Dieses Signal stoppt auch nicht sofort die Ausgabe von Paketen. Gemäß der Dokumentation kann der Kernel nach Aktivierung des Signals bis zu 10 Anforderungen ausgeben. Wenn die Benutzerlogik "rx_st_mask" aktiviert und nicht genügend Speicherplatz im Puffer vorhanden ist, um empfangene Pakete zu verarbeiten, kann dies auch das Signal "rx_st_ready" aktivieren. In dieser Situation hört die Benutzerlogik auf, Pakete aus dem internen Hardware-Kernel-Puffer zu lesen. Dies überschreitet nicht nur die Hardware-Kernel-Puffer, sondern verstößt auch gegen die Anforderungen an die Paketreihenfolge. Das Gerät muss Anforderungen, für die keine Antwort erforderlich ist, überspringen und Antworten lesen. Andernfalls wird der Datenkanal dicht blockiert.Aus diesem Grund sollte der Entwickler einen zusätzlichen Puffer verwenden, um Anforderungen mit Antworten zu verarbeiten, und der Logik nicht erlauben, Pakete mit höherer Priorität zu blockieren.

Auf der Sendeseite können die Signale tx_st_valid und tx_st_ready Probleme verursachen. Wenn das Signal tx_st_ready aktiv ist, darf die Benutzerlogik das tx_st_valid in der Mitte des ausgehenden Pakets nicht zurücksetzen. Dies bedeutet, dass der Entwickler während der Übertragung den gesamten Inhalt des Pakets bereitstellen muss. Wenn die Datenquelle langsamer als die Kernelschnittstelle ist, muss die Benutzerlogik vor dem Start des Pakets die erforderliche Datenmenge akkumulieren.
Sowohl auf der Empfangsseite als auch auf der Sendeseite sollte der Entwickler auf die Bytereihenfolge im Header und den Inhalt des Pakets sowie auf die Datenausrichtung achten.

Im Avalon-ST-Paket des Hardwarekerns folgen die Bytes innerhalb jedes Doppelworts im Header des PCIe-Pakets von niedrig nach hoch; im Verpackungsinhalt - vom ältesten zum jüngsten. Der Entwickler muss in ausgehenden Paketen eine ähnliche Reihenfolge verwenden, um Daten erfolgreich vom Endpunkt zum Stamm zu übertragen.

Die Avalon-ST-Schnittstelle des Hardwarekerns richtet die Daten in Vielfachen von 64 Bit aus. Abhängig von der Breite der Avalon-ST-Schnittstelle, der Länge des Paket-Headers auf Transaktionsebene und der Paketadresse kann der Kernel ein leeres Doppelwort zwischen dem Paket-Header und seinem Inhalt hinzufügen. Bei der Datenübertragung muss die Benutzerlogik wiederum analog zum Kernel im Voraus ein leeres Doppelwort hinzufügen. Dieses leere Doppelwort wird in der Paketlänge nicht berücksichtigt und ist nur für den korrekten Betrieb des Hardware-Kernels erforderlich.

Die nächste Funktion bezieht sich auf eingehende Leseantworten. Die Kernelbeschreibung besagt, dass eingehende Antworten, deren Kennung nicht mit der ausgehenden Anforderung übereinstimmt, nicht übersehen werden. Gleichzeitig sollte die Benutzerlogik der Wartezeit für Antworten folgen. Wenn die Wartezeit überschritten wird, muss die Benutzerlogik das Flag "cpl_err [0]" oder "cpl_err [1]" setzen. Aus der Dokumentation geht nicht hervor, wie die Filterung funktioniert, wenn der Endpunkt mehrere Leseanforderungen sendet. Die Benutzerlogik teilt dem Kernel nur mit, dass das Zeitlimit für eine der Anforderungen abgelaufen ist, kann jedoch die Kennung dieser Anforderung nicht an den Kernel übergeben. Es besteht die Möglichkeit, dass der Kernel Antworten für eine Anforderung mit einem abgelaufenen Zeitlimit an die Benutzerseite sendet. Daher muss der Entwickler einen eigenen Filter für eingehende Antworten erstellen.

Schließlich wird Entwicklern dringend empfohlen, die Informationen zu verfügbaren Darlehen für ausgehende Pakete zu verwenden. Die Kerndokumentation besagt, dass dies nicht erforderlich ist, da der Kernel Kredite prüft und Pakete blockiert, wenn nicht genügend Kredite vorhanden sind. Alle Arten von Paketen gelangen jedoch über eine einzige Schnittstelle zum Kernel. Wenn der Kernel-Paketpuffer überläuft, senkt der Kernel das Signal tx_st_ready auf Null. Bis das Signal tx_st_ready auf eins gesetzt ist, kann die Benutzerlogik im Prinzip keine Pakete senden. Die Anzahl der verfügbaren Kredite wird durch Pakete von einem Partnergerät aktualisiert. Wenn die Logik des Benutzers nicht nur häufig schreibt, sondern auch liest, sinkt die Geschwindigkeit, mit der der Kernel die Grenzwertzähler aktualisiert. Am Ende leidet die Gesamtsystemleistung.

Fazit


Der Artikel beschreibt die allgemeinen Prinzipien der Datenübertragung über PCI Express, die Formate der Hauptdatenpakete. Trotzdem hat der Autor Schnittstellenkomponenten wie virtuelle Kanäle weggelassen, die Kontrolle des Volumens der eingehenden Antworten zum Lesen und die Reihenfolge der Pakete ist nicht streng. Diese Themen werden in einer Reihe ausländischer Quellen ausführlich diskutiert [ 4 , 6 ].
Der Artikel enthält auch die Funktionen der FPGA-FPGA-Hardwarekerne der Intel Express V-Serie, auf die der Autor bei der Arbeit am Schnittstellencontroller gestoßen ist. Diese Erfahrung kann für andere Entwickler nützlich sein.

Liste der verwendeten Quellen


  1. Eine PCIe-DMA-Architektur für die Datenübertragung mit mehreren Gigabyte pro Sekunde / L. Rota, M. Caselle, et. al. // IEEE TRANSACTIONS ON NUCLEAR SCIENCE, VOL. 62, NO. 3. Juni 2015.
  2. An Efficient and Flexible Host-FPGA PCIe Communication Library / Jian Gong, Tao Wang, Jiahua Chen et. al. // 2014 24th International Conference on Field Programmable Logic and Applications.
  3. Design and Implementation of a High-Speed Data Acquisition Card Based on PCIe Bus / Li Mu-guo, Huang Ying, Liu Yu-zhi // 《测控技术》2013年第32卷第7期。
  4. Down to the TLP: How PCI express devices talk (Part I) / Eli Billauer
  5. Low-Cost FPGA Solution for PCI Express Implementation / Intel Corporation.
  6. Managing Receive-Buffer Space for Inbound Completions / Xilinx // Virtex-7 FPGA Gen3 Integrated Block for PCI Express v4.3, Appendix B
  7. PCIe Completion Timeout / Altera Forum
  8. PCIe packet in cyclone VI GX / Altera Forum
  9. PCIe simple transaction / Altera Forum
  10. PCIe w/ Avalon ST: Equivalent of ko_cpl_spc_vc0? / Altera Forum
  11. Point me in the right Direction – PCIe / Altera Forum
  12. Zeitüberschreitungen im PCIE / Altera Forum anfordern
  13. Das Hochgeschwindigkeits-Schnittstellendesign basierend auf PCIe der nicht kooperativen Empfängerverifizierungsplattform / Li Xiao-ning, Yao Yuan-cheng und Qin Ming-wei // 2016 Internationale Konferenz für Mechanik, Steuerung, Elektrik, Mechatronik, Information und Computer
  14. PCI Express-Basisspezifikation Revision 3.0 / PCI-SIG
  15. Stratix V Avalon-ST-Schnittstelle für PCIe Solutions / Intel Corporation
  16. Cyclone V Avalon-ST-Schnittstelle für PCIe Solutions / Intel Corporation

All Articles