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正常。”
吳國華看著萬用表:“遠端電壓,近端,壓差在規格內。”
呂辰在本子上記了一組資料,然後說:“熱切換測試。鄭老師,拔一塊電源板。”
鄭長楓走到機櫃側面,伸手按住第二塊電源抽屜的鎖緊手柄,用力一扳。
鎖緊機構彈開。
他把抽屜往外拉出一截,金手指與背板插槽脫離的瞬間,機櫃前面板的一個黃色指示燈閃了一下,但綠色的“電源正常”燈沒有滅,系統也沒有重啟。
示波器螢幕上的波形跳了一下,又穩住了。
吳國華盯著螢幕:“切換時間約50毫秒,遠小於設計指標。”
鄭長楓把抽屜重新推回去,“咔嗒”一聲鎖緊,系統依然穩定執行。
陳茂林站在旁邊,雙手抱在胸前,表情看不出甚麼,但嘴角微微動了一下。
呂辰繼續:“電壓跌落測試。模擬一路供電從5V跌到4V。”
鄭長楓從工具臺上拿起一個可調電源,串聯在供電線路上,緩緩調低電壓。
示波器螢幕上的電平線開始下降,當跌到的時候,機櫃前面板的一個黃色指示燈亮了,緊接著另一路備用的電源指示燈亮起。
吳國華看著示波器的時間標尺:“切換時間約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
6 UNITS DETECTED.
CACHE COHERENCE PROTOCOL LOADED.
ADDREING TABLE
ECC ENABLED.
READY.
“驅動載入成功。”汪涵說。
“跑基礎讀寫。”呂辰說。
錢蘭在終端上敲了一組測試命令。
先寫後讀,地址遞增,資料模式全0、全1、交替5A、A5。
螢幕上每完成一組測試,就跳出一個綠色的“PASS”。
30組基礎測試,全部透過。
“寫入全部主存,隨機地址。”汪涵說。
這是第一道硬門檻,6臺機櫃的全部主存容量為28MB,在當時已是天文數字。
錢蘭敲了一個指令碼,終端機開始咔嗒咔嗒地響,探針矩陣一行一行地掃過二維卡。
機房裡的氣氛安靜了下來。所有人都在等。
三分鐘後,螢幕上跳出一行字:
WRITE COMPLETE. BYTES WRITTEN.
“讀回校驗。”
錢蘭敲了讀回命令。
又是一段漫長的等待。
螢幕上的字元開始滾動,每一行都是地址和資料比對的結果。
滾了大約兩分鐘,最後一行跳出來:
READ VERIFY COMPLETE. ALL DATA MATCHED. 0 ERRORS.
吳國華盯著那行字看了兩秒,肩膀微微鬆了一下。
鄭長楓在筆記本上記了一筆:“隨機讀寫,零錯誤。”
真正考驗儲存子系統的是跨子系統協同。
1月10日下午,第一輪和第二輪之間的協同測試:儲存+運算。
此時運算機櫃還沒有正式上架,但第一階段最小系統裡已經有一塊運算板在機櫃裡跑著。汪涵決定用那塊運算板做協同測試。
“從儲存讀取一個1024×1024的矩陣,做FFT,寫回儲存。”
這是一個典型的科學計算場景。
運算單元從儲存取資料,計算完再存回去。
路徑上任何問題都會暴露。
汪涵親自載入FFT微程式,那條微程式有三百多條指令,是向量計算庫裡最複雜的一個。
載入完成。
錢蘭敲了執行命令。
運算板上的指示燈開始閃爍。黃色的匯流排佔用燈閃得很快,綠色的執行燈一直亮著。儲存機櫃那邊的指示燈也在閃,讀寫的頻率很高,像某種急促的心跳。
三十秒後,螢幕上跳出一行字:
FFT COMPLETE. 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臺機櫃照得鋥亮,綠色的指示燈一排一排地亮著,像一座沉默的城市。