第四周的某个晚上,B区实验室里爆发了一场战争。
对阵双方是阿米特和一片FPGA开发板。
板子上跑的是Atlas的ALU原型,已经在测试平台上连续跑了三天,一切正常。阿米特正准备把测试覆盖率报告打印出来贴在白板上——他每完成一个模块的验证都要贴一张,贴满就请大家吃咖喱——结果就在最后一批测试向量跑完的瞬间,示波器上闪过一道不该出现的毛刺。
就那么一下。
在时钟上升沿之后不到零点三纳秒的位置,一个信号本该保持高电平,却往下掉了一小截又弹回来,像一个舌头突然伸出来又飞速缩回去。快到几乎看不清,快到大部分工程师可能会直接忽略把它当成测量噪声。
但阿米特看到了。
他整个人像被电击了一样定在屏幕前面,手里还拿着那张正准备往白板上贴的覆盖率报告。
“卧槽。”
这一声是他从何晓天那里学来的,发音还不太标准,听起来像“我糙”,但语气里的崩溃感是跨越语言障碍的。
“怎么了?”林远舟从自己的工位上抬起头。
“毛刺。”阿米特把示波器的波形放大、再放大、截了图往团队邮箱里一发,“ALU进位链上,最高位,加法溢出的时候——就这一个点。十六万组测试向量就出了两次,而且不是每次溢出都出,是有前置条件的。我特么跑了三天三夜从来没遇到过,偏偏最后一批数据里藏了一个,这要是漏过去了流片回来就是一块废铁。”
何晓天已经凑过来了。
他鼻尖快贴到屏幕上,看了一眼波形之后发出了一声从嗓子眼里挤出来的低吼。
“我靠,这不是代码的问题——我查了RTL级仿真,进位链的逻辑完全正确。问题不在我的代码里,是综合工具把进位逻辑映射到了一个自带毛刺的硬核上。”
三个人围着示波器沉默了好几秒钟。
毛刺。芯片行业最让人恨得咬牙切齿的东西。它不是功能错误——功能仿真的时候一切完美,逻辑门级网表也查不出任何毛病,代码审查一万遍都找不出语法错误。
它是物理层面的东西,是信号在连线上传播的时候因为延迟不匹配产生的一个瞬态脉冲,短到只有零点几纳秒。但在高速时钟下,它会被触发器当成一个有效的时钟沿采进去,然后整个芯片的逻辑状态就像被泼了一盆墨水——全乱了。
“综合工具的硬核库里有bug。”何晓天摘下眼镜在衣角上用力擦了好几下,这是他焦躁时的习惯动作,“它把超前进位链映射到了一个没有做毛刺过滤的宏单元上。正常应该用寄存器打一拍再输出,这个硬核为了省一个周期把寄存器绕过去了。我得重新手写一个进位控制器,把综合工具的自动优化绕开。”
“要多久?”林远舟问。
“重新手写加验证,至少一周半。”
林远舟在心里快速算了一下时间线。何晓天的手写模块会拖慢流水线的整体进度,但这不是能砍掉的环节。他在脑子里权衡了几秒,转头看阿米特。
“手写模块出来之后验证周期怎么调整?”
阿米特双手在键盘上飞快敲了几下,把重新排期的验证计划调了出来。
“如果他一周半能交,我三天之内跑完集成测试。但如果他的进位控制器跟其他模块的接口有一丁点不匹配,时间就要翻倍。所以我建议——何晓天先手写核心逻辑,我在旁边开一个并行的仿真环境同步跑回归测试,这样他一改完我马上就能验证,省掉中间的等待时间。”
“并行仿真环境需要额外搭多久?”
“一晚上。我今晚不回去了。”
何晓天已经把进位链的RTL级仿真波形重新调了出来,放大到那个理论上不该存在毛刺的时间窗口,一点一点地排查综合工具自动映射的逻辑网表。
“你们知道最恶心的是什么吗?”何晓天指着屏幕上那个被综合工具自动插入的宏单元,“这个毛刺不是每次都出。它只在加法溢出且前一个指令是乘法的时候才触发。乘法器的输出延迟比加法器长,导致进位链的输入信号到达时间差了几十皮秒。就这几十皮秒,刚好踩在毛刺的触发窗口上。”
“所以你之前跑仿真的时候没遇到,是因为测试向量里没有乘法接溢出的组合。”林远舟走到他身后,看着屏幕上那行被高亮标记的时序路径。
“对。这个组合的概率大概是万分之一,十六万组向量里出了两次,概率完全吻合。阿米特要是不截到这一帧,我们就带着这个bug去流片,回来之后在客户那里随机死机——到时候找bug的成本是现在的十万倍。”
林远舟拍了拍何晓天的肩膀。
“现在找到了。这就是为什么要做FPGA验证。”
何晓天深吸一口气,把眼镜重新戴好。
“给我两周。手写的进位控制器我要把每一级进位都拆开,用寄存器隔离,不让综合工具有任何自作主张的空间。面积会大一些,功耗也会多一点点,但毛刺绝对不会再有。”
“功耗多多少?”
“大概百分之三到五。时钟树上多了一级寄存器,这部分功耗是额外增加的。”
“可以接受。”林远舟转头看向阿米特,“你今晚搭并行仿真环境。何晓天改完一行,你就跑一行。这个毛刺要在第一时间确认是否修复,不要等到全部改完再测。”
阿米特已经打开了验证脚本编辑器,开始写新的回归测试框架。
“你们知道我现在想干什么吗?我想给那个综合工具的作者寄一箱过期的咖喱。那个毛刺藏得比我前女友的社交账号还难找,我差点就漏过去了。如果我漏过去了,Atlas流片回来在客户那里随机死机,我这辈子都没脸再写验证脚本。”
何晓天没有回应阿米特的咖喱威胁,他已经完全沉浸在进位链的波形图里。屏幕上的时序路径被他一条一条标注成不同的颜色,红色的是有毛刺风险的,黄色的是需要额外约束的,绿色的是可以保留的。整个进位控制器的逻辑结构在他脑子里重新搭建,每一级进位都加了寄存器隔离,每一个可能产生毛刺的节点都被打上了标记。
林远舟回到自己的工位上,打开加密引擎的时序约束文件。加密引擎的S盒替换在高温下也出现了时序边界偏紧的问题,但不像进位链那么致命——加一级流水线寄存器就能解决,代价是加密吞吐量下降百分之二十。
他在文档上打了个备注:加密引擎流水线加一级,吞吐量降百分之二十,暂时接受。下个版本优化S盒的物理布局,把关键路径缩短,争取把吞吐量拉回来。
窗外已经全黑了。B区实验室的日光灯嗡嗡响,阿米特的键盘噼里啪啦地敲着,何晓天对着屏幕自言自语。林远舟看着这两个人,忽然想起上辈子在深圳带团队的时候,也是这样的深夜,也是毛刺和时序问题把人逼到崩溃边缘。但上辈子他没有阿米特这种能在万分之一概率下截到毛刺的验证工程师,也没有何晓天这种能跟综合工具死磕两周手写进位控制器的数字IC设计。
这辈子他有。
“晓天。”林远舟头也没抬。
“嗯?”
“进位控制器的命名,别叫carry_controller_v14。叫carry_controller_final。”
何晓天推了推眼镜。“你上次说final不要乱用,因为永远会有final_v2。”
“这次是真的final。”
“你每次都这么说。”何晓天说这句话的时候嘴角微微翘了一下,然后低下头继续标注时序路径。红色的线条在屏幕上一条一条变成黄色,又一条一条变成绿色。
本书首发来自 17K小说网 ,第一时间看正版内容!
作者寄语: