LUT vs. Hard-IP-basierte Multiplikatoren auf Spartan-3 FPGA für konstante Koeffizientenmultiplikation

Bevor ich zu meiner Frage komme, hier sind die Spezifikationen für das Board und das Synthesetool, das ich verwende:

  • Familie: Spartan3
  • Gerät: XC3S200
  • Geschwindigkeit: -5
  • Synthesewerkzeug: XST

Mein 4-Bit-Multiplikator befindet sich im kritischen Pfad meines Designs. Ich möchte die Zeit für die Multiplikation reduzieren, damit ich meinen kritischen Pfad reduzieren und meine Taktfrequenz erhöhen kann.

Ich kann CoreGEN verwenden, um LUT-basierte Multiplikatoren, LUT-basierte Multiplikatoren mit konstanten Koeffizienten, harte Multiplikatoren und harte Multiplikatoren mit konstanten Koeffizienten (die meiner Meinung nach nur harte Multiplikatoren mit einem fest verdrahteten Eingang sein könnten) zu instanziieren.

Ich denke, wenn ich 15 LUT-basierte Multiplikatoren mit konstanten Koeffizienten verwende (oder vielleicht 11, kann sich um die Fälle 2,4,8 mit Verschiebung kümmern und 0,1 sind trivial), kann ich diesen kritischen Pfad ein wenig unterbrechen. Meine Designeinschränkungen hindern mich daran, diese Multiplikatoren zu pipenen; Ich brauche sie, um sie einfach in meinen kombinatorischen Logikpfad zu integrieren.

Wäre dies schneller als nur die Verwendung eines harten Multiplikators? Oder wäre ein normaler LUT-basierter Multiplikator schneller als beide Optionen?

Weitere Informationen wären nützlich: Wie schnell müssen Sie sein? Welches Gerät? Welche Geschwindigkeitsklasse? Welcher Synthesizer?
@MartinThompson: Zusätzliche Informationen hinzugefügt.
Ich glaube nicht, dass das Multiplexen der Ausgabe von 15 separaten Multiplikatoren mit konstanten Koeffizienten jemals eine einzelne harte DSP-Scheibe übertreffen wird, vorausgesetzt, Sie möchten einen kombinatorischen Pfad. Wir könnten dies besser dimensionieren, wenn Sie eine Taktzielrate angeben.

Antworten (3)

Laut Datenblatt braucht der harte Multiplikator im kombinatorischen Modus zwischen 4 und 5 ns, um sich von den Eingängen zu den Ausgängen auszubreiten. Sie verlieren ein paar weitere 100 PS, wenn Sie zum und vom Multiplikator zum Rest Ihrer Logik gelangen. Wenn das schnell genug ist, dann nutze es einfach.

Wenn nicht, bauen Sie Ihren LUT-basierten Multiplikator, indem Sie einfach Code mit dem *Operator schreiben, ihn synthetisieren, platzieren und routen und sehen, ob das schnell genug ist. Möglicherweise benötigen Sie ein Attribut, um zu erzwingen, dass die harten Multiplikatoren nicht verwendet werden (siehe das MULT_STYLEAttribut im XST-Handbuch). Sie könnten sogar versuchen, nur einen einzelnen LUT-basierten (nicht konstanten) Multiplikator mit dieser Einschränkung zu erzwingen und zu sehen, was das Ergebnis ist - das ist ein sehr schneller Test.

Nur wenn diese versagen, sollten Sie den Weg einschlagen, eine LUT-basierte Struktur von Hand zu erstellen – und selbst dann nur, wenn Sie sich die Ausgabe des Synthesizers angesehen haben und ziemlich sicher sind, dass Sie ihn aus irgendeinem Grund schlagen können. Die Synthesizer wurden meiner Erfahrung nach so eingestellt, dass sie Multiplikatoren mit konstanten Koeffizienten sehr gut ausarbeiten - ich bezweifle, dass Coregen viel gewinnen wird.


Schätzung für nasse Finger: Eine LUT-Verzögerung beträgt ~0,7 ns. Unter der Annahme, dass die Routing-Verzögerungen ähnlich groß sind, können Sie sich eine Kette von nur 3-4 LUTs in der Verzögerung des harten Multiplikators leisten. Es erscheint mir unwahrscheinlich, dass Sie in dieser Tiefe der Logik erreichen werden, was Sie brauchen.

Mein Problem ist im Moment nicht "schnell genug". Ich fahre so schnell wie möglich . Ich habe jedoch nicht in Erwägung gezogen, eine LUT-basierte Struktur von Hand zu erstellen. CoreGEN kann verwendet werden, um explizit einen Multiplikator aus Hard-IP oder aus LUTs zu bauen. Standardmäßig instanziiert XST (oder ein anderes Tool in der ISE-Kette) einen harten Multiplikator, wenn es auf den *in meinem Code trifft. Ich dachte jedoch, dass das LUT-basierte Multiplikatorschema mit konstanten Koeffizienten eine geringere Latenz haben könnte.

Der schnellste Multiplikator, den Sie verwenden können, ist einer, der die Anzahl der Operationen in so wenigen Taktzyklen wie möglich ausführt.

Typischerweise wäre dies ein Taktzyklus.

Um dies zu erreichen, müssen Sie im Allgemeinen mehr Logikzellen verwenden. Der Kompromiss besteht in diesem Beispiel zwischen Platz und Geschwindigkeit.

Sie haben keinen Platzbedarf angegeben, verwenden Sie also einen beliebigen Multiplikator, der das Ergebnis in einem Taktzyklus erzielt.

Da ich mir die beiden verschiedenen Multiplikatoren nicht angesehen habe, kann ich Ihnen nicht sagen, welcher für Ihre Anwendung besser geeignet ist.

Wenn Sie sich nicht sicher sind, was schneller ist, dann schreiben Sie einen Prüfstand mit den beiden parallel und sehen Sie, wie viele Taktzyklen jeder von ihnen benötigt.

Wenn Sie möchten, dass harte DSP-Multiplikatoren auch nur annähernd mit ihrer vollen Geschwindigkeit arbeiten (maximieren Sie fMax), müssen Sie normalerweise Ein- und Ausgangsregister verwenden, die sich im DSP-Slice befinden. Dies bedeutet, dass Sie an beiden Enden Ihrer Operation in RTL ein Überschussregister hinzufügen und sicherstellen, dass die Synthese keine Bits eliminiert (indem Konstanten durch sie weitergegeben werden) oder sie zurück in die Treiberlogik schiebt (sagen wir, der vorgeschaltete RAM-Block erhält Ausgangslatches eingeschaltet). Dadurch kann das Mapping die freie Reg in den DSP-Slice absorbieren und dem Multiplikator den vollen Zyklus geben, wodurch Signalroutingzeiten eliminiert werden.

Diese Art der Optimierung ist normalerweise erforderlich, wenn Sie versuchen, fMax auf den Datenblättern auf das Maximum zu bringen. In diesem Fall müssen Sie die Synthese-/DSP-Anleitung genau befolgen und die Instanziierungsvorlagen verwenden. Hoffentlich verwenden sie den *Operator im Inneren, damit die Simulation kein Problem darstellt. Beobachten Sie die Handhabung des asynchronen Reset-Signals der Pipeline/In/Out-Regs, da diese in DSP-Slice-Regs nicht so vielseitig sind wie allgemeine Slices und Ihren Versuch vereiteln können, was dazu führt, dass ein sinnloses externes Reg verwendet wird und die Multiplikatoreingänge umgangen werden. Wenn Sie sich das Technologieschema Ihres Designs ansehen, können Sie sehen, was Sie bekommen haben.

Allgemeiner gesagt ist es nicht klar, warum das Pipelining des Designs keine Option für Sie ist. Normalerweise würden Sie den Rest Ihrer Signalpfade neu synchronisieren, um dem Pipelining zu entsprechen, das Sie in DSP aufgenommen haben. Das Pipeline-Design erzeugt immer noch ein Ergebnis pro Zyklus, und Ihr fMAX wird höher sein, da die Logik auf dem kritischen Pfad reduziert und der Durchsatz erhöht wird.