Verwenden von Register-Retiming zur Pipeline eines Moduls

Aus meiner Lektüre verstehe ich, dass moderne Synthesewerkzeuge in der Lage sind, ein Register-Retiming durchzuführen, bei dem Register zwischen kombinatorischer Logik verschoben werden, um Timing-Einschränkungen zu erfüllen.

So würden Sie beispielsweise in Ihrem HDL beschreiben comb -> reg1 -> reg2 -> reg3und die Tools würden diese Register verschieben, um sie zu erhalten comb1 -> reg1 -> comb2 -> reg2 -> comb3 -> reg3.

Wann würde man die Logik manuell leiten, anstatt sich auf das Retiming der Register zu verlassen?

Antworten (3)

Nun, es gibt mindestens zwei Szenarien, in denen ich mich für manuelles Retiming entscheiden würde:

  1. Wo ich weiß, dass es eine bestimmte optimale Geometrie gibt, zum Beispiel einen Logikbaum, und ich möchte nicht, dass der Synthesizer dies alleine tut, da er eine suboptimale Wahl treffen könnte.

  2. Die Laufzeiten der Synthese können lang sein. Ich ziehe es vielleicht vor, diese Entscheidungen allein zu treffen, anstatt sie dem Tool zu überlassen, wo ich möglicherweise überprüfen muss, was es getan hat, und möglicherweise die Synthese erneut ausführen muss.

Dies sind beide gute Punkte, ich nehme an, dass Entscheidungen zur Neutaktung von Registern NP-vollständig sind und daher die Algorithmen nicht versuchen, eine optimale Lösung, sondern eine gute Lösung zu finden.

Für RTL-Module, die hauptsächlich Steuerlogik sind (z. B. DMA-Controller), ist die manuelle Registerimplementierung die beste Wahl. Für RTL-Module, die hauptsächlich Datenpfadlogik sind (z. B. Filter), ist Synth-Tool-Reg-Retiming die beste Wahl.

Für beide liegt der Grund meiner Erfahrung nach in weniger Fehlern und einer einfachen Fehlersuche. Das Bestimmen der Fehlerursache in einer HDL-Simulation einer Datenpfadlogik, die für Reg-Retiming (kein Regs-Mittelfilter) implementiert ist, ist viel einfacher, wenn das Ergebnis der kombinatorischen Berechnungs-/Algorithmus-Logik keine Regs zwischen Eingang und Ausgang hat. Für die Steuerlogik, die weitgehend von Zyklus-zu-Zyklus-Aktualisierungen von Variablen (regs) abhängig ist, gilt das Gegenteil.

Pipelining wird normalerweise durchgeführt, um den kritischen Pfad (Pfad mit der längsten Verzögerung und der die maximale Betriebsfrequenz bestimmt) der Schaltung zu reduzieren und auch den Durchsatz des Designs zu erhöhen.

Beim Entwerfen der RTL müssen wir also eine ungefähre, wenn nicht sogar genaue Vorstellung davon haben, welche Pfade der Schaltung längere Verzögerungen benötigen. Basierend darauf platzieren wir einige Register oder einige andere Speicherelemente an geeigneten Stellen (innerhalb des kombinatorischen Teils), um diesen kritischen Pfad zu reduzieren. Während der Synthese optimiert das Tool die Positionen der Register basierend auf den tatsächlichen Verzögerungswerten der Gatter, ohne die Funktionalität der Schaltung zu stören.

Die Anzahl der Register, die Sie platzieren, bestimmt die Anzahl der Pipeline-Stufen in Ihrer Schaltung. Entscheiden Sie sich also zunächst für eine bestimmte Anzahl von Stufen und synthetisieren Sie sie, um zu überprüfen, ob das Design die Spezifikationen erfüllt hat. Wenn das Design das Timing nicht erfüllt hat und Sie möchten eine schnellere Schaltung unabhängig von Leistungs- und Flächenverbrauch erhöht dann die Anzahl der Pipelinestufen.

Dies beantwortet, warum ich Register hinzufügen würde. In meinem Beispiel haben sich drei Stufen als ausreichend herausgestellt. Aber warum sollte ich die komniatorische Logik gegen die Verwendung von Register-Retiming aufteilen, um das Endziel zu erreichen?