Il s'agit d'une question simple avec une réponse très complexe.
Tout d'abord, quelques informations.
La conception VLSI du monde réel est un domaine extrêmement technique qui présente un équilibre des compromis en constante évolution. Le temps qu'un circuit prend pour calculer une réponse est rarement le seul facteur important. Il y a aussi la consommation d'énergie et la zone physique, ainsi qu'un tas de facteurs qui révèlent que les circuits que vous concevez sont en fait analogiques (par exemple, la résistance du fil, la capacité parasite). Tous ces éléments sont importants dans un circuit réel et peuvent avoir un impact sur la conception choisie.
Deuxièmement, vous devez considérer l'ensemble du cycle de vie d'un projet. Un additionneur qui convient à une réalisation VLSI peut ne pas convenir à une réalisation FPGA. Si la conception va passer par une phase testée sur un FPGA ... vous obtenez l'image.
Troisièmement, tous les additionneurs ne sont pas égaux. Sur un CPU typique, il y a beaucoup d'additionneurs qui effectuent différentes tâches; il y a probablement plusieurs ALU entiers, un additionneur de mantisse à virgule flottante, un additionneur qui effectue le calcul, un additionneur qui calcule les cibles de branche, et ainsi de suite. Cela ne compte pas les additionneurs de sauvegarde que vous trouvez dans les unités de multiplication modernes. Chacun a ses propres particularités et contraintes.
Le calcul de la cible de la branche, par exemple, implique généralement l'ajout d'une petite constante à un mot complet, ce qui suggère une conception d'additionneur différente de celle qui ajoute deux mots complets ensemble. De même, l'ajout de virgule flottante nécessite une étape d'arrondi post-ajout qui peut prendre moins d'un cycle, il n'y a donc aucune raison pour que vous ne puissiez pas voler le reste du cycle pour terminer l'ajout.
Enfin, et peut-être le plus important, les grands acteurs (par exemple Intel, AMD, NVIDIA) sont assez étroits sur les détails de mise en œuvre de bas niveau pour des raisons évidentes, à moins qu'ils ne pensent pouvoir en obtenir un document et / ou un brevet. Même alors, vous ne pouvez souvent pas être sûr de ce qu'ils ont réellement fait sans rétro-ingénierie.
Cela dit, nous savons certaines choses.
La chose clé dont vous devez vous rendre compte est que les méthodes d'anticipation sont des éléments constitutifs, et pas nécessairement des méthodes en elles-mêmes. Une analogie pourrait être de mise ici.
Si vous pensez aux classes d'algorithmes, vous avez probablement appris un tas d'algorithmes de tri tels que le tri rapide, le tri par fusion, le tri par insertion, etc. Dans le monde réel, si le tri est un goulot d'étranglement en matière de performances, tout ingénieur décent les considérerait comme des blocs de construction primitifs à partir desquels un tri "réel" peut être construit.
L'algorithme de tri de la bibliothèque standard GNU C ++, par exemple, utilise un tri rapide, en utilisant le tri par insertion lorsque les intervalles deviennent suffisamment petits. Cependant, si après quelques passages, il semble que le partitionnement de tri rapide ait eu un impact pathologique, il revient au tri en tas. Il s'agit de trois algorithmes de tri différents pour créer un tri de puissance industrielle.
Il en va de même pour les circuits additionneurs. On sait, par exemple, que l'unité entière Pentium 4 a utilisé un additionneur Han-Carlson, qui est un mélange de Kogge-Stone et Brent-Kung. (Han-Carlson est particulièrement intéressant, car il s'agit d'un "point idéal" dans le compromis entre le délai de propagation et la zone de matrice qui est également très économe en énergie.) Il est souvent avantageux d'utiliser un mélange de plusieurs méthodes.
Les ajouts "purs" de lookahead sont toujours la norme dans les circuits synthétisés (par exemple si vous alimentez un opérateur Verilog "+" à Cadence ou Synopsys), en ce qui concerne la conception manuelle, les processeurs modernes haut de gamme avec leur superscalaire out- Les moteurs d'exécution d'ordre semblent s'orienter vers une conception légèrement différente pour leurs unités entières.
Les additionneurs spéculatifs sont des circuits qui ont un retard de propagation extrêmement faible, mais qui ne fonctionnent correctement qu'une partie du temps (95% du temps est typique), et il est possible de dire avec très peu de logique si l'additionneur spéculatif renvoie le résultat correct ou non. L'idée est donc de faire un ajout spéculatif et la moitié d'un ajout de lookahead en parallèle, en un seul cycle. Si l'additionneur spéculatif a renvoyé la bonne réponse, l'instruction est exécutée. Sinon, bloquez le pipeline et effectuez l'autre moitié de l'ajout précis.
Parce que vous savez que le chemin lent prendra deux cycles, les concepteurs pourraient utiliser une méthode plus efficace et plus économe en énergie, même si elle serait trop lente pour une utilisation générale.