第一百三十三章 布局
许静远问的第一个问题是:「仲裁模块里,哪条状态机转移是最频繁触发的?」
颜天磊回答这个问题不需要想,「DISPATCH\_HIT 到 IDLE,」他说,「每次命中请求处理完就回 IDLE,命中是主路径,频率最高。」
「那 DISPATCH\_HIT 的输出端和哪些单元直接连?」
「连 SRAM 读接口,」颜天磊说,「命中的时候要立刻发读操作给 SRAM,然后把数据返回给请求方。」
「好,」许静远说,「那仲裁模块的 DISPATCH\_HIT 输出端和 SRAM 读接口之间的连线是最关键的——我要把这两部分尽量靠近。」
那一周,颜天磊的工作变成了:在写代码和写文档的间隙,回答许静远的问题。
许静远有时候一上午都不说话,屏幕上的 Innovus 界面在不停刷新,数字在变化,她在做的是一种叫做 timing-driven placement 的操作——让工具在摆放单元的时候,把时序约束作为优先条件,让关键路径上的单元尽量靠近,减少连线延迟。
但工具做的决定并不总是对的,它不知道某个模块的具体功能,不知道哪两个模块之间的信号交换最频繁,这些信息只有颜天磊知道。
许静远把这叫做「约束补充」,「工具能做的是在给定约束里找最优,」她说,「但约束要你们来给,给错了它就走错路。」
第二个问题是在第三天下午:「优先级队列,」她说,「它更新的时候,有没有直接影响到仲裁模块的时序?」

「会,」颜天磊说,「每次有新请求进来,优先级队列更新,然后仲裁模块读队列头部决定下一个处理谁——这两个动作在同一个时钟周期里完成。」
「同一个周期,」许静远重复了一遍,「那优先级队列的输出端和仲裁模块的输入端之间,不能有太长的连线。」
「你要把优先级队列也搬过来?」
「不是搬过来,」许静远说,「是在布局里让这三个模块形成一个区域——仲裁在中心,SRAM 接口和优先级队列在两侧,距离对称,这样两边的连线长度差不多,偏斜影响最小。」
颜天磊想了一下,「如果 SRAM 接口和优先级队列都靠近仲裁,那 miss 回填路径那边的连线会不会变长?」
许静远停了一秒,「问得好,」她说,「这是 placement 的核心问题——靠近一个就可能远离另一个,所以我要先把四个方向的连线权重都算清楚,再决定具体摆哪里。」
第一轮布局优化在第八天出结果。
许静远把报告打印出来,放在方宇明桌上,「第一轮,」她说。
方宇明看了两个数字:仲裁模块和 SRAM 接口之间的连线长度从 1.8mm 减到了 1.1mm,减少了 39%;优先级队列更新路径的 slack 从 0.65ns 改善到了 0.82ns。
「0.65 到 0.82,」他说,「这个变化是连线缩短导致的?」

「主要是,」许静远说,「连线延迟减少,路径总延迟减少,slack 就变大了。」
「那 DISPATCH\_MISS 那条路,」他说,「从 0.98 变成多少?」
「没有太大变化,」许静远说,「0.98 到 1.03,那条路本来就不是连线延迟为主,是逻辑本身,改布局对它的帮助有限。」
「但 0.65 到 0.82 这个改善,」方宇明说,「意味着那条路不再是最紧的了?」
「对,」许静远说,「现在三条临界路径里,slack 最低的是状态机那条,0.72,还是有一定余量,不过不多。」
「够吗?」
「加上布线之后会再减一些,」许静远说,「现在 0.72 进布线,出来可能是 0.5 到 0.6,如果是 0.5 还在合理范围,如果低于 0.4 就要考虑优化状态机的逻辑了。」
「需要我们做什么?」
「等,」许静远说,「等布线完成,看结果,再说。」

贺志明那天从外面走进来,把午饭放在桌上,看了一眼许静远屏幕上的布局图,「进展怎么样?」
「第一轮完成,」许静远说,「比上次项目顺一些,这个设计的逻辑相对规整,模块边界比较清楚。」
「你上次项目遇到什么问题?」贺志明问。
「布局的时候有一个大型运算模块被放错了区域,」许静远说,「它的输出接了三十多个下游单元,分布在各个方向,结果连线全部变长,后来返工了一次。」
「那次怎么处理的?」
「重新划分了那个模块的位置,」许静远说,「同时调整了下游那三十多个单元的区域,让它们更集中——做了两轮才稳定。」
「记录下来了吗?」贺志明说。
「只在工程日志里,没有正式文档,」许静远说,「这种事每个项目都有,不会一样,记下来的价值不大——有用的是知道那类问题存在,下次一开始就避开。」
贺志明点头,「这次你一开始就先看那三条临界路径,」他说,「就是这个原因?」
「就是这个原因,」许静远说,「先把最危险的地方想清楚,再做其他的。」

陆衍那几天在 B207 来得比前几周勤一些。
他说不清楚为什么,可能是因为许静远的出现让这个房间里发生的事情从「颜天磊和孟思远在改代码」变成了「一个更大的东西在成形」——仲裁模块、SRAM 单元、时序约束、时钟树、布局,这些单独拿出来他有些不懂,但放在一起,他可以感觉到它们在往一个方向走。
他发消息给豆包:「许静远说第一轮布局优化完了,连线长度减了 40%,一条临界路径的 slack 从 0.65 改善到 0.82。」
豆包回:「39% 的连线缩短对时序影响可以比较直观地估算——28nm 工艺里,1mm 的连线大约有 0.1 到 0.15ns 的延迟,减少 0.7mm 就是 0.07 到 0.1ns 的改善,和 0.65 到 0.82 的 0.17ns 改善基本吻合,说明她的判断是准的。」
陆衍:「她问颜天磊问题的方式,感觉和问代码问题不一样。」
豆包:「物理后端工程师需要理解逻辑,但不是为了理解设计,是为了知道哪些单元需要靠近——这是两个不同视角在同一个设计上的协作。颜天磊第一次真正需要把设计意图翻译给不懂代码的人听。」
陆衍看了这条消息,又想了一下,然后回:「她问优先级队列的问题,颜天磊顺口问了一句,把 SRAM 接口靠近之后,miss 路径那边的连线会不会变长。」
豆包:「这说明颜天磊在做 RTL 的时候已经开始想物理实现的问题了。这是很多前端工程师花几年时间才会开始想的事情。」
陆衍把手机放回桌上,B207 的窗外是上海初冬的夜晚,许静远还在屏幕前,第二轮布局优化已经在准备中了。