進位前瞻加法器
漣波進位加法器像一排人傳接力棒:第 0 欄必須先完成,第 1 欄才能開始,接著才輪到第 2 欄,一路往上。一次 64 位元加法,進位得依序漣波穿過 64 級,最壞情況的延遲隨寬度增長。進位前瞻加法器問了個更銳利的問題:與其等別人告訴它進位,每一欄能不能藉由一次看遍所有低位元,自己算出進位會不會到?
訣竅是每欄兩個訊號。若某欄兩個輸入位元都是 1,它就會產生進位(不管進來什麼都會生出進位):產生 g = a AND b。若某欄至少有一個輸入位元是 1,它就會傳遞進來的進位(進來的進位直接穿過):傳遞 p = a OR b。由這兩者,進入第 i 欄的進位是:要嘛在某個更低欄被產生,要嘛在更低處被產生並一路傳遞穿過中間每一欄。因為 g 與 p 只取決於輸入位元、不取決於進位,硬體就能用一棵 AND 與 OR 閘構成的樹把所有進位平行算出來,延遲隨寬度的對數而非線性增長。各欄不再排隊等待,而是直接查出進位。
這是「花閘門買速度」的教科書範例:前瞻加法器用的邏輯遠多於漣波加法器,吃更多面積與功耗,但對寬字組快得多,因此它坐落在真實 ALU 的關鍵路徑上。實務上設計者採階層式搭建——小型 4 位元前瞻區塊再由第二層前瞻組合起來——而進位選擇加法器與並行前綴加法器是它的表親,在同一條「速度對面積」的取捨曲線上落在不同的點。
進入第 3 欄的進位 = g2 OR (p2 AND g1) OR (p2 AND p1 AND g0) OR (p2 AND p1 AND p0 AND 進位輸入)。每一項只用到由輸入導出的 g 與 p 位元,所以四個進位能一次算出,而不必逐欄漣波。
產生與傳遞讓每個進位都能由輸入位元平行算出。
前瞻並非讓一次加法「瞬間完成」——它用大量增加的邏輯,把大約線性的延遲換成大約對數的延遲。超過幾個位元後,完全攤平的前瞻會太龐大,所以真實加法器以階層式區塊搭建。