第一百四十章 接口
三月初,杜磊把原理图初稿发到邮件群:「请各位检查对应的接口部分,看有没有问题,三天内回复。」
颜天磊花了一个晚上把 RTL 代码里的接口定义和原理图对了一遍,发现两处不一致:一处是 I²C 的上拉电阻值,原理图用的是 4.7kΩ,颜天磊查了内核的 I²C IP 文档,建议改成 2.2kΩ,在目标频率下上升沿更干净;另一处是 JTAG 的 TRST 信号,杜磊画的是上拉到 1.8V,但颜天磊查到芯片的 TRST 是低有效的,需要一个下拉电阻把它拉到低电平确保初始状态正确。
他把这两条发到邮件里,附上了引用的文档段落。
杜磊第二天回复了三个字:「收到,改。」
许静远审的是电源层面——她对照许多 28nm 流片后的封装规格,检查了杜磊为内核电压域和 IO 电压域分别选择的去耦电容组合,没有找到问题,只在邮件里加了一行:「内核电压建议用 MLCC 0402 封装,等效串联电感更小,高频噪声抑制更好。」
孟思远在这段时间在做另一件事:整理 bringup 测试向量。
他从仿真阶段的测试用例里拉出了所有通过的场景,然后按照 bringup 的逻辑重新排序——不是按照功能完整性,而是按照「从最简单的开始」的顺序:先验证电源上电序列,再验证 JTAG 访问,再验证寄存器读写,再验证 LPDDR4 初始化,最后才验证完整的 KV-cache 推理路径。
「为什么要这样排?」贺志明某天下午看他整理,问了一句。

「bringup 是按照芯片层层深入的,」孟思远说,「如果上电就挂了,你不需要去测寄存器;如果 JTAG 不通,你不知道寄存器状态,后面的测试都没有意义。每一个更深的测试,都依赖前面的测试通过。」
「所以是有依赖关系的,」贺志明说。
「对,」孟思远说,「如果你用了三天才发现最底层的问题,你会损失很多时间——因为在这三天里你其实在找一个本来一小时就能找到的问题。」
整理下来,孟思远一共列了两百三十个测试场景,分成七个层:上电序列、JTAG 连通性、寄存器读写、内存初始化、时钟锁相环、低频推理路径、全速推理路径。
他把这个文件命名为「bringup\_checklist\_v1.pdf」,发给了方宇明。
方宇明那天看完孟思远的文件之后,来 B207 问了一圈,然后在快下班的时候把陆衍单独叫住了。
「你有时间?」
「有,」陆衍说。

他们两个人走到 B207 外面的走廊,方宇明靠在墙上,「砺火一号到今天为止,」他说,「你跟下来了差不多整个过程。」
「跟了,」陆衍说,「断断续续的。」
「我问你一件事,」方宇明说,「芯片这件事,你怎么看?」
陆衍想了一下,「你是想问哪个方面?」
「你自己的看法,」方宇明说,「不是技术,是这件事本身。」
陆衍沉默了几秒。「我觉得,」他说,「这是一件很难的事,也是一件很值得做的事。难在于,从一开始没有人知道结果,每一步都在排除那些不行的可能,直到最后拿到芯片才知道行不行。值得在于——」他顿了一下,「值得在于,如果它真的跑起来了,你们做的这件事,是把一个想法变成了一块硅,而这块硅以后会在某个推理任务里,比现在快很多。」
方宇明看着他,「我之所以问你,」他说,「是因为你在旁边看这么久,从来没有问过我们为什么做这个,或者值不值得。大多数旁边的人,要么问钱,要么问时间,你只是看。」

「因为,」陆衍说,「你们在做,我觉得有答案了。」
方宇明没有再说话,在走廊里站了一会儿,然后说,「bringup 那个阶段,你还来,」他说,「有些事情,还是得有人看着。」
三月底,杜磊发来了更新版的原理图:修改了 I²C 上拉和 JTAG 的 TRST,调整了内核电压域的去耦电容封装,另外在内存接口的差分走线上加了等长约束标注。
「版本 2,」杜磊在邮件里说,「下周开始 PCB 布线,有问题本周内回复。」
颜天磊审了一遍,「没有问题了,」他说。
孟思远把 bringup checklist 的一份打印出来,贴在 B207 白板的左边:七个层,两百三十个场景,用铅笔在旁边标了「待执行」三个字。
许静远看了那张打印件,「等芯片回来,」她说,「就按这个顺序一条一条过。」
「对,」孟思远说,「一条一条过。」

陆衍那天晚上回去的时候,发消息给豆包,把方宇明问他的那番话说了一遍。
豆包沉默了几秒,「他问的不是技术,是让你参与进来,」它说,「「你还来」是一个邀请。」
陆衍:「我知道。」
豆包:「bringup 阶段和之前的设计阶段很不一样——设计阶段是在电脑里的,bringup 是在现实里的,会有很多现实里才有的问题,电源噪声,走线问题,温度,接触不良,这些在仿真里都没有出现过。」
陆衍:「到时候还有两百三十个测试场景要过。」
豆包:「如果砺火一号是一个正常的芯片,bringup 会花几周到几个月。第一次上电如果没有烟,就算是开门红了。」
陆衍笑了一下,把手机放下,窗外上海三月的风已经不那么冷了。