老石按:在傳統(tǒng)的數(shù)字芯片開發(fā)里,絕大多數(shù)設計者都會使用諸如Verilog、VHDL或者SystemVerilog的硬件描述語言(HDL)對電路的行為和功能進行建模。但是在香山處理器里,團隊選擇使用Chisel作為主要開發(fā)語言。這是基于怎樣的考慮?
Chisel是基于Scala這個函數(shù)式語言來擴展出來的,我們可以把它看做是一個用來描述電路的領域?qū)S谜Z言,它和Verilog還是有很大區(qū)別的。
事實上,我們自己也做過兩種語言的對比。在2016年,我們整個團隊開始決定用RISC-V去實現(xiàn)標簽化體系結(jié)構(gòu),也在那個時候開始接觸Chisel。最早的時候我們重用了UC伯克利開發(fā)了的名叫Rocket的開源內(nèi)核。這是個順序執(zhí)行的小核,我們在它上面加上了我們的標簽機制,這期間其實就有很多的一些開發(fā)體會。
Rocket chip generator的系統(tǒng)架構(gòu)圖
前面提到我們的同學原來對Verilog很熟,但是用Chisel以后就會有一種愛不釋手的感覺。有好多的通信,特別是年輕的同學,他們都愿意去嘗試使用Chisel。有一個北大的研究生,他在做報告的時候講,你用了Chisel以后就再也回不去了。
其實,我們自己還做過量化的評估。在2018年,我們團隊里有兩個本科生和一個工程師做過一個實驗。這個實驗是要開發(fā)一個L2 Cache,但是要集成到RISC-V的內(nèi)核里。我們的工程師是用Verilog來開發(fā)的,他對Cache非常熟悉。他把OpenSPARC里面的Cache、還有Xilinx提供的Cache等等都研究過,代碼都讀得很透。所以他用Verilog開發(fā),并且接到RISC-V里面去。當時他花了應該是6個星期開發(fā),包括測試框架等等,一共寫了5000多行代碼。即便這樣,后面還是有一些問題和Bug。
另外,我們當時有一位大四的本科生,現(xiàn)在也是香山的核心成員,他懂一些計算機體系結(jié)構(gòu),使用Chisel有9個月的時間。同樣的任務,他用Chisel開發(fā)只花了三天時間就寫出來了。把設計接到RISC-V核里面之后,還能夠正常工作。之后又進一步就把DMA調(diào)通了,就能夠支持像網(wǎng)卡這樣的一些DMA的數(shù)據(jù)的傳輸。這個給我們留下了很深刻的印象。
表格來源:《芯片敏捷開發(fā)實踐:標簽化RISC-V》
我們覺得,本科生使用Chisel做的設計,哪怕是性能或者各方面差了一些,但他只用了三天時間。這樣我們就可以快速去驗證,并且實現(xiàn)我們的想法。
當然這個只是第一組實驗。我們當時有一個群,在群里面吵的還是挺不可開交的,因為我們的工程師那個時候很不服氣,他就覺得他的代碼各方面都質(zhì)量更高。所以我們后來又有另外一位中國科學院大學的大四本科生,他懂Verilog、但是沒學過Chisel,所以他做的事情就是讀我們工程師的Verilog代碼,并把核心代碼一行一行翻譯成Chisel,最后要通過工程師寫的測試。也就是說,翻譯后的Chisel和Verilog實現(xiàn)的邏輯功能是完全一致的。
翻譯完之后,再在同一個FPGA上面評估,看設計的PPA、 頻率、功耗,還有使用的資源等等。這樣下來的話,你就會看到其實出來的指標上面,大多數(shù)的指標實際都是Chisel還反而更好一些,代碼量也會比他要小。
這還只是第一個階段。后面我們的本科生又在博士生的指導下,把Chisel里面的高級特性給它加進去,結(jié)果一下子就完全超越Verilog的版本了,代碼量大概只有Verilog的1/4~1/5,有些邏輯資源可以減少百分之六七十。所以那時候這組數(shù)據(jù)出來以后,工程師就他也覺得服氣了。
表格來源:《芯片敏捷開發(fā)實踐:標簽化RISC-V》
Chisel vs 高層次綜合
老石按:在FPGA里高層綜合是一個非常熱、非常流行的一個研究方向。但是我知道Chisel和高層次綜合可能并不是一回事。在Chisel官網(wǎng)上也明確的指出:我不是高層次綜合。但在我看來,它們背后的思維方式、或者是大的方向是有共同之處的,也就是讓硬件開發(fā)更加的快速、更加敏捷。也就是像您剛才說的,從想法到實現(xiàn),周期更加縮短。
但是從高層綜合的角度來看,雖然學術(shù)界一直在講高層次綜合已經(jīng)很多年的時間,它實際的商業(yè)化可能還是需要特別突破性的進展?,F(xiàn)在業(yè)界的這些設計,比如大的網(wǎng)絡設計、還有數(shù)據(jù)中心加速器的這些設計,仍然是基于SystemVerilog/Verilog/VHDL這樣的RTL語言。這主要是因為高層次綜合有這么幾個問題:
第一個就是HLS可能并不能覆蓋掉的全部應用領域,也就是說它可能適合于某些應用領域,但是對于這種吞吐量比較大的、或者高速數(shù)據(jù)包處理這些應用,它可能就不那么適合。
另外一個就是它的驗證。因為它相當于在RTL頂上加了一層額外的高層次語言,等它綜合或者處理完了以后,還是生成底層的RTL語言,然后再走原來的FPGA的這些開發(fā)流程。所以在驗證過程中,增加額外的這層可能會給驗證工作造成很大的問題。所以關于這兩點您怎么看?
我想其實它的通用性方面是沒有問題的。Chisel本身是一個硬件描述語言,所以從它的這種完備性來看的話,它跟Verilog是一樣的。也就是說,Verilog能干什么事,Chisel也能干什么事,這兩個是沒有什么區(qū)別的,它只不過是另外一種語法表達而已。
調(diào)試是很多人都擔心的一個問題。因為Chisel它現(xiàn)在其實是一個源到源的翻譯,是首先是基于Scala這套語法去寫一個硬件的描述。然后通過FIRRTL進行翻譯。再往后走的話,其實是用Verilog那套流程去做,最后生成GDSII版圖。
所以在這個過程當中,其實是明顯的分成兩個階段了。前面一個階段Chisel到Verilog,第二階段就是Verilog到GDSII版圖。
我們用Chisel已經(jīng)流過三顆芯片,有大的芯片、有的小的芯片,有單核的有8核的。在早期的時候,我們其實也遇到過這樣的一些問題。比如你用Chisel寫的代碼生成了Verilog,Verilog里面有一些變量,你那邊在Chisel里面改一行代碼,那它這個變量就全部重新改變。后來其實仔細分析以后,我們發(fā)現(xiàn)這些問題都是可以有一些辦法來解決的,或者說它不是阻礙可調(diào)試性的最根本的問題。所以后面我們在做香山的時候,我們在這些方面已經(jīng)處理得比較好了。
就像我們有同學,他自己開發(fā)了一個工具,可以把電路波形直接轉(zhuǎn)變成一個上層的高級的事件。這個時候他其實就用了Chisel和FIRRTL里面的特性。
因為FIRRTL它有點像LLVM,它可以放很多的這樣自己設計的模塊,F(xiàn)IRRTL也可以定義自己需要的功能。這個在LLVM里叫pass,在FIRTEL里叫transformer。
有了這些工具,就可以讓Chisel源碼和下面波形建立起聯(lián)系,讓調(diào)試的過程甚至比原來用Verilog還要方便。
除了這個工具,同學們還自定義和擴展了一些printf,讓我們在調(diào)的時候很多時候根本不用去看波形。這些都得益于Chisel的強大和開放。