Von C zu Silicon: Wie implementiere ich Software- / Firmware-Lösungen als Hardware?

13

Angesichts dieser Frage habe ich mich gefragt, ob es einen ziemlich Standardprozess gibt, um eine Softwarelösung in eine Hardwareimplementierung umzuwandeln. Verzeihen Sie mir und meiner Vorstellungskraft, aber würde es einen Compiler geben, der ein C-Programm aufnehmen und es anhand eines Schaltplans von Transistoren, Widerständen usw. oder vielleicht sogar bekannter Leiterplatten kompilieren könnte?

Mir ist klar, dass ich dieses Szenario aus der falschen Perspektive betrachten könnte. Historisch gesehen haben Sie aus eigener Erfahrung in der Regel eine Hardware, die jemand als Softwarelösung implementiert hat (denken Sie an Hardware-Emulation). Gibt es dieses umgekehrte Konzept überhaupt? Wie machen es diese größeren Unternehmen, wie z. B. Software- oder Hardware-IP-Routing?

Chad Harrison
quelle
Siehe auch "Warum kann ich mein C-Programm mit Singlethread nicht automatisch multithreading machen?"
pjc50
@ pjc50: Wo kann ich sehen, warum ich mein C-Programm mit Singlethread nicht automatisch multithreading machen kann? ?
Davidcary
Ich habe kein konkretes Beispiel im Sinn, aber es ist eine Frage, die ich schon einmal von Leuten gestellt bekommen habe. Es hängt auch damit zusammen, dass die Hardware von Natur aus parallel ist, während die Software in Bezug auf die Art und Weise, wie die Leute darüber nachdenken und Programme schreiben, "natürlich" sequentiell ist.
PJC50

Antworten:

11

Nein, es gibt keine Standardlösung, um Software in Hardware umzuwandeln. Im Allgemeinen kann Software, die nicht mit Blick auf eine Hardwareimplementierung geschrieben wurde, nicht ohne große Verschwendung und Ineffizienzen einfach in Hardware umgewandelt werden. Normalerweise ist es das Beste, einen Chip mit einer CPU und einem ROM zu erstellen und die Software in den ROM zu legen.

Im Laufe der Jahre gab es Compiler, die C-ähnlichen Code in Hardware kompilierten - ähnlich wie VHDL oder Verilog in Hardware kompiliert werden können. Das Entscheidende ist jedoch, dass es "C-like" und nicht C ist. Sie können beispielsweise kein C / C ++ - Programm nehmen, das PI berechnet und magisch in Hardware umwandelt, die PI berechnet. Die meisten dieser C-Line-Sprachen sind verschwunden oder werden in keiner Nummer mehr verwendet. Eine der beliebtesten Versionen davon ist SystemC , aber es ist wichtig zu beachten, dass es nicht C / C ++ ist und nicht nützlich für generische "Lasst uns Software schreiben und dann in Hardware kompilieren". Sie müssen noch "Hardware schreiben, die möglicherweise auch in Software kompiliert wird".

Switches und Router verfügen in der Regel über Hardware, die die meisten häufig verwendeten und geschwindigkeitskritischen Routerfunktionen (Nachschlagen von Inhalten in Routingtabellen, Verwalten von Warteschlangen usw.) in Hardware ausführt, und verwenden dann eine CPU, um alle nicht so häufig verwendeten Funktionen auszuführen (Behandlung von Ausnahmen, Fehlern, Routing-Tabellenaktualisierungen usw.). In vielerlei Hinsicht ähnelt dies der Arbeitsweise moderner CPUs, bei denen die häufigsten Operationscodes in Hardware ausgeführt werden und gelegentlich einige Operationscodes tatsächlich in Software implementiert werden (z. B. Gleitkommaanweisungen, wenn keine FPU vorhanden ist).


quelle
SystemC ist nicht nur aktuelles C ++, sondern lediglich eine C ++ - Bibliothek. Sie können mit SystemC jeden gewöhnlichen C ++ - Code verwenden, den Sie mögen. Das heißt, SystemC hat nicht viel damit zu tun, Hardware automatisch zu generieren. Es ist mehr darauf ausgerichtet, Systeme zu simulieren, Architekturentscheidungen zu treffen und Softwareteams den Einstieg zu ermöglichen, bevor Hardware verfügbar ist.
Theran
Dies hilft mir wirklich zu verstehen, warum es bestimmte Hardware gibt, die bestimmte Aufgaben ausführen.
Chad Harrison
Es gibt viele andere C to HDL- Compiler, die für diesen Zweck entwickelt wurden.
Anderson Green
5

Das nächstgelegene wäre der C2H-Compiler (C-to-Hardware) von Altera . Es kann einiges von dem tun, was Sie vorschlagen. Aber es gibt trotzig Vorbehalte. Sie können nicht einfach einen beliebigen C-Code in Hardware umwandeln und möchten dies auch nicht. Bestimmte Funktionen funktionieren jedoch recht gut, und Sie können eine dramatische Leistungssteigerung feststellen.

Normalerweise implementieren Sie einen NIOS II-Softcore-Prozessor in ein Altera-FPGA. Sie würden dann einen ANSI-C-Code dafür schreiben, wie Sie es bei jedem anderen Prozessor tun würden. Sagen wir dann, eine der C-Funktionen, die Sie geschrieben haben, beinhaltet eine schwere Rechenaufgabe, die von einer parallelen Ausführung in Bezug auf die Leistung profitieren würde. Sie rufen den C2H-Compiler auf, sagen "Implement in Hardware", und er verwandelt diese Funktion im Wesentlichen in ein Peripheriegerät des NIOS II-Softcore-Prozessors.

Hier ist ein Beispiel für das Codieren einer Mandelbrot-Berechnung in ANSI C und das anschließende Implementieren in Hardware:

Der vom C2H-Compiler beschleunigte Mandelbrot-Algorithmus führt zu einer mindestens 60-fachen Geschwindigkeitsverbesserung im Vergleich zu demselben Algorithmus, der auf dem schnellsten Nios II-Prozessor mit Compileroptimierungsstufe 2 (-O2) ausgeführt wird. Diese Geschwindigkeitssteigerung ist auf die Parallelität und die hohen Iterationsgeschwindigkeiten zurückzuführen, die die Hardware bereitstellen kann und die von einer Universalverarbeitungseinheit nicht möglich sind.

Zurück zu Ihrem Beispiel: Auf dem NIOS II-Prozessor kann Linux ausgeführt werden. Bestimmte Funktionen, die zum Ausführen von Routing-Aufgaben erforderlich wären, könnten von der Hardwarebeschleunigung profitieren. Höchstwahrscheinlich ist die Leistung besser als bei einem reinen Software-Router. Es wird sich jedoch niemals der Leistung speziell entwickelter dedizierter ASICs annähern.

embedded.kyle
quelle
1
Xilinx verfügt über ein vergleichbares Tool namens Vivado HLS (High-Level-Synthese), das früher als AutoESL bekannt war. Ähnliche Vorsichtsmaßnahmen gelten: Die Konvertierung von Code in RTL ist gut, wenn es sich um eine Art Code handelt, der sich leicht automatisch in RTL konvertieren lässt.
Theran
@Theran Ich wusste nicht, dass Xilinx ein konkurrierendes Produkt hat. Ich muss das überprüfen. Vielen Dank!
embedded.kyle
2

Sie erwähnen "C to Silicon" in Ihrem Titel und erwähnen Board-Level-Produkte im Körper. Ich werde mich nur auf den Teil dieser Gleichung konzentrieren, der existiert -> "C to Silicon" -Designflüsse. C an sich eignet sich nicht für die Beschreibung von Hardware, da es an grundlegender Unterstützung für die inhärente Parallelität von Hardware, die Notwendigkeit, Rennbedingungen und andere Probleme zu vermeiden, mangelt und es nicht besonders aussagekräftig ist, diese Konzepte darstellen zu können. Oder nicht annähernd so viel wie Verilog und VHDL.

C-Code, der synthetisierbar ist (dh zu einer Hardwarebeschreibung gerendert werden kann) und hier Hardware = digitale Logik, würde keine von Softwareentwicklern beurteilten Codierungswettbewerbe gewinnen.

Hier ist eine Liste einiger namhafter Anbieter, die C -> Silicon-Tools für die ASIC-Flow-Crowd anbieten.

  • Forte-Synthesizer

  • Mentor-Katapult

  • BlueSpec C

  • Synopsys Synphony (ex-Synfora)

  • Trittfrequenz C-zu-Silizium

Platzhalter
quelle
1

Das Umwandeln von Software in Hardware ist keine ganz einfache Aufgabe, wenn Sie eine angemessene Hardware erwarten. Hardware benötigt in der Regel mehr Architektur, um die Ressourcennutzung in Bezug auf Fläche / Kosten sorgfältig zu verwalten. Allerdings gibt es eine Reihe von Tools, die C in irgendeiner Form verwenden, um hardwarespezifische Informationen hinzuzufügen (z. B. was ist die Hardwareschnittstelle?) Und optimierte Hardware zu generieren. Erfahrene Benutzer erzielen bessere Ergebnisse in kürzerer Zeit als handcodiertes RTL.

Brett Cline
quelle