VHDL: Verwenden des Operators '*' bei der Implementierung von Multiplikatoren im Design


10

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.


Welches FPGA enthält 754-kompatible FPUs?
Martin Thompson

Antworten:


6

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.


13

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 ):

  • Verwendung des Voraddierers
  • Verwendung des Postakkumulators
  • Verwendung eines Musterdetektors
  • Verwendung der Logikeinheit

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.


4

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.


Warum sollte das Timing bei Verwendung des Hardware-Multiplikators fehlschlagen?
Quantum231

Eine 32-Bit-zu-32-Bit-Multiplikation ohne Pipeline dauert anscheinend mehr als 8 ns.
Alex. Forencich

hmm ich verstehe, habe das nicht berücksichtigt. Die DSP-Blöcke werden also nicht per Pipeline übertragen. Ich frage mich, wie genau sie die Multiplikation umsetzen. Ist es ein wirklich harter Parallelmultiplikator?
Quantum231

Ich denke, es kann so konfiguriert werden, dass es auf verschiedene Arten funktioniert. Laut XST-Handbuch kann XST durch Hinzufügen von genügend Registern am Eingang und am Ausgang einen Pipeline-Multiplikator in einem DSP48-Slice verwenden. In meinem Fall gab es nur ein Ausgangsregister und keine Eingangsregister, so dass es dies nicht nutzen konnte. Da dies nur zur Initialisierung (Einsetzen des PRNG) diente, habe ich die parallele Multiplikation durch einen seriellen Bitmultiplikator ersetzt, um Ressourcen zu sparen.
Alex. Forencich

2

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 ...)


Die FPGAs der neuesten Generation wie die Altera 10-Serie verfügen über IEEE-754-kompatible Gleitkomma-Multiplikatoren auf der Hardware selbst! Ich hatte jedoch keine Gelegenheit, sie selbst zu benutzen.
Quantum231

Wenn wir DSP-Blöcke eingebaut haben, sollte FPGA diese anstelle eines kombinatorischen Multiplikators verwenden oder einen anderen Algorithmus verwenden, der z. B. einen Speicherblock verwendet, oder?
Quantum231

2

Ich habe dieses Dokument gelesen http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf :

Während Funktionen, die in einen einzelnen DSP-Block passen, effizient aus RTL-Pipeline-Code synthetisiert werden können, haben wir festgestellt, dass komplexere Funktionen, die mehrere DSP-Blöcke erfordern, unter einer geringeren Leistung leiden. Eine Standard-RTL-Beschreibung einer mathematischen Funktion kann beispielsweise nach jeder Operation stark pipelined sein. Da dieses Pipelining jedoch möglicherweise nicht die Struktur und die internen Stufen des DSP-Blocks berücksichtigt, kann das resultierende synthetisierte Design eine Leistung aufweisen, die unter dem Standard liegt Die DSP-Blöcke werden so kombiniert, dass sie nicht mit voller Geschwindigkeit ausgeführt werden können.

Ich wünschte, ich könnte die Quelle ihrer Werkzeuge finden, um ihre Ergebnisse zu überprüfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.