不管是設計數字電路還是軟體,每增加一個變數,每增加一個功能,test cases的數量往往是指數增長(終於找到軟硬體設計的共同點了??)。這造成數字電路開發的一大難題,即驗證(design verification,簡稱DV)太耗時。一般晶元大廠DV攻城獅的數量大於邏輯設計攻城獅(當然,也有極個別廠讓邏輯設計攻城獅自己做驗證的,在此先不點名)。

你經過DV的工位,發現他們竟然也在敲代碼,而且進化到了像是C++的語言。那叫UVM(Universal Verification Methodology)。UVM嚴格說來並不是一個語言,而是一個庫,它提供了各種class來幫助DV提高測試代碼的重複利用率,簡化測試設計。這就像有了TensorFlow等等庫之後,多數碼工不用再關心下面的SGD。據說UVM一開始是為不懂C++的硬體攻城獅設計的,而對於已經學了C++的人,第一眼看到UVM的時候,感覺猶如梅超風看到歐陽鋒練的九陰真經(不好意思梅姐,我假設您能看到歐陽鋒練的九陰真經)。我曾經見過一個UVM的class,它的寫法像是一個CNN能給自己產生訓練集。

扯得有點遠了。Anyways,DV之所以要用看起來高級那麼一點點的UVM,是因為他們確實有太多的測試需要寫了,而正巧測試代碼不用做到晶元上。STE同學們會說,我們也是啊。但是,寫測試只是DV工作的比較小的一部分。寫完測試之後就是模擬。說起模擬,就一個字:「漫長的等待」。有多慢呢?公平滴說,模擬的速度取決於設計的複雜度(跟代碼質量也有關,又找到一個軟硬體的共同點了??)。對於一個中等大小的晶元,模擬的速度可能是一秒鐘跑100到1000個時鐘周期。為了不過分曝露年齡,咱們用1986年推出的80386 CPU做個比較(實在是抱歉,如果嚇到90後和00後小朋友們了),它能一秒鐘跑幾千萬個時鐘周期。所以碼工同學們,請想像一下,把你們的計算機換成33年前的產品,再把速度降低一萬倍,然後在上面測試一下人臉識別是什麼感覺?(不要笑,去問問那些現在正在做XXU驗證的DV攻城獅,他們有人在這樣跑CNN。)

碼工同學會問,都幾十年了,你們為啥不想辦法加快一下模擬?先小聲提醒一下,這個問題最好是去請教為晶元行業寫模擬軟體的碼工同學們(他們那兩三個廠最近幾天熱度比較高)。其實辦法還真的是想了,而且想了不少辦法。前面說的模擬是基於RTL的模擬。比它更高級一點的是SystemC,一種C++寫的庫,可以在更高的抽象層來模仿硬體邏輯。甚至還有直接用C來模擬數字電路的(回憶一下前一篇提到的多線程、while循環,真的是可以這麼做的)。然而,越是高級的模型,跟下面的電路在細節上的差別就越大,因而越容易漏掉一些bug。各種權衡之下,在晶元設計的不同階段會跑不同形式的模擬。這相當於增加了DV的工作量,因為各種測試又得重寫。

加快模擬還有一個辦法,就是用晶元來模擬晶元,這叫emulation。有一些晶元並不是那麼「硬」,比如FPGA,上面有很多基本電路單元,電路單元之間的邏輯連接是可以被反覆重構的,因此可以在邏輯上構建一個跟你設計的晶元具有相同功能的晶元。然而,因為FPGA上有大量資源被用來做重構,可以用來做邏輯的資源就比較有限,所以當你的晶元設計大到一定程度,一塊FPGA就裝不下了。碼工同學說,這好辦,學習一下我們的MapReduce。是的,emulation就是這麼乾的。一個emulator裡面有多塊FPGA,可以把晶元設計拆分之後放上去。跟MapReduce也有瓶頸一樣,FPGA跟FPGA之間通信的速度極大地限制了emulation的速度。如果運氣好,emulation能跑到每秒鐘百萬個時鐘周期,快趕上33年前的CPU了。然而,那只是emulation光鮮亮麗的一面。那個重構的過程動輒需要花十幾個小時甚至更長時間。另外,碼工同學改一行代碼,一般只需要重新編譯那行代碼所在的文件,但是邏輯設計改一行代碼,整個FPGA需要重構一遍??(也有人在嘗試partially重構,但目前似乎還沒有大規模使用,而且速度也還是遠遠落後於重新編譯一個C文件)。

另外,emulation發現了bug怎麼辦?FPGA上面沒有printf,只有一個類似於fprintf的東西,且不是你想print什麼就能print什麼,只能dump出一些邏輯節點上的波形。更悲催的是,這一dump,emulation速度立馬掉十倍甚至幾十倍。因為數據量往往很大(為什麼大?我們等於是在用33年前的CPU模擬今天的CPU,而今天的CPU一秒鐘能輕鬆跑出十億個時鐘周期,dump其中一段就很多了),所以還得再花幾個小時把它轉換成攻城獅可以看的格式。轉換好的波形就跟中學物理老師的示波器上的波形差不多,但是數字電路的信號非常多,等於是說在教室里擺幾十上百個示波器一起看。Debug一個227x227x3的圖像輸出(Alex老師拿到之後是輸入),攻城獅們可能就得花一晚上甚至幾天時間好好研究這幾十上百個示波器上的無數0和1(下圖僅供參考)。

(未完待續)

作者聲明:

  1. 題圖和文末波形圖引用於網路,版權歸原作者所有。
  2. 本文為作者個人興趣之作,僅代表作者個人觀點,與任何公司或機構無關。
  3. 歡迎討論。如需轉載,請務必取得作者同意,並註明出處。

推薦閱讀:

相关文章