1月5日,清晨七点半。
计算机所机房门口,陈茂林已经站在那儿了,手里端着一个搪瓷缸子,缸子上的红字“抓革命促生产”被磨得只剩一半。
他今天穿了一件洗得发白的军便装,领口的扣子系得严严实实,头发梳得一丝不苟。
机房的门敞开着,里面传来暖通空调的低频嗡鸣。
吕辰到的时候,汪涵教授已经坐在了临时搬进来的长条桌旁,面前摊着那个黑皮本子,本子上密密麻麻写满了微程序清单。
他抬头看了吕辰一眼,没说话,又低下头继续写。
吴国华蹲在第一排机柜后面,万用表的表笔点在接地铜排上。
郑长枫站在他旁边,手里拿着一个文件夹,翻到空白页,铅笔夹在耳朵上。
秦无功从机房深处走出来,手里拎着一个水平仪,朝吕辰点了点头:“吕工,35台机柜全部就位,接地、供电、散热都确认过了。”
吕辰把帆布包放在长条桌上,看了一眼墙上新挂的那张“软硬件接口对照表”。
那是一张足有两米宽的白纸,上面画着一张巨大的表格,横轴是五大子系统。
电源、存储、I/o、运算、主控,纵轴是几百个接口项,每个格子都空着,等着被填满绿色的勾。
八点整,人齐了。
陈茂林敲了敲桌子。
“第二阶段,今天开始。”他开门见山,“第一阶段最小系统跑通了,证明能活。第二阶段要让它能跑、能算、能扛。35台机柜,五大子系统,25天之内,全部上架。”
他拿起一根粉笔,在黑板上画了一条时间线。
“1月5日到7日,第一轮,电源机柜,3台满配。”
“1月8日到11日,第二轮,存储机柜,6台满配。”
“1月12日到15日,第三轮,I/o机柜,2台满配。”
“1月16日到30日,第四轮,运算机柜21台加第二台主控机柜。”
“每轮之间,必须做跨子系统协同测试。软硬件接口对照表,完成一项打一个勾。谁有问题,现在说。”
没有人说话。
陈茂林点了点头,看向汪涵教授:“汪教授,微程序准备得怎么样了?”
汪涵翻开本子,念了一组数字:“电源管理微程序已就位,23条,覆盖电压监测、过压过流保护、热切换逻辑。存储控制器驱动正在做最后验证,预计明天完成。I/o通信协议栈还有两个bug,今天上午能改完。”他把本子合上,“软件不会拖硬件后腿。”
陈茂林又看向吕辰。
吕辰站起身:“陈工,电源机柜3台满配,冗余热切换,拔板不重启,电压跌落,备用电源0.1秒接管。今天是1月5日,宇文工、万工已驻红星厂把关,抽屉九点送达,第一轮电源上架。国华、郑老师和我上机柜。”
汪涵也站起身:“电源管理微程序今天必须在线,知南回院里守着,小钱跟我。”
上午九点,电源机柜的抽屉被押送到机房门口。
吕辰戴好白手套,打开货厢,从货架上抽出第一个抽屉。
那是电源机柜的主电源抽屉,550毫米超深型,比标准抽屉重了一倍不止。
里面集成了整流桥、滤波电容、dc-dc变换器和过压过流保护电路,板卡上密密麻麻焊着上百颗元件。
他双手托住抽屉底部,对准机柜插槽两侧的导轨,慢慢推进去。
滚珠导轨发出细微的、均匀的声响。
推到一半的时候,他停了一下,检查金手指和背板插槽的对位,确认无误,继续推进。
“咔嗒。”
锁紧机构弹起。第一个抽屉就位。
郑长枫、吴国华跟着动手。
然后是第二个、第三个……
每台电源机柜配了6个抽屉,3台一共18个抽屉。
推完最后一个,吕辰退后一步,额头上已经渗出了一层细汗。
开始检测。
吴国华蹲在机柜后面,手里拿着示波器的探头,夹在第一台电源机柜的远端测试点上。
郑长枫拿着万用表,蹲在旁边。
到了十点,所有检测通过。
“上电。”吕辰说。
郑长枫推上了第一台机柜的开关。
电磁接触器“嘭”地一声吸合。机柜前面板的绿色“电源正常”灯亮了,黄色的“待机”灯闪了两下,也稳住了。
示波器屏幕上跳出一个方波。
“+5V正常,纹波23毫伏。”吴国华报出数据。
“+12V正常,纹波25毫伏。”
“-12V正常。”
吴国华看着万用表:“远端电压4.88V,近端5.02V,压差在规格内。”
吕辰在本子上记了一组数据,然后说:“热切换测试。郑老师,拔一块电源板。”
郑长枫走到机柜侧面,伸手按住第二块电源抽屉的锁紧手柄,用力一扳。
锁紧机构弹开。
他把抽屉往外拉出一截,金手指与背板插槽脱离的瞬间,机柜前面板的一个黄色指示灯闪了一下,但绿色的“电源正常”灯没有灭,系统也没有重启。
示波器屏幕上的波形跳了一下,又稳住了。
吴国华盯着屏幕:“切换时间约50毫秒,远小于设计指标。”
郑长枫把抽屉重新推回去,“咔嗒”一声锁紧,系统依然稳定运行。
陈茂林站在旁边,双手抱在胸前,表情看不出什么,但嘴角微微动了一下。
吕辰继续:“电压跌落测试。模拟一路供电从5V跌到4V。”
郑长枫从工具台上拿起一个可调电源,串联在供电线路上,缓缓调低电压。
示波器屏幕上的电平线开始下降,当跌到4.2V的时候,机柜前面板的一个黄色指示灯亮了,紧接着另一路备用的电源指示灯亮起。
吴国华看着示波器的时间标尺:“切换时间约80毫秒,在0.1秒以内。”
“再测一次。”吕辰说。
郑长枫把电压调回正常,再重新跌落。
连续测试三次,每次切换时间都在70到90毫秒之间,全部达标。
陈茂林从兜里掏出烟,点了一根,吸了一口,没说话。
把最后一台电源机柜的测试数据记录完,吕辰直起腰,活动了一下僵硬的脖子。
“第一轮,三台电源机柜,热切换、电压跌落,全部通过。”
吕辰翻开本子,在第一轮任务下面写了一行字:“1月5日,电源机柜上架测试完成。”然后把本子递给陈茂林。
陈茂林看了一眼,签了字。
墙上的接口对照表,第一列“电源子系统”下面,三个格子被填上了绿色的勾。负责打勾的是秦无功,他用一支粗头的绿色记号笔,一笔一笔地涂,动作很慢,像是在完成某种仪式。
1月8日晨会,陈茂林开门见山。
“电源跑通了。第二轮,存储机柜,今天开始上架。汪教授,存储控制器驱动怎么样了?”
汪涵翻开本子:“昨天下午已经就位。缓存一致性协议微程序、Ecc纠错、地址映射,全部通过功能仿真。今天上午在模拟台上再跑一轮,中午之前可以加载到真机上。”
陈茂林点了点头,看向吕辰。
吕辰站起来,走到黑板前,在第二轮“存储机柜”下面写了几个字:
6台满配
Ecc纠错
单芯片故障屏蔽
“存储机柜6台,每台8个抽屉,每个抽屉8块板卡,每块板卡16颗存储芯片。今天上架3台,明天再上3台。上架完成后,先跑独立测试,然后做跨子系统协同。”
他顿了顿,又补了一句:“存储是整个系统的主存。它要是出问题,后面的运算都是空中楼阁。”
没有人质疑。
上午十点,存储抽屉到达机房。
存储机柜比电源机柜深一些,背板上的插槽更多。
抽屉是加深型450毫米,每个抽屉里装了8块存储子板,每块子板上16颗KL-SRAm芯片。
一个抽屉就是128颗芯片。
郑长枫把第一个存储抽屉推进插槽的时候,明显感觉阻力比电源抽屉大。
不是卡顿,是金手指与背板插槽的接触更紧密,插到底的时候能听到连续几声细微的“嗒嗒嗒”,那是多路信号同时接通的声音。
6台存储机柜,48个抽屉,特种车跑了6趟,整整装了两天。
到第二天下午四点半,最后一台机柜的最后一个抽屉锁紧,吕辰才直起腰,拧开保温杯灌了一大口凉茶。
吴国华和郑长枫又开启紧张的检查工作。
直到晚上八点,更换了一块有疑虑的板卡后,全面通过。
开始上电,郑长枫依次推上六台机柜的空气开关。
六台机柜的绿色指示灯依次亮起来,像一排被点燃的引信,从最左边传到最右边。
汪涵教授在终端上敲了一行命令,加载存储控制器驱动。
屏幕上开始滚过一行行绿色的字符:
StoRAGE coNtRoLLER INItIALIZING...
6 UNItS dEtEctEd.
cAchE cohERENcE pRotocoL LoAdEd.
AddRESS mAppING tAbLE INItIALIZEd.
Ecc ENAbLEd.
REAdY.
“驱动加载成功。”汪涵说。
“跑基础读写。”吕辰说。
钱兰在终端上敲了一组测试命令。
先写后读,地址递增,数据模式全0、全1、交替5A、A5。
屏幕上每完成一组测试,就跳出一个绿色的“pASS”。
30组基础测试,全部通过。
“写入全部主存,随机地址。”汪涵说。
这是第一道硬门槛,6台机柜的全部主存容量为28mb,在当时已是天文数字。
钱兰敲了一个脚本,终端机开始咔嗒咔嗒地响,探针矩阵一行一行地扫过二维卡。
机房里的气氛安静了下来。所有人都在等。
三分钟后,屏幕上跳出一行字:
wRItE pLEtE.
bYtES wRIttEN.
“读回校验。”
钱兰敲了读回命令。
又是一段漫长的等待。
屏幕上的字符开始滚动,每一行都是地址和数据比对的结果。
滚了大约两分钟,最后一行跳出来:
REAd VERIFY pLEtE. ALL dAtA mAtchEd. 0 ERRoRS.
吴国华盯着那行字看了两秒,肩膀微微松了一下。
郑长枫在笔记本上记了一笔:“随机读写,零错误。”
真正考验存储子系统的是跨子系统协同。
1月10日下午,第一轮和第二轮之间的协同测试:存储+运算。
此时运算机柜还没有正式上架,但第一阶段最小系统里已经有一块运算板在机柜里跑着。汪涵决定用那块运算板做协同测试。
“从存储读取一个1024x1024的矩阵,做FFt,写回存储。”
这是一个典型的科学计算场景。
运算单元从存储取数据,计算完再存回去。
路径上任何问题都会暴露。
汪涵亲自加载FFt微程序,那条微程序有三百多条指令,是向量计算库里最复杂的一个。
加载完成。
钱兰敲了运行命令。
运算板上的指示灯开始闪烁。黄色的总线占用灯闪得很快,绿色的运行灯一直亮着。存储机柜那边的指示灯也在闪,读写的频率很高,像某种急促的心跳。
三十秒后,屏幕上跳出一行字:
FFt pLEtE. dAtA VERIFIEd.
“比对一下原始数据和变换后的数据。”吕辰说。
钱兰又敲了一组命令。
屏幕上开始逐行比对,每一行都跳出一个绿色的“mAtch”。
滚了十几秒,最后一行:
ALL dAtA VERIFIEd. 0 ERRoRS.
汪涵靠在椅背上,把眼镜摘下来擦了擦。
他的手指在镜片上停了一下,像是在确认自己没有看错。
吕辰翻开本子,在“跨子系统协同:存储+运算”那一行写了两个字:通过。
秦无功拿着绿色记号笔走到接口对照表前,在“存储子系统”那一列下面,一口气打了六个勾。
第二轮测试中也不是一帆风顺。
1月11日上午,当第三台存储机柜上架后,系统出现了第一次重大故障。
总线死锁。
现象是:两个存储控制器同时向同一块内存区域发出读写请求,仲裁器没有处理好优先级,两条指令卡死在了总线上。系统不崩溃,但也无法继续执行。
示波器上能看到地址总线的电平卡在中间状态,既不归零也不跳变。
吴国华用逻辑分析仪抓了半个小时的波形,最后锁定在两组地址信号的重叠窗口。
“两个控制器同时申请同一个bank,仲裁器给的应答信号同时到达,谁也没等到对方的释放信号。”他用手指点着屏幕上的两条波形,“死锁了。”
钱兰听到这话立刻走到黑板前,画了一张仲裁状态转移图。
“现有的仲裁优先级是‘先来先服务’。如果两个请求同时到达,状态机没有定义这种情况,会进入一个非法状态。”她用粉笔在图上圈了一个圈,“这里,缺少一个‘同时到达’的处理分支。”
汪涵走过来看了看,点了点头:“微程序里加一条判断。两个请求同时到达时,默认给低地址bank的控制器优先级。不需要改硬件。”
他当场坐下,在终端上修改微程序,加了六个微指令,重新制作了二维卡,加载,重启。
死锁消失。
郑长枫重新跑了一遍28mb随机读写测试,全部通过。
吕辰在本子上记了一笔:“总线仲裁缺陷,微程序修复。已归档至故障模式库。”
墙上接口对照表的“存储仲裁”格子,被打上了一个绿勾,旁边用红笔标注了“已修复”。
1月12日下午,存储子系统独立测试全部完成。
六台机柜满配,Ecc纠错验证通过。
测试人员故意在写入数据后、读出前用信号发生器在总线上对某位进行单比特翻转,模拟存储单元软错误。
读回时屏幕上显示“ERR coRREctEd”,数据自动修复。
单芯片故障屏蔽测试:吴国华用镊子拔下一颗存储芯片。
诊断系统在0.3秒内报出故障板卡编号,七段数码管显示“06-03-02”,对应第六号机柜第三块板卡第二槽位。系统继续运行,没有死机,没有数据丢失。
陈茂林站在机柜前面,看着数码管上那串数字:“比指标快了0.2秒。”
吕辰点了点头。
汪涵合上笔记本,把《存储子系统联调报告》签了字,放在桌上。
报告很厚,足有30多页,记录了6台机柜、48个抽屉、6000多颗存储芯片的所有测试数据。
每一条数据后面都有测试人的签字。
陈茂林拿起报告翻了翻,没说话,把它递给了秦无功归档。
墙上的接口对照表,存储子系统那一列,十四个格子全部被打上了绿色的勾。
秦无功把最后一笔涂完,退后一步看了看,转身说:“第三轮,I/o,明天开始。”
吕辰看了一眼黑板上那条时间线。
1月12日,第二轮比计划提多用了一天。
他拿起粉笔,在“存储机柜”后面画了一个“+”。
窗外,天已经黑透了。
机房里的日光灯把35台机柜照得锃亮,绿色的指示灯一排一排地亮着,像一座沉默的城市。