邏輯合成(logic synthesis)
設想把一份用大白話寫的食譜("把蛋打到蓬鬆,再把麵粉拌進去")翻譯成工廠機器真正能執行的精確機械臂指令。你在很高的層面上寫下了意圖,但總得有東西把它變成具體的物理動作。邏輯合成就是晶片世界裡的這個翻譯官。你用 RTL(也就是談論暫存器、算術運算和"如果這樣,那麼那樣"的 Verilog、SystemVerilog 或 VHDL)描述電路應該做什麼,而合成工具則負責琢磨出該怎麼用真實硬體把它搭出來。
更確切地說,邏輯合成接收你的暫存器傳輸級描述,把它編譯成一份閘級網表:一張接線圖,列出具體的邏輯單元(AND 閘、多工器、正反器等等)以及它們之間的連接方式。但它不能隨便挑單元——它只能從標準單元庫裡取用,那是一份固定的選單,裡面都是預先設計好、預先特性化過的閘,晶圓代工廠保證能在給定的製程節點上把它們製造出來。工具先把你的邏輯映射到這份選單上,然後狠下功夫最佳化:它提取出共享項、合併冗餘邏輯,並調整閘的尺寸,以在速度、面積和功耗之間權衡,來貼合你的目標。
關鍵之處在於,工具不能盲目最佳化——它必須遵守你的時序約束,尤其是每條路徑都必須跑贏的時脈週期。合成工具利用特性化單元庫給出的延遲數值(再加上估算的連線延遲),重塑組合邏輯——有時還會跨越暫存器邊界重新組織它,這一步叫做重定時(retiming)——好讓最慢的那條路徑仍能在一個時脈週期內穩定下來。把這一步做對,你就能交出一份網表:它在功能上應當與你的 RTL 等價,同時已為下一階段佈局繞線做好準備,在那裡這些單元會在晶片裸晶上獲得具體的物理位置。合成,正是一個抽象設計第一次變成真實、可製造電路的地方。
assign sum = a + b;
在 RTL 裡寫下 `assign sum = a + b;`,你其實根本沒說該怎麼做加法。合成會把這一行變成一個由單元庫搭成的具體加法器——如果面積吃緊,就用漣波進位鏈;如果這條路徑勉強趕不上時脈,就用更快的超前進位結構——並替你把線都接好。
"合成"聽起來像是無中生有地造出某樣東西,但實際工作大體上恰恰相反——是把數量龐大的可能實現方案收窄到一份好網表。要注意它的邊界:經典邏輯合成只能依據統計性的連線負載模型來估算連線延遲;真實的互連延遲要到佈局繞線把物理連線鋪設好之後才能知道,這正是為什麼現代流程越來越用"物理感知"合成把這兩個階段的界限模糊化。(至於網表是否真的與你的 RTL 一致這個承諾,隨後會另行透過形式等價性檢查來確認。)