作者 | 包雲崗

責編 | 伍杏玲

本文經作者授權轉載自包雲崗知乎

【編者按】近日,中國科學院大學五位本科生的硬核“畢業證”引發IT圈熱議,在“一生一芯”培養計劃下,由五位2016級本科生主導完成一款64位RISC-V處理器SoC芯片設計並實現流片,命名爲“果殼(NutShell)”。該款芯片成功運行Linux操作系統以及學生自己編寫的國科大教學操作系統UCAS-Core。

6 月 2 日, “一生一芯”團隊學生代表向中國科學院大學畢業答辯委員會演示處理器芯片的功能,交出這份超預期的本科畢業設計“答卷”,實現帶着自己設計的處理器芯片畢業目標。目前該話題在知乎上已有超百萬瀏覽:

筆者曾在《 我在做開源芯片 有幸採訪過該計劃負責人、 中科院計算所研究員包雲崗 ,這幾年來他帶領團隊研究開源芯片,欲嘗試用開源思路改變中國芯片被“掐脖子”的局面,“一生一芯”則是關鍵的計劃之一,下面由包雲崗親自闡述這個用代碼照亮未來的故事:

醞釀

2018年11月8日,烏鎮,世界互聯網大會,經過9個月籌備工作,中國開發指令生態(RISC-V)聯盟正式成立。

晚上在烏鎮的一家餐館慶祝時,坐在我邊上的一位老師問了個問題:“以後打算怎麼做開源芯片生態?”其實這也是在2018年期間我經常問自己的一個問題,我有一個很粗的想法——能不能讓學生參與到開源芯片生態建設中——經常會浮現出來。

聽了那位老師的問題,我在腦海中又浮現出這個想法, 然後就在飯桌上一邊整理思路一邊介紹如何將教學和開源芯片結合起來。這應該是“一生一芯”計劃的最初萌芽。        

那時還沒想到“一生一芯”這個名字,但已經大致形成了這樣的目標——讓本科生也能做處理器芯片,讓本科生能帶着自己設計的處理器芯片畢業。但聯盟成立後,這個想法並沒有實質性推動。

2019年5月16日華爲被美國列入實體名單,全國震驚。各界都在想能爲華爲做些什麼,我們也在思考。

但是,我們是做開源芯片,華爲暫時還用不上;我們採用的是開放的RISC-V指令集,而華爲的主力芯片都是基於ARM。看起來我們是無法幫助華爲解決燃眉之急了。

但和華爲專家交流後,他們說短期內的需求華爲自己基本能應對, 他們更需要的是中長期的先進技術,而最需要的是處理器芯片設計人才。 因爲華爲的芯片架構設計團隊很多在美國硅谷,由於美國的出口管制,雖然是華爲的全資子公司,但其技術也不能輸入到華爲總部。這導致華爲在美國的芯片設計人才不能再發揮作用,但在國內又招不到這樣的人才。這纔是華爲的心腹之患。

華爲在國內找不到處理器芯片設計人才的情況是在意料之中。2017年,我曾安排組裏的學生統計過2008~2017十年的體系結構頂級會議ISCA論文第一作者的情況,最後 統計數據發現這些優秀人才 85%選擇在美國就業,僅有 4%在中國就業,差距巨大 。這和國內很多大學不開展處理器芯片設計相關教學與研究密切相關。

事實上,類似的人才危機美國也曾經歷過,1982 年全美上千所大學中只有不到100 位教授和學生從事半導體相關的研究 。爲了應對人才危機,美國國防部高級研究計劃署 (DARPA) 在1981年啓動MOSIS 項目,爲大學提供流片服務,通過MPW模式大幅降低芯片設計門檻。 30 餘年來MOSIS爲大學和研究機構流了60000多款芯片,培養了數萬名學生。

由此可見, 降低芯片設計門檻,讓學生能設計自己的芯片並流片,可大幅提高人才培養效率。這和我此前的構想和目標完全一致。我們不能再耽誤了,要加速人才培養計劃。

正式啓動

我自作主張地給這個計劃起了個名字: “一生一芯”。初衷是希望有一天能讓每一個學生都能帶着自己設計的芯片畢業 ,不管未來是不是真得能實現,這至少聽起來是一個美好的理想,而且還有一點爛漫——後來很多人聽到這個名字,第一印象大多是“一輩子做一顆芯片”。還有女生有更浪漫地理解:“一生一心一意愛一人”。不管如何,看來大家對這個名字似乎還都不反感。

然後,我又聯繫了幾位國科大本科生,詢問他們願不願意參加這個“一生一芯”計劃當小白鼠。出於意料地是, 這些準00後(98/99出生)都表示願意挑戰一下,願意當小白鼠。

6月20日,我在開源芯片工作組羣向大家宣佈:啓動“一生一芯”計劃!這並不是研製產品級芯片,而是一次教學實踐。很快唐丹老師爲未來的芯片起好了內部代號“COOSCA”,三門課Computer Organization/Operating System/Computer Architecture的縮寫。

隨後開始組建教學團隊,隨着項目的進行教學團隊也在不斷擴大:唐丹老師和工程師劉彤負責SoC架構設計指導,餘子濠老師負責處理器核設計(其實子濠還是博士生,但因爲在國內計算機系統教學領域很有名,所以我們也半開玩笑地叫他老師),張科老師負責項目協調、與國科大對接,並和常軼松老師、趙然老師一起在FPGA模擬仿真方面進行指導,解壁偉老師和李嶧工程師在後端物理設計上給予支持,深圳大學蔡曄老師則參與幫助設計PCB板卡,另外蔣德鈞老師和王卅老師是國科大本科操作系統任課老師,在操作系統方面給予支持,兩位博士生王誨喆與徐易難也擔任起助教的角色,幫助答疑解惑。而 我自己,則更像是一個啦啦隊長,給大家打雞血。 

       

教學團隊開始行動起來了,大家討論制定總體方案,確定技術路線,選擇基礎平臺,搭建開發環境,選擇流片工藝和班車……參加首期“一生一芯”計劃的同學也最終確定,一共有五位,他們是金越、王華強、王凱帆、張林雋和張紫飛。這五位同學通過了計算所暑期夏令營面試,均被錄取爲計算所研究生,其中金越導師是陳明宇研究員,王華強導師是蔣德鈞副研究員,王凱帆是孫凝暉院士,張林雋和張紫飛的導師則是我。但接下來的時間,他們將組成一個團隊,一起挑戰帶着自己設計的處理器芯片畢業這個任務。

8月20日,當唐丹老師和解壁偉老師終於落實中芯國際110nm工藝的流片渠道後,“一生一芯”計劃一切準備就緒。

8月27日,參加“一生一芯”計劃的首批五位同學和教學團隊一起在我的辦公室開了一次簡單但意義重大的動員大會。“一生一芯”計劃正式啓動!

四個月高強度開發

開弓沒有回頭箭。唐丹老師確定了最合適的流片班車是12月17日,距離動員大會不到4個月!這樣芯片能在4月份完成封裝,返回進行測試。如果一切順利,那就可以趕上五月底或六月初的國科大本科畢業答辯,到時可以在答辯現場展示芯片。但是如果錯過這趟班車,那就需要再等2個月趕下一趟班車,這就意味着芯片不可能在畢業答辯時返回。 “一生一芯”團隊需要跟時間賽跑。

我們在確定總體方案時有兩個決定:

一是用Chisel開發,此前我們實驗室做過Chisel與Verilog在開發效率和開發質量上的對比實驗,證明Chisel能數倍替身開發速度,同時開發質量不比Verilog差,相關結果發表在論文《芯片敏捷開發實踐:標籤化RISC-V》。

二是以餘子濠爲南大開發的一款教學RISC-V處理器核爲基礎進行改進,這主要是因爲餘子濠在開發這款處理器的過程中構建了豐富的工具,包括NEMU軟件模擬器、指令差分測試框架等,這些都有助於加速開發。而教學處理器功能還很基礎,要能運行Linux並且支持流片,需要新增大量新功能,包括RV64IM/RVC/RVA等指令擴展、時鐘中斷、硬件填充的TLB、M/S/U特權級、缺頁異常、Cache預取、SDRAM控制器、外圍I/O設備……這是一種貼近實戰的開發模式——實際的產品研發和科研工作中,往往不是總是從頭開始,更多的是在已有的基礎上,增加新的功能,提高性能等等。這就需要培養學生“理解-消化-創新”的能力。

接下來是4個月高強度的開發,然而有些關鍵模塊的工作原理是課堂上沒有介紹過的,同學們還需要進行一些探索性的嘗試,有時甚至需要將此前的設計推倒重來,他們會因此感到焦慮或沮喪,這對他們的心態也是很大的考驗 。教學團隊不僅僅需要給予技術指導,還需要對學生的心態進行正確的引導,告訴他們不確定性是探索過程中的客觀規律,然後引導他們去總結探索失敗的經驗,去深刻地分析當前方案不可行的原因,從而加深對問題的理解,讓他們正確認識到探索失敗的意義。

雖然任務極具挑戰,但不斷有進展。每取得一個小里程碑,大家都會記錄下那個時刻,精確到分鐘,因爲覺得未來有一天也許用得上。後來,這些時刻真的用上了,就是宣傳視頻中的那條時間線。這個過程中,國科大各方給了很大的支持,從校領導到本科部、計算機學院各級都很關心和重視;在中科院計算所,所長孫凝暉院士、主管教學的陳熙霖副所長、教育處李琳老師等都給予全方位的保障與支持。這也賦予了“一生一芯”團隊某種使命感,更激發了大家的鬥志。

12月19日,COOSCA 1.0芯片版圖凍結。當唐丹老師告知版圖已經正式提交,大家就如高考交卷,終於舒了一口氣,卻又懸起了一顆心。

疫情中的測試驗證

等待芯片返回是一種既期盼又擔憂的感覺。這種感覺又進一步被突如其來的疫情放大了。當1月23日宣佈武漢封城後疫情不斷發展,我們也越來越擔憂正在流片中的那顆COOSCA芯片還能不能按時回來,還能不能趕上畢業答辯。出乎意外的是芯片基本按照預期時間返回了,在這裏我們要對中芯國際和封測企業的員工們表達深深的敬意!

然而疫情還是對測試工作產生了影響,因爲學生不能返校,無法到在現場調試與測試。餘子濠、蔡曄和劉彤三位挺身而出,協助調試測試工作。 測試驗證工作其實也是非常具有挑戰性,因爲從底層PCB版圖、內存顆粒到中間處理器設計、到上層操作系統、應用軟件,每個層次都可能出問題。哪怕一個小問題,都會造成芯片無法正常工作。

經過大約1個月的調試測試,終於證明芯片一切正常,可以啓動Linux操作系統。但也發現了芯片的I/O模塊存在Bug,影響了SD卡的讀寫。測試驗證也是充滿了戲劇性。一開始調試時比較保守,將芯片降到了50MHz,沒想到系統出現了很多問題。後來把芯片頻率從50MHz跳到了200MHz,結果原來很多問題都消失了,能穩定地運行Linux。又進一步把頻率提高到了350MHz,啓動Linux出現了問題,但是可以穩定地運行RT-Thread。這個頻率和後端仿真基本一致。這也驗證了用Chisel開發和Verilog開發對後端物理設計並沒有很大的影響。       

      

畢業答辯演示

2020年6月2日,國科大本科生畢業設計答辯日。五位同學分別介紹了他們基於COOSCA處理器核的進一步優化工作:

  • 王華強:《基於RISC-V的亂序多發射處理器設計》

  • 張紫飛:《基於RISC-V的向量處理單元設計》

  • 張林雋:《開源處理器分支預測器的設計與性能優化》

  • 金越:《基於敏捷開發語言的開源處理器非阻塞緩存的設計與實現》

  • 王凱帆:《RISC-V平臺下的二進制翻譯與優化》

其中王凱帆的畢業設計中使用了COOSCA核,也是他們自己設計的核首次在科研中得到應用。 

王華強同學代表“一生一芯”團隊展示了COOSCA芯片的功能。他進一步又將這個核改進爲亂序多發射,在FPGA上進行了測試驗證,結果顯示比COOSCA核的IPC提升了一倍。他的畢業設計也獲得了國科大校級優秀畢業設計。 

五位本科生,實現了帶着自己設計的處理器芯片畢業這個目標!

後來,王凱帆又將國科大操作系統課程上同學們自己編寫的UCAS-Core移植到了COOSCA核上,實現了用自己寫的CPU運行自己寫的操作系統這個小目標。

“果殼”公開亮相

CRVA聯盟將於7月18日召開RISC-V年中技術研討會,“一生一芯”團隊決定讓王華強提交一份設計報告,正式向社區介紹COOSCA核的設計。提交前,大家覺得COOSCA是一個內部代號,現在要公開亮相了,應該有個正式一點的名字。同學們討論後,決定改名爲“果殼(NutShell)”,和國科大的“國科”同音。可以看得出來,他們對國科大確實有些深厚的情感。

五位同學開始一起爲“果殼”的首次亮相做了大量準備工作:王凱帆整理了代碼以及相應的文檔,並在GitHub上開源,王華強整理了一份介紹“果殼”設計的報告PPT。7月18日,王華強在技術研討會第二個出場,介紹了果殼的設計細節和一些開發過程中的經驗體會。

果殼”設計開源鏈接:https://github.com/OSCPU/NutShell

7月22日,王華強又收到了“果殼”被RISC-V Global Forum被接收的通知。9月3日,王華強同學將代表團隊向全球業界介紹“果殼”的設計,這也是“果殼”首次在國際舞臺上亮相。看了一下這次RISC-V全球論壇的日程,報告均來自世界各地的業界資深專家,還包括圖靈獎得主David Patterson教授。國科大本科生能登上RISC-V全球論壇介紹他們設計的處理器核,這在國際上也是非常難得了。作爲教學團隊成員,我們內心也有一份自豪。

 

收穫與體會

我們在調研中發現和“一生一芯”計劃目標最接近的是2017年春季開始UC Berkeley開了一門新課  EE194/290C “28nm SoC for IoT”,目標是設計一個SoC芯片,集成各種IP模塊,包括一個Berkeley開發的RISC-V Rocket處理器核。這門課以流片爲目標,2017年春由9位本科生與1位研究生參加,通過1學期完成了流片,但未提供信息證明芯片能正常工作。

伯克利EE194/290C這門課是根據已有的RISC-V核和其他IP核進行SoC集成。而“一生一芯”與EE194/290C課程的區別在於要讓本科生直接設計一款64位RISC-V處理器,然後在這個核的基礎上,學生們需進一步集成與驗證一系列外圍IP,最終形成一個能運行Linux操作系統的SoC芯片,這極具挑戰。

一年前,我們不知道這個目標是不是可行,最終能不能成功。但如今,我們探了迴路,並且把路走通了,證明是可行的。這個摸索的過程積累了不少經驗,也充滿了教訓。五位同學作爲小白鼠參與首期“一生一芯”計劃,成長了很多。他們不僅在項目中掌握了處理器芯片設計所需的專業知識,也鍛煉出了優秀人才所具備的出色心理素質。一起來看看他們的感悟:

如今,這五位同學正在參與一個更有挑戰的項目,開發一款高性能亂序多發射RISC-V處理器核的設計。

一年前,他們在做“果殼”時還有些喫力,現在已是這個新團隊中的骨幹,和其他博士生和工程師們一起攻堅克難。去掉團隊中蔡曄、唐丹和我這三位40歲以上的中年人,這支隊伍平均年齡只有23.1歲,但他們表現出來的戰鬥力卻是驚人的——不到三個星期就從頭開始完成了亂序處理器主流水線的設計與實現,並且通過CoreMark測試。

等到他們30歲時,就可以說已經是處理器芯片和計算機系統設計領域的“老兵”了。那時,他們將進入各自的工作崗位,也許去工業界研發產品,也許在學術界做科研。相信那時他們的創造力會得到更大的發揮和展現。我對這批年輕人的未來充滿期待。

       

從教學團隊角度來看,除了前期在總體方案、環境平臺等方面需做好充分準備以外,在開發過程中有四方面指導尤其重要(以下爲餘子濠老師總結):

  1. 項目規劃和分工 。學生在開發初期不一定能完全掌握芯片中各個模塊之前的關係,此時需要教師對學生的工作進行較爲細緻的分工,讓學生通過一些初期的任務來認識芯片的全貌。隨着項目的進行,學生對芯片的認識逐漸清晰之後,教師進行的分工可以向粗略的方向轉變,向學生提出清晰的任務目標,並讓學生嘗試提出自己的解決方案。

  2. 導學生了解項目中的每一處細節。 芯片是一個複雜的系統,學生需對芯片每一個模塊的行爲都有所瞭解,還需要了解程序在芯片上運行的每一處細節。但是學生一開始往往不能從課程設計的模式中轉變過來,認爲只需要瞭解自己任務相關的模塊即可,不去主動了解其它模塊,不去了解軟件層次的行爲。這導致他們在遇到問題會想不出解決的思路。此時教師需要對學生進行引導,讓他們主動去認識芯片甚至是軟件行爲的每一處細節。在遇到困難的時候,這些認識就會成爲解決問題的線索,順着線索去追溯問題的過程又會進一步加深學生對這些認識的理解,從而形成良性循環。

  3. 指導學生使用在課堂學習的知識解決開發中遇到的實際問題。 芯片開發過程中可能會遇到各種困難,一些表面上看像是硬件設計的問題,最終可能是軟件配置錯誤造成的。解決這些困難需要學生站在全局的視角來分析問題,並與課堂上學習到的知識建立聯繫,從中尋找解決問題的可能性。教師需要引導學生根據觀測到的現象進行思維的發散,主動思考可能與哪些學過的知識建立聯繫。如果學生面對一些比較困難的問題,也會需要教師進行點撥。

  4. 引導學生正確認識探索過程中的不確定性。 在一款功能完整的芯片,有一些關鍵模塊的原理是課堂上沒有詳細介紹的,學生要正確地實現這些模塊,需要一個探索的過程。這意味着學生不能像課程作業那樣按部就班地完成,而是會經歷設計方案的調整,甚至是整個方案的推倒重來。這容易導致學生感到焦慮或沮喪,因此教師需要對學生的心態進行正確的引導,告訴他們不確定性是探索過程中的客觀規律,然後引導學生去總結探索失敗的經驗,去深刻地分析當前方案不可行的原因,從而加深對問題的理解,讓學生正確認識到探索失敗的意義。

來源:

https://www.zhihu.com/question/409298856/answer/1363569013

更多推薦閱讀

相關文章