最新网址:www.3qxsw.com

第158章 三顾茅庐(一)

作品:《 香江:从破产电器厂到全球巨头》

梁工抵达香港那天,九龙塘下了入秋以来的第一场雨。雨不大,细密得像从飞鹅岭方向飘过来的针尖,打在新铺的柏油路面上溅起一层薄薄的水雾。他拎着一只旧皮箱站在创世纪铁门口,皮箱的拎手已经磨损得露出了里面的帆布衬里,箱角有几处被托运标签反复粘贴又撕下后留下的胶痕。他抬头看着门楣上那块白漆写的“创世纪电子”招牌看了很久,雨滴顺着他的帽檐往下滴,在脚边的水洼里打出极小的涟漪。

他比林知夏大三岁,头发已经有些稀疏,前额的发际线退得比同龄人更靠后,那是常年熬夜跑仿真的代价。戴着一副厚厚的黑框眼镜,镜片上有几道细小的划痕,左边镜腿用透明胶带缠了好几圈。他穿着一件洗得发旧的深蓝色夹克,肩膀和肘部的布料已经磨得有些发白,但领口扣得整整齐齐。整个人看起来不像一个即将参与华资电子史上第一颗自主处理器设计的核心工程师,倒像一个刚从长途航班上下来、还没有从时差中醒过来的大学讲师。他在铁门前站了好一会儿,然后从口袋里掏出一张被折叠了多次的信纸——那是林知夏寄给他的曙光一号架构图复印件,纸边已经被反复翻阅磨得起了毛边,折痕处用透明胶带小心翼翼地粘着。他把信纸重新折好放回口袋,拎起皮箱,推开了铁门。

林知夏在实验室门口等他。两个在硅谷相识多年的老朋友隔着雨幕对望了一眼,没有握手,没有拥抱,没有任何久别重逢的寒暄。林知夏只是推了一下滑到鼻尖的眼镜,目光在梁工手里那只旧皮箱上停留了片刻——那只皮箱他认得,是梁工在斯坦福读博时用的,箱盖上还贴着一张已经褪色的斯坦福校徽贴纸,边角翘起了大半。“飞机晚点了。”“在东京转机时多等了几个钟。”这就是他们全部的寒暄。然后林知夏转身走进实验室,梁工拎着皮箱跟在后面,皮鞋在水泥地上踩出有节奏的声响,混在注塑机低沉的嗡鸣里。

实验室白板上,曙光一号的架构图已经被林知夏更新到了最新版。CPU前端设计的第六版草稿贴在白板左侧,五级流水线的全部时序分配用不同颜色的记号笔标注得清清楚楚——蓝色是数据通路,红色是控制信号,绿色是时钟树,黑色是中断优先级矩阵里那个刚加入不久的仲裁控制器模块。白板右侧是一片空白区域,上面用红笔写着几个大字——“仿真验证环境”。梁工走到白板前,逐行看完林知夏画的延迟槽优化逻辑和中断优先级矩阵里那个仲裁控制器模块。他的目光在仲裁控制器方框旁边那行铅笔字上停了很久——那行字标注了设计灵感的来源,说这个模块的时序仲裁逻辑参考了中周变压器线圈匝间绝缘的分布电容控制原理。他之前在硅谷读林知夏寄来的架构图时就注意到这行字了,此刻看到实物,发现仲裁控制器的门级逻辑比他在飞机上凭记忆画的草图更简洁——只用了几个逻辑门和一级缓冲就实现了两个中断信号的错开处理。

他放下皮箱,从箱盖夹层里抽出一叠手写的仿真框架草稿。这些草稿是他在硅谷那间出租公寓里画的,有些用铅笔,有些用圆珠笔,纸边已经被翻得起了毛。最上面一张是他在收到林知夏回信那天傍晚画的——他坐在公寓窗边,窗外下着小雨,桌上摊着林知夏寄来的架构图,他在信纸背面画下了仿真环境的第一张方框图。他把这张方框图用图钉按在自己工位正前方的墙上,然后拿起一支记号笔,在白板上“仿真验证环境”那片空白区域中央画了一个新的模块——覆盖率反馈引擎。他在这个模块旁边画了一条闭环回路:从指令生成器出发,经过门级逻辑比对,再到覆盖率分析,覆盖率分析的结果再反馈回指令生成器,自动调整下一次生成的指令组合。这条回路的箭头被他用红笔重重描了好几遍。

“这个模块会自动记录哪些指令组合已经被测试过,哪些还没有。每次发现新的覆盖缺口,指令生成器就会自动生成针对性的测试序列——不是一键验证,但能让你知道还差多远。”他把笔放在白板边缘,转身对着林知夏说,这次他要实现当年博士论文里提出的那套随机指令生成和覆盖率反馈闭环方法。不是作为一篇被束之高阁的学术论文,而是作为一颗即将流片的处理器在每一次修改后都能即时反馈的验证工具。他在EDA公司时反复向主管强调这个流程的重要性——验证不是一键能完成的,验证是穷举,是逼近,是用软件把所有可能的路径走完直到走不动为止。主管的回复永远是同一句话:“客户不需要这么复杂的反馈机制。”他为此和主管争执了好几年,最后被调去维护旧代码。现在他终于有机会亲手实现它。

他搭建仿真环境的方式和他这个人一样——极简。他不喜欢用现成的商业仿真软件,那些软件太庞大、太慢,而且黑盒封装,出了问题只能靠日志反向推测。他用C语言从零写了一套指令集模拟器,把曙光一号的每一条指令在软件层面逐条实现,再随机生成指令组合送入模拟器和林知夏手写的门级逻辑图进行比对。模拟器的核心是一个极简的指令集虚拟机,按精简指令集的五级流水线架构逐条执行每一条指令,记录每一条指令执行后的寄存器状态、内存数据和标志位。林知夏手绘的门级逻辑图被逐层翻译成一组等价的状态转移方程——每一个逻辑门的输入输出都被定义为信号状态变量,模拟器每执行一条指令,就把这条指令对应的信号状态与状态转移方程的预期输出进行比对。

他在模拟器里内嵌了一套自动化的结果比对机制。一旦发现模拟器和门级逻辑之间的输出不一致,就自动记录当前的指令序列、寄存器状态和信号差异点,作为后续调试的输入。这套机制让林知夏的工作效率大幅提升——以前他每次修改一个逻辑门之后都要手算好几组指令的时序变化,在稿纸上逐条推导波形,改一处往往要花几个小时验证。现在只需要把修改后的逻辑图交给梁工,几小时后模拟器就会自动跑完所有可能的指令组合,把不一致的地方逐条列在打印纸上。梁工把这些打印纸按日期装订成好几本厚厚的验证日志,在每本日志的封面标注了测试起止时间、总测试次数和对应的逻辑版本号。他在第一本验证日志的扉页上用钢笔写了一行字:“本日志所有测试数据均可追溯至原始指令序列和信号状态变量。任何人均可复现。”

有一天深夜,他跑完一轮全指令覆盖测试后,从打印机里扯出厚厚的测试报告逐页翻看,忽然在某一页停住了。那是一组条件分支指令的密集测试序列,分支历史表在连续翻转时漏掉了一个极端的时序窗口——当两条分支指令的跳转目标地址同时出现在数据总线上时,延迟槽填充逻辑会因为地址冲突而错误地填入一条空指令。他在EDA公司时曾在一款商用处理器的勘误文档里见过类似的漏洞,那个漏洞被标记为“已知问题,不影响正常使用,不计划修复”。他用红笔在这条错误记录旁边画了一个圈,在旁边手写了一行备注:“此漏洞在商用处理器中被标记为‘不计划修复’。曙光一号将修复此漏洞。修复方案:在延迟槽填充逻辑中增加一级地址比较器,检测跳转目标地址冲突并自动重填。”他把这份报告单独抽出来放在林知夏的工位上,然后在自己的终端前继续跑下一轮测试。

老钱从版图台前抬起头,推了推滑到鼻尖的眼镜,看着梁工工位上那几本越来越厚的验证日志。他说他在德州仪器画版图时,每改一处走线都要重新跑一遍时序仿真,但仿真工具是公司内部开发的,源代码从不公开,出了问题只能找仿真组的人来排查,排查完他们也不会告诉你原因。这里连仿真工具都是自己写的——从指令生成器到结果比对,每一行代码都摆在明处,每一处错误都能追溯到源代码的某一行。他说这是他职业生涯中第一次拥有一套完全透明的验证环境。

方洁瑛从设计工作室过来,把一只新搪瓷缸放在梁工工位旁边。这只缸子是她从仓库里翻出来的,缸身外侧的红字已经磨得只剩轮廓,内壁用细砂纸打磨得光滑如新——和福伯当年递给刚从宝安回来的李家港的那只搪瓷缸用的是同一批老货。她对福伯说这口缸子的口径比林知夏用的那口稍大一些,可以装更多茶,适合那些需要长时间连续工作的人。福伯听了没有多说什么,只是往新缸子里泡了一壶刚煮好的普洱茶,把缸子端到实验室门口,放在梁工工位旁边,然后转身回传达室继续接电话。

实验室里的灯光一直亮到深夜。窗外九龙塘的雨还在下,紫荆树的枝叶在风雨中轻轻摇晃,花瓣被雨水打落在窗台上积了薄薄一层。梁工把仿真环境跑完第一轮全指令覆盖测试后,从打印机里扯出厚厚一叠测试报告逐页翻看,最后在报告封面上用红笔画了一个勾。他放下笔端起那只搪瓷缸喝了一口已经凉透的茶——陈皮的苦香在喉底慢慢回甘,和他在硅谷那间出租公寓里喝的黑咖啡完全不同。他对着窗外被雨水模糊的夜色看了一会儿,想起他在硅谷最后一天离开办公室时,把那幅从公司内部刊物上剪下来的漫画塞进了纸箱最底层。现在那幅漫画正压在新工位抽屉最里面,和那张被他用图钉按在墙上的方框图隔着一台终端的距离。他把搪瓷缸放回桌上,打开终端继续写下一轮测试的脚本——他要开始为曙光一号搭建一套专门针对数据依赖指令的压力测试方案,那是他在飞机上反复推演了好几个小时的算法框架,现在终于可以一行一行地敲进键盘里了。