Dies ist eine einfache Frage mit einer sehr komplexen Antwort.
Zunächst einige Hintergrundinformationen.
Das reale VLSI-Design ist ein äußerst technisches Feld, in dem sich die Kompromisse ständig ändern. Die Zeit, die eine Schaltung benötigt, um eine Antwort zu berechnen, ist selten der einzige wichtige Faktor. Es gibt auch Stromverbrauch und physischen Bereich sowie eine Reihe von Faktoren, die zeigen, dass die von Ihnen entworfenen Schaltkreise tatsächlich analog sind (z. B. Drahtwiderstand, parasitäre Kapazität). All dies ist in einer realen Schaltung wichtig und kann sich auf das gewählte Design auswirken.
Zweitens müssen Sie den gesamten Lebenszyklus eines Projekts berücksichtigen. Ein Addierer, der für eine VLSI-Realisierung geeignet ist, ist möglicherweise nicht für eine FPGA-Realisierung geeignet. Wenn das Design eine Phase durchläuft, die auf einem FPGA getestet wird, erhalten Sie das Bild.
Drittens wird nicht jeder Addierer gleich gemacht. Auf einer typischen CPU hängen viele Addierer herum, die unterschiedliche Aufgaben ausführen. Es gibt wahrscheinlich mehrere ganzzahlige ALUs, einen Gleitkomma-Mantissen-Addierer, einen Addierer, der die Adressberechnung durchführt, einen Addierer, der Verzweigungsziele berechnet, und so weiter. Das gilt nicht für die Carry-Save-Addierer, die Sie in modernen Multiplikationseinheiten finden. Jeder hat seine eigenen Besonderheiten und Einschränkungen.
Die Berechnung des Verzweigungsziels umfasst beispielsweise typischerweise das Hinzufügen einer kleinen Konstante zu einem vollständigen Wort, was ein anderes Addiererdesign vorschlägt als eines, bei dem zwei vollständige Wörter addiert werden. In ähnlicher Weise erfordert die Gleitkommaaddition einen Rundungsschritt nach der Addition, der möglicherweise weniger als einen Zyklus dauert. Es gibt also keinen Grund, warum Sie den Rest des Zyklus nicht stehlen könnten, um die Addition abzuschließen.
Schließlich und vielleicht am wichtigsten ist, dass die großen Player (z. B. Intel, AMD, NVIDIA) aus offensichtlichen Gründen ziemlich genau über Implementierungsdetails auf niedriger Ebene informiert sind, es sei denn, sie glauben, dass sie ein Papier und / oder Patent daraus ziehen können. Selbst dann kann man ohne Reverse Engineering oft nicht sicher sein, was sie tatsächlich getan haben.
Trotzdem gibt es ein paar Dinge, die wir wissen.
Das Wichtigste, was Sie wissen müssen, ist, dass Carry-Lookahead-Methoden Bausteine sind und nicht unbedingt Methoden an sich. Eine Analogie könnte hier angebracht sein.
Wenn Sie an Algorithmusklassen denken, haben Sie wahrscheinlich eine Reihe von Sortieralgorithmen gelernt, z. B. Schnellsortierung, Zusammenführungssortierung, Einfügesortierung usw. Wenn das Sortieren in der realen Welt ein Leistungsengpass ist, würde jeder anständige Ingenieur diese als primitive Bausteine betrachten, aus denen eine "echte" Sortierung konstruiert werden kann.
Der Sortieralgorithmus aus der GNU C ++ - Standardbibliothek verwendet beispielsweise eine schnelle Sortierung und eine Einfügesortierung, wenn die Intervalle klein genug werden. Wenn es jedoch nach einigen Durchgängen so aussieht, als hätte die schnelle Sortierpartitionierung das pathologische Verhalten getroffen, wird auf die Heap-Sortierung zurückgegriffen. Das sind drei verschiedene Sortieralgorithmen, um eine Sortierung mit industrieller Stärke zu erstellen.
Gleiches gilt für Addiererschaltungen. Es ist zum Beispiel bekannt, dass die Pentium 4-Ganzzahleinheit einen Han-Carlson-Addierer verwendete, der eine Mischung aus Kogge-Stone und Brent-Kung ist. (Han-Carlson ist besonders interessant, weil es ein "Sweet Spot" im Kompromiss zwischen Ausbreitungsverzögerung und Chipbereich ist, der auch sehr energieeffizient ist.) Es lohnt sich oft, eine Mischung aus mehreren Methoden zu verwenden.
"Reine" Carry-Lookahead-Addierer sind in synthetisierten Schaltkreisen (z. B. wenn Sie Cadence oder Synopsys einen Verilog "+" - Operator zuführen) immer noch die Norm. Of-Order-Ausführungs-Engines scheinen sich in Richtung eines etwas anderen Designs für ihre ganzzahligen Einheiten zu bewegen.
Spekulative Addierer sind Schaltungen, die eine extrem geringe Ausbreitungsverzögerung aufweisen, aber nur teilweise korrekt funktionieren (95% der Zeit sind typisch), und es ist möglich, mit sehr wenig Logik zu sagen, ob der spekulative Addierer das richtige Ergebnis zurückgibt oder nicht. Die Idee ist also, eine spekulative Addition und die Hälfte einer Carry-Lookahead-Addition parallel in einem Zyklus durchzuführen. Wenn der spekulative Addierer die richtige Antwort zurückgegeben hat, ist die Anweisung abgeschlossen. Andernfalls blockieren Sie die Pipeline und führen Sie die andere Hälfte der genauen Addition durch.
Da Sie wissen, dass der langsame Pfad zwei Zyklen dauert, könnten die Entwickler eine platz- und energieeffizientere Methode verwenden, selbst wenn sie für den allgemeinen Gebrauch zu langsam wäre.