逻辑综合(logic synthesis)
设想把一份用大白话写的菜谱("把鸡蛋打到蓬松,再把面粉拌进去")翻译成工厂机器真正能执行的精确机械臂指令。你在很高的层面上写下了意图,但总得有东西把它变成具体的物理动作。逻辑综合就是芯片世界里的这个翻译官。你用 RTL(也就是谈论寄存器、算术运算和"如果这样,那么那样"的 Verilog、SystemVerilog 或 VHDL)描述电路应该做什么,而综合工具则负责琢磨出该怎么用真实硬件把它搭出来。
更确切地说,逻辑综合接收你的寄存器传输级描述,把它编译成一份门级网表:一张接线图,列出具体的逻辑单元(与门、多路选择器、触发器等等)以及它们之间的连接方式。但它不能随便挑单元——它只能从标准单元库里取用,那是一份固定的菜单,里面都是预先设计好、预先表征过的门,代工厂保证能在给定的工艺节点上把它们制造出来。工具先把你的逻辑映射到这份菜单上,然后狠下功夫优化:它提取出共享项、合并冗余逻辑,并调整门的尺寸,以在速度、面积和功耗之间权衡,来贴合你的目标。
关键之处在于,工具不能盲目优化——它必须遵守你的时序约束,尤其是每条路径都必须跑赢的时钟周期。综合工具利用表征库给出的延迟数值(再加上估算的连线延迟),重塑组合逻辑——有时还会跨越寄存器边界重新组织它,这一步叫做重定时(retiming)——好让最慢的那条路径仍能在一个时钟周期内稳定下来。把这一步做对,你就能交出一份网表:它在功能上应当与你的 RTL 等价,同时已为下一阶段布局布线做好准备,在那里这些单元会在芯片裸片上获得具体的物理位置。综合,正是一个抽象设计第一次变成真实、可制造电路的地方。
assign sum = a + b;
在 RTL 里写下 `assign sum = a + b;`,你其实根本没说该怎么做加法。综合会把这一行变成一个由库单元搭成的具体加法器——如果面积吃紧,就用行波进位链;如果这条路径勉强赶不上时钟,就用更快的超前进位结构——并替你把线都接好。
"综合"听起来像是无中生有地造出某样东西,但实际工作大体上恰恰相反——是把数量庞大的可能实现方案收窄到一份好网表。要注意它的边界:经典逻辑综合只能依据统计性的连线负载模型来估算连线延迟;真实的互连延迟要到布局布线把物理连线铺设好之后才能知道,这正是为什么现代流程越来越用"物理感知"综合把这两个阶段的界限模糊化。(至于网表是否真的与你的 RTL 一致这个承诺,随后会另行通过形式等价性检查来确认。)