當前位置: 華文問答 > 數碼

本科階段能在FPGA上做一個CPU並執行自己寫的作業系統算什麽水平?

2020-03-07數碼

目前體系結構方向研究生在讀。我的本科畢設大致就是如此:

在FPGA上用Chisel寫了一個RISC-V RV32IMA的五級流水線CPU,帶分支預測/I$/D$/MMU,支持M/S/U-mode,可綜合,還做了個簡單的SoC

自己設計了一門系統程式語言,帶各種「高級語法特性」(其實全是語法糖),用C++和LLVM實作了它的編譯器

之後用這個程式語言寫了個能跑在SoC上的玩具作業系統(雖然最後跑在FPGA上的時候發現硬件部份有一些bug導致有一定概率崩掉,就嗯拖,現在也沒修完(逃

還寫了一系列裸機程式——比如俄羅斯方塊、投影片放映程式之類

我畢設答辯就是用自己搞的這套東西播放的投影片。

在自己搞的怪東西上播放投影片,當然顯視器不是自己做的(

事情可能得從更早的時候說起:

高中前我就會使用VB6開發一些桌面程式。高中的時候希望在自己的程式中添加「外掛程式」或者「指令碼」功能,於是開始研究手稿語言,進而得知還有「高級語言虛擬機器」這種東西。後來看了 @韋易笑 大大的這篇回答決定自己寫一個VM,於是接受建議看了幾眼ARM的指令手冊(巨長無比,當然不可能看得完)。16年的時候在知乎瘋狂看 @RednaxelaFX R大的各種回答,樂此不疲。

上了大學,我決定造一些和程式語言/VM/編譯器的輪子。先憑之前對ARM和x86的印象隨便設計了一些字節碼,然後寫了個VM。後來設計了個程式語言,跟著LLVM的Kaleidoscope教程寫了個簡單的編譯器前端,自由發揮搞了個SSA IR(但現在看來其中有很多問題),試圖做一個到VM字節碼的編譯器。不過因為當時還很菜,搞到最後實在進行不下去了,遂爛尾。

到上大二之前的一段時間內,我認為自己只適合搞搞編譯這類軟件的東西。大二接觸了數電、數邏、計組等課程,不得不去用Vivado搞一些能跑在FPGA上的玩意。於是數電大作業做了個FPGA上的Flappy Bird遊戲,大概長這樣,鳥和管子都是方塊:

極其抽象的Flappy Bird

當時的數電課程給同學們提供的指導非常少,只有一些板卡的手冊,Verilog相關的內容基本沒提。不過我還是在連阻塞/非阻塞賦值都沒太搞明白的情況下,和組員們一起硬著頭皮寫完了這個作業(這樣不好,小孩子不要學),給老師留下了深刻印象。

後來數碼邏輯課大作業做了個8-bit的單周期CPU,自己設計了指令系統,使得這個CPU是圖靈完備的。為了展示CPU的功能,我還在外面加了個簡單的顯示控制器,負責把CPU連著的某個地址空間的記憶體輸出到VGA。於是這個CPU可以畫一些圖形:

謝爾賓斯基(等腰)三角形

再然後數邏老師找到我,說有個比賽叫「龍芯杯」,就是那種很硬核的,要求參賽選手組隊造一個MIPS CPU,然後還得在上面跑作業系統的比賽。老師問我要不要參加,我覺得這我搞不了啊,我一個搞編譯的,怎麽到CPU比賽來了呢?不過思考過後,我當時和老師說,我可以參賽,但可能只負責軟件部份,硬件的內容讓其他同學來完成吧。

後來在學校待了一暑假打比賽,之前報名的十來個同學走得七七八八,算上我就剩四個人了。我一看,這特喵和說好的不一樣啊!於是只能自己隨便糊一個CPU了。好在初賽截止之前把所有功能測試都跑過了,效能測試也有成績,後來順利和隊友茍進決賽,決賽在上面移植了一個μC/OS,最終拿了個三等獎。當時的CPU專案:

不過有一說一,龍芯杯裏的巨佬太多了,當時去參賽的時候我就感到了陣陣威壓,氣氛有點悲涼肅殺,我被按在地上瘋狂摩擦,最後只能哭爹喊媽。題主如果想認識其他在FPGA上跑作業系統的巨佬,不妨去關註一下這個比賽。

大三的時候學了更多的專業必修和選修課,像是作業系統、編譯原理之類。我保持一貫的傳統,在所有的大作業上瘋狂整活。比如:

  • OS大作業,用自己搭建的環境代替學校提供的環境,完成了OS的全部實驗,修了一些內核bug,往裏面移植了個c4編譯器(其實並不難),還把環境封裝起來寫了個使用教程給學弟學妹們用。
  • 編譯大作業,手寫了個PL/0前端,然後用LLVM給它做了個後端(調API的事情,也不難)。
  • OOP大作業,基於SDL2用C++寫了個簡單的「遊戲引擎框架」,然後在上面開發了一個空戰遊戲。
  • 微機介面大作業,把實驗箱上所有的芯片和外設都調通了,然後設計了個能用上所有芯片的聲控遊戲,寫了1000多行組譯。
  • 諸如此類。

    大四要做畢設的時候決定整一波大的,於是提前聯系好老師,從CPU開始,到編譯器,再到作業系統,做了一個完整的電腦系統出來。當時是2020年,疫情原因只能悶在家裏,不過這反倒讓我更能專註在造輪子這件事上了。後來我就做出了文章開頭的那些專案。

    最後,要做到這些需要掌握什麽知識?

    我覺得相比知識, 興趣、決心和耐心 才是最重要的。有了興趣,你就會自己嘗試去網上了解相關知識。現在網上的教程一搜一大把,如果你真的能靜下心來跟著做的話,你最後總能做出一點成果的。有了決心,你就會真的去動手實踐,而不是幻想這些東西有多好做,或者有多難做,遲遲不肯動手。有了耐心,你就會在遇到bug和其他困難的時候用心思考,接著著手去解決他們,而不是半途而廢,最後留下遺憾。

    其次,在本科課程的大作業裏多整點狠活。這是為數不多可以將你的「瘋狂」想法付諸實踐的機會,並且如果做得好的話,這門課的成績至少不會差,而且還會讓老師們記住你。老師們一旦記住你,他們就可能會給你提供更多施展自己的機會,比如拉你參加比賽,拉你進實驗室,甚至是介紹實習和工作。

    祝題主最後也能成為那個在自己的CPU上,跑自己的OS的人。