Reverse Engineering der Programmiersequenz des Herstellers eines FPGA

So sehr IP dazu neigt, die Dinge einfacher zu machen, würde ich gerne mehr über Protokolle und Schnittstellen lernen, indem ich alles selbst mache (ich verstehe die Schwierigkeit der Aufgabe, und ich habe Ressourcen, die mir helfen, wie in Professoren und Büchern). Soweit ich weiß, ist es jedoch nahezu unmöglich (ohne Reverse Engineering), Hardwarefunktionen auf einem FPGA ohne IP zu verwenden. Ich habe online herumgestöbert und so gut wie nichts zu diesem Thema gefunden, da die Leute anscheinend selbstzufrieden mit der Verwendung von IP sind. Im Wesentlichen versuche ich, mehr Open-Source-HDL-Ressourcen zu finden, da es im Moment daran mangelt.

Bearbeiten: Um es kurz zu machen, ist es möglich, die IP des Herstellers zu umgehen, um fpgas zu programmieren?

Hast du eine Frage?
Entschuldigung, ich habe vielleicht vergessen, in meinem Geschwafel explizit nach einer zu fragen, oder sie aus Versehen gelöscht. Ich werde es bearbeiten und unten hinzufügen
Anscheinend wäre es unmöglich, die auf den FPGAs vorhandenen harten und halbharten (festen) IPs zu verwenden.
Es ist unklar, was OP fragt. Eine Sache ist "wie man FPGA programmiert" im Sinne von "wie man Verbindungsinformationen einfügt", eine andere Sache ist, wie man Hardware-Primitive als Ser-Des und Block-RAMs verwendet, und dritte Sache ist, ob man ihre eigenen groß machen kann Makroblöcke wie PCIe oder USB SIE.
Ich entschuldige mich dafür, dass ich es nicht aufgeklärt habe. In Ihrer Liste schaue ich mir eher den zweiten und dritten Punkt an.
Für das zweite Element sollten alle Hardware-Grundelemente eine ausreichende Beschreibung haben, und es ist möglich, sie "von Hand" zu konfigurieren und nicht die vom Anbieter bereitgestellte "Konfigurations-IP" zu verwenden. Vor nicht allzu langer Zeit wurden alle Hardwareblöcke ohne moderne Konfigurations-Applets konfiguriert. Zum dritten Punkt siehe meine Antwort unten.
@laptop2d, gemäß der obigen Klarstellung spiegelt die neue Titelbearbeitung nicht die eigentliche Frage von OP wider. Er interessiert sich nicht für bitweise Konfiguration.
Dann bearbeiten Sie es, Sie haben die Macht!

Antworten (5)

Es kann ein Missverständnis darüber geben, was „IP“ bedeutet.

Es ist möglich, die Struktur eines FPGAs, also die programmierbaren LUTs und so weiter, von Grund auf zu programmieren. Die Bits und Gatter und Tabellen in einem Xilinx und einem Altera sind jedoch unterschiedlich und unterscheiden sich von Familie zu Familie, also ist es wie die Assembler-Codierung eines Mikros, sie alle haben einen unterschiedlichen Maschinencode auf niedriger Ebene. Ich glaube nicht, dass das irgendjemand tut, zumindest nicht kommerziell.

Es ist im Allgemeinen einfacher, VHDL zu verwenden und UND- und ODER- und Vektor-ADD-Zuweisungen zu schreiben und den Mapper dies in LUT-Einträge umwandeln zu lassen. Ich würde das nicht 'IP' nennen, ich würde diese Zusammenstellung nennen. Wenn Ihre VDHL, die NAND-Gatter und Latches impliziert, auf einen Altera-Compiler oder einen Xilinx-Compiler trifft, werden die LUT-Tabellen anders programmiert, da die Struktur unterschiedlich ist, aber die Low-Level-Funktion, die Sie in der VHDL beschrieben haben, wird gleich implementiert .

Wenn Sie die spezifische Hardware von Xilinx und Altera verwenden möchten, wie z. B. die Dual-Port-RAMs oder den 48x24-Multiplikator-Akkumulator, müssen Sie herstellerspezifische Primitive verwenden. Sie haben jedoch die volle Kontrolle darüber, wie Sie sich mit ihnen verbinden. Ich würde diese IP immer noch nicht anrufen.

Wenn Sie eine gepackte FFT, einen Downsampling-FIR-Filter oder einen Viterbi-Decoder oder den eingebetteten ARM verwenden möchten, der vom Anbieter für seine Architektur bereitgestellt oder lizenziert wird, unabhängig davon, ob es sich um eine kostenlose (mit den Tools) oder eine kostenpflichtige Lizenz handelt, das ist IP.

Nitpick: Einige Synthesewerkzeuge können auf bestimmte Grundelemente schließen. Beispielsweise versuchen Xilinx-Tools, wenn möglich, Block-RAMs abzuleiten.
@duskwuff, wie Neil zu Recht qualifiziert hat, ist ein RAM-Block nicht wirklich eine IP. Es unterscheidet sich technisch nicht wesentlich von einem D-Flop. Es ist lediglich eine Zuordnung von HDL zu verfügbaren Hardware-Primitiven. Alle modernen Tools erkennen Standard-HDL-Konstruktionen und bilden sie optimal auf verfügbare Hardware ab. Sie können in Verilog explizit ein klassisches D-Flop aus NAND-Gattern bauen und es wird auf allgemeine LUTs abgebildet, aber was wäre der Sinn?
Ich glaube nicht, dass das Format der Konfigurationsdateien und das Bit-Mapping für die Konfiguration des FPGA-Interconnect-Martix jemals der Öffentlichkeit bekannt gegeben wurden, daher ist die Aussage über die Möglichkeit, die Konfiguration selbst vorzunehmen, sehr, sehr gering.
@AliChen: Ich habe mehrere Artikel gelesen, in denen die Forschungsgruppe nicht standardmäßige Dinge mit FPGA gemacht hat, die ich bis heute nicht mit von Anbietern bereitgestellten Tools machen kann. Eine, an die ich mich erinnere, war die spontane Neukonfiguration eines FPGAs, sodass ein einzelnes FPGA auf der Platine wie 4 oder mehr FPGAs funktioniert (Schaltungen ausführen, die nicht auf den Chip passen). Ein anderer war einer, der einen evolutionären Algorithmus implementierte, sodass das System die Schaltung während des Trainings im Handumdrehen neu schreibt. Zumindest einige Leute haben es getan, aber wenn ich raten müsste, würde ich sagen, dass sie Geheimhaltungsvereinbarungen für die notwendigen Informationen unterzeichnet hätten
@slebetman Das erste, was Sie erwähnt haben, ist die dynamische Rekonfiguration, die von Xilinx-Tools unterstützt wird. Zweitens arbeitete ich mit viel älteren Xilinx-FPGAs (XC6216), die ein dokumentiertes Bitstream-Format hatten.

Es ist sicherlich möglich, FPGAs zu programmieren (mit und HDL) und nützliche Aufgaben auf FPGAs auszuführen, ohne IP-Blöcke von Drittanbietern zu verwenden - wenn Sie das gemeint haben. Sie müssen jedoch weiterhin die Synthesetools der Anbieter verwenden.

Synchrone Zustandsmaschinen usw., die in entsprechend strukturiertem VHDL geschrieben sind, lassen sich leicht auf den LUTs und Flip-Flops und Multiplexern in einer FPGA-Zelle synthetisieren, und Sie können diese Designs mithilfe einer Beschränkungsdatei (die in einem proprietären Format vorliegen wird) mit den IO-Pins verbinden.

Die Synthesewerkzeuge werden bestimmte Idiome in VHDL erkennen und automatisch auf andere Ressourcen auf dem Chip abbilden, z. B. unter Verwendung von globalen Taktsignalen, wo angemessen, und sogar ein arithmetisches Konstrukt in Pipeline-Struktur auf einen DSP abbilden, wo es angemessen ist.

Andererseits gibt es einige Ressourcen auf dem Chip, für die Sie vom Hersteller bereitgestellte Makros verwenden müssen, damit die Synthesewerkzeuge auf Hardware abgebildet werden können. Ein Beispiel ist die Verwendung einer PLL zum Erzeugen von Takten unterschiedlicher Phasen.

Es sind Synthesetools von Drittanbietern verfügbar. Die Implementierung hingegen muss die Tools des Anbieters verwenden (es sei denn, es handelt sich um Gittereis40 clifford.at/icestorm )

Natürlich können Sie jedes Schnittstellenprotokoll selbst implementieren. Wie, glauben Sie, wurden diese IPs überhaupt entwickelt?

Alles, was Sie brauchen, ist, bestimmte Spezifikationen sorgfältig zu studieren und alle Zustandsmaschinen gemäß der Dokumentation zu implementieren. Dann müssen Sie alle Ihre HDL-Konstruktionen mit Prüfständen verifizieren, die alle Eckfälle abdecken. Dann müssen Sie Ihre Logik so platzieren und routen, dass sie das erforderliche Timing für die erforderlichen Takte erfüllt. Der Anbieter von FPGA stellt automatische Tools für diese Aufgabe bereit, aber sehr häufig kann die Platzierung von Logikblöcken schwierig sein, um ein zufriedenstellendes Timing zu erreichen, und es kann eine große Raffinesse erforderlich sein, um die richtigen Timing-Einschränkungen für das Tool zu formulieren.

Sie müssen auch eine externe Umgebung entwerfen, um Ihre Schnittstelle unter realistischen Bedingungen zu betreiben, entweder virtuell (wiederum System-/Busmodelle) oder eine physische Betriebsumgebung haben, um die Funktionalität Ihrer Schnittstelle zu validieren.

Natürlich können Sie das alles alleine machen, und Sie werden nur ein paar Jahre brauchen, um all diese Aufgaben für jede moderne paketserialisierte Schnittstelle zu erledigen. Oder Sie können die Früchte der Arbeit mehrerer Jahre erfahrener Ingenieure nutzen, die dieses Design bereits durchgeführt und ihre Arbeit in eine Form von konfigurierbarem IP verpackt haben. Sie benötigen nur ein paar Wochen, um die externe Funktionsweise zu verstehen und das IP in Ihr Design einzubetten. Aber die IP kostet dich. Es ist jetzt Ihre Wahl.

Für Bemühungen auf dem Weg der Selbstgestaltung können Sie mit OpenCores.org beginnen .

Kommt drauf an welche Art von IP du meinst. Manches IP ist Soft-IP und unterscheidet sich nicht wirklich von einem Design in HDL, da es auf den LUTs auf dem FPGA lebt. Dieses Zeug können Sie selbst implementieren, aber es kann sehr komplex sein. Hard-IP hingegen existiert als dediziertes Silizium außerhalb der FPGA-LUTs. Üblicherweise handelt es sich dabei um Mischsignalkomponenten, wie beispielsweise in einer PLL oder einem Hochgeschwindigkeits-Serialisierer oder -Deserialisierer. Manchmal ist harte IP rein digital, wie im Fall eines harten CPU-Kerns, einer PCIe-Schnittstelle oder eines Ethernet-MAC. Wenn die harte IP gemischte Signalkomponenten enthält, ist es unmöglich, sie allein durch HDL zu ersetzen. Wenn der Kern rein digital ist, kann er komplexer sein, als er ersetzt werden könnte.

Jetzt gibt es gängige FPGA-Primitive wie Multiplikatoren, LUTs und Block-RAM, die tatsächlich mit ein bisschen reinem hdl abgeleitet werden können, anstatt eine explizite Instanziierung zu erfordern. Für Dinge wie Block-RAM und DSP-Slices kann dies ein sehr vernünftiger Ansatz sein.

Wenn Sie so etwas wie einen FIFO machen wollen, dann ja, Sie können Ihren eigenen rollen.

Wenn Sie nun bestimmte Hardware-Grundelemente wie BRAM, Multiplikatoren, PLLs usw. verwenden möchten, müssen Sie die vom Hersteller bereitgestellten Tools, Bibliotheken, IP und Schnittstellen verwenden.

Das hatte ich vermutet. Wirklich schade
Warum ist das eine Schande? Sie wollten diese selbst umsetzen – weiter so. Achten Sie nur darauf, kein FPGA mit den proprietären Hard-IPs zu kaufen
Fairer Punkt, obwohl es cool wäre, sich trotzdem damit zu verbinden. Da ich aus einem Mikrocontroller-Hintergrund komme, bin ich es gewohnt, nahezu die vollständige Kontrolle über das zu haben, was gegeben ist, aber Ihr Standpunkt ist vollständig gültig.
Ich glaube, Sie haben missverstanden, was die Primitive sind - sie sind wie Mikrocontroller-Peripheriegeräte. Sie sind ein Abschnitt der Hardware, der diese Funktion ausführt und mit dem Rest verdrahtet werden kann. Aber sie werden normalerweise nicht "IP" genannt, das sind größere Codeabschnitte, die Aufgaben auf hoher Ebene ausführen.
(Im Allgemeinen ist es unmöglich, ein FPGA ohne die Toolchain des Herstellers zu verwenden ! Die einzige Ausnahme ist das Lattice-Semi-Gerät, das rückentwickelt wurde.)
@pjc50, ich würde sagen, Primitive sind dem eingebauten Flash/Register/fpu/alu/etc ähnlicher. auf einem Mikrocontroller, wo sie die Grundbausteine ​​des Geräts sind. Die Peripheriegeräte wären eher analog zu harten IP-Kernen wie PCIe/Transceivern. Und genau wie Sie keinen direkten Zugriff auf die Daten-Pins von USB auf einem uC haben, haben Sie keinen direkten Zugriff auf Multi-Gigabit-Transceiver-Pins auf einem FPGA