Heutige FPGAs haben DSP-Blöcke eingebaut, die neuesten FPGAs haben sogar IEEE-754-kompatible Gleitkommaeinheiten eingebaut.
Es ist möglich, eine DSP-Entität / ein DSP-Modul mithilfe einer GUI zu erstellen, nachdem die erforderlichen Parameter darin ausgewählt und dann im Entwurf instanziiert wurden.
Wann müssen wir ein solches Mikromanagment durchführen, um tatsächliche DSP-Blöcke zu instanziieren, und wann geben wir einfach einen '*' - Operator in den Code ein und lassen das Synthesetool die Details auf niedriger Ebene verarbeiten? Welches ist besser?
Es gibt viele verschiedene Arten von Multiplikationsalgorithmen, wenn es um binäre Multiplikation geht. Da wir jetzt DSP-Blöcke auf Silizium und sogar Gleitkomma-Multiplikatoren eingebaut haben, bedeutet dies, dass all diese Algorithmen nicht effektiv veraltet sind.
Antworten:
Ich habe das ein paar Mal selbst gemacht.
Im Allgemeinen wählen die Entwurfswerkzeuge basierend auf den Syntheseeinstellungen zwischen einer Fabric-Implementierung und einem DSP-Slice.
Für Xilinx ISE gibt es beispielsweise in den Einstellungen für den Synthesevorgang HDL-Optionen die Einstellung "-use_dsp48" mit den folgenden Optionen: Auto, AutoMax, Ja, Nein. Wie Sie sich vorstellen können, steuert dies, wie stark die Tools versuchen, sie zu platzieren DSP-Slices. Ich hatte einmal ein Problem, bei dem ich eine Ganzzahl mit 3 multiplizierte, was auf ein DSP-Slice schließen ließ - außer dass ich bereits jedes DSP-Slice im Chip manuell ableitete, sodass der Synth fehlschlug! Ich habe die Einstellung auf Nein geändert, da ich bereits jedes dsp-Slice verwendet habe.
Dies ist wahrscheinlich eine gute Faustregel (ich habe es mir gerade ausgedacht): Wenn Ihr Design mit weniger als 50 MHz getaktet ist und Sie wahrscheinlich weniger als 50% der DSP-Slices im Chip verwenden, verwenden Sie einfach die *, + und - Operatoren. Dadurch werden DSP-Slices ohne Pipeline-Register abgeleitet. Dies begrenzt die Höchstgeschwindigkeit wirklich. (Ich habe keine Ahnung, was passiert, wenn Sie Division verwenden)
Wenn es jedoch so aussieht, als würden Sie die Slices näher an der Höchstgeschwindigkeit des DSP-Slice ausführen (333 MHz für Spartan 6 mit normaler Geschwindigkeitsstufe). Wenn Sie alle Slices verwenden möchten, sollten Sie sie manuell ableiten .
In diesem Fall haben Sie zwei Möglichkeiten.
Option 1: Verwenden Sie die rohe DSP-Instanziierungsvorlage manuell. Option 2: Verwenden Sie einen IP-Block von Xilinx Core Generator. (Ich würde diese Option verwenden. Gleichzeitig lernen Sie alles über das Kerngen, was in Zukunft helfen wird.)
Bevor Sie eine dieser Aktionen ausführen, lesen Sie die ersten Seiten des DSP-Slice-Benutzerhandbuchs. Im Fall des Spartan 6 (DSP48A1) wäre dies Xilinx doc UG389: http://www.xilinx.com/support/documentation/user_guides/ug389.pdf
Betrachten Sie zuerst die Option Core Generator. Normalerweise erstelle ich in Core Generator ein Testprojekt für den Teil, mit dem ich arbeite, in dem ich eine beliebige Anzahl von IP-Blöcken erstelle, um das System zu lernen. Wenn ich dann bereit bin, meinem Entwurf in ISE einen hinzuzufügen, klicke ich mit der rechten Maustaste in die Entwurfshierarchie, klicke auf neue Quelle und wähle "IP (CORE Generator & Architecture Wizard)", damit ich den Block direkt bearbeiten und neu generieren kann von meinem Projekt.
Schauen Sie sich in Core Gen die verschiedenen IP-Blöcke an, aus denen Sie auswählen können - es gibt ein paar Dutzend, von denen die meisten ziemlich cool sind.
Der Multiplikator-Kern ist das, worauf Sie zuerst achten sollten. Überprüfen Sie jede Seite und klicken Sie auf die Schaltfläche Datenblatt. Die wichtigen Teile sind die ganzzahligen Bitbreiten, die Pipeline-Stufen (Latenz) und etwaige Steuersignale. Dies erzeugt den einfachsten Block, indem alle nicht benötigten Ports entfernt werden.
Als ich letztes Jahr einen IIR-Filter mit 5 x 3-Ordnungen erstellte, musste ich die manuelle Instanziierungsvorlage verwenden, da ich eine sehr benutzerdefinierte Implementierung mit 2 DSP-Slices erstellte, die 4x schneller als die Abtastrate getaktet wurden. Es war ein totaler Schmerz.
quelle
Wenn Sie nur zwei Zahlen multiplizieren möchten und diese zum DSP-Block passen,
*
sollte der Bediener auf einen DSP-Block schließen. Wenn nicht, senden Sie das Synthesewerkzeug zurück :)Um die komplexeren Kombinationen der DSP-Funktionalität nutzen zu können, ist jedoch häufig eine direkte Instanziierung des Blocks und die Konfiguration seiner Parameter erforderlich. Beispiele für Dinge, die durch Inferenz möglicherweise nicht gut abgebildet werden können (am Beispiel des Xilinx DSP48E1 ):
Und vor allem Kombinationen der oben genannten.
Die Synthesewerkzeuge sind noch nicht gut genug, um völlig beliebige Kombinationen von Logik und Arithmetik so effizient abzubilden, wie Sie vielleicht hoffen.
quelle
Wenn DSP-Blöcke vorhanden sind, sollten Sie diese verwenden, wenn Sie können, da dies effizienter ist als die Verwendung von LUTs, um dasselbe zu tun. Es sei denn, Sie benötigen keine Hochleistungsmultiplikation. In diesem Fall sollten Sie beispielsweise einen Pipeline-Addierer und ein Schieberegister implementieren, um Platz zu sparen.
Ich würde jedoch versuchen, DSP-Blöcke abzuleiten, bevor ich in die GUI-Tools gehe. Das Xilinx XST-Handbuch enthält HDL-Rezepte zum Instanziieren von DSP-Blöcken mit reinem Verilog / VHDL. Wenn Sie vor und / oder nach den Multiplikatoren genügend Register hinzufügen, verwendet XST grundsätzlich einen DSP-Block, um die Operation automatisch zu implementieren. Sie können in den Syntheseprotokollen überprüfen, ob die DSP-Blöcke korrekt abgeleitet werden. Ich nehme an, Altera hat etwas Ähnliches.
Übrigens habe ich vor ein paar Minuten darüber nachgedacht, da ich derzeit an einer Mersenne-Twister-Implementierung arbeite, die nur einen Multiplikator für den ersten Startwert verwendet. Meine Implementierung im ersten Durchgang entspricht nicht dem Timing, aber die Funktionalität ist korrekt. XST hat die Multiplikationsoperation auch in DSP-Blöcke eingefügt, sie ist jedoch nicht optimiert, sodass sie ungefähr halb so schnell läuft, wie ich es gerne hätte. Ich werde die Multiplikation wahrscheinlich mit einer Shift-and-Add-Technik neu implementieren, die 32-mal so viele Taktzyklen benötigt, aber keinen Hardware-Multiplikator mehr benötigt.
quelle
Es hängt davon ab, wie viel Optimierung Sie benötigen und wie viel tragbar Ihr Design sein sollte. Es ist ein bisschen wie Software, die mit ein wenig Assembler optimiert oder den Compiler die Anweisungen auswählen lässt. Möglicherweise haben Sie auch einige Kompromisse zwischen Größe und Geschwindigkeit, sodass Sie sich keinen kombinatorischen Multiplikator mit doppelter Genauigkeit leisten können.
Ich wusste dort nicht, wo festverdrahtete FP-Multiplikatoren in FPGAs sind.
Ein tatsächlicher IEEE P754-kompatibler Multiplikationsoperator, der für eine CPU geeignet ist, umfasst mehr als einen großen Multiplikator: Sie müssen die Exponenten hinzufügen, Denormale verschieben, Unendlichkeiten verwalten und einige meist nutzlose Flags (ungenau, Unterlauf ...)
quelle
Ich habe dieses Dokument gelesen http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf :
Ich wünschte, ich könnte die Quelle ihrer Werkzeuge finden, um ihre Ergebnisse zu überprüfen.
quelle