布线拥塞(congestion)
把芯片上的连线想象成汽车,把金属层想象成一摞单向街道,每条街道又被划成固定数量的平行车道,这些车道就叫布线轨道(routing track)。布线拥塞就是一场交通堵塞:在版图(floorplan)的某个区域里,想穿过去的网线比能容纳它们的车道还要多。布线器没法把路加宽,于是挤不下的连线要么绕一大圈躲开堵点,要么在实在找不到通路时干脆连不上。一个看起来很正常的布局之所以实际布不通,这是最常见的单一原因。
要量化它,布线器会在芯片上铺一层粗粒度的小方格网格(即全局布线单元,global-routing cell),并在每条方格边界上比较两个量:供给(supply),也就是扣掉阻挡层和预布线之后穿过这条边的轨道数;以及需求(demand),也就是想穿过这条边的网线数。凡是需求超过供给的地方就产生溢出(overflow),工具便把这些方格标成拥塞热点。绕行随后会让你付出实打实的硅片代价:连线更长意味着更大的电阻和电容、更多过孔、更多延迟,于是即便没有任何地方真正短路,拥塞也会悄悄演变成时序和信号完整性问题。
根源几乎总是在上游的布局(placement)阶段。把单元塞得太密、把引脚密集或高扇出的逻辑挤在一起,或者让宏单元(macro)夹出狭窄的通道,都会把连线需求集中到同一个点上。正因如此,拥塞要在布局阶段就通过一次快速的试探性(全局)布线提前估算,而最终只能在全局布线和详细布线阶段彻底解决。常用的对症手段都作用在布局上、而不是连线上:降低局部单元密度,在热点附近加单元间距(cell padding)或布局阻挡,跑拥塞驱动的布局,或者重构那些惹麻烦的网线,然后重新布线、重新检查。
布线器按每条方格边界给拥塞打分;溢出为正,就说明连线必须绕行,或者只能保持未布通状态。
整体利用率(utilization)低并不能保证设计可布通:一颗芯片可能整体只用到 60% 的面积、整体上也并不拥塞,却在某个引脚密集的角落发生溢出,所以一定要看局部的拥塞图,而不只是看全局的利用率数字。