国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

芯片敏捷開發(fā)實(shí)踐:標(biāo)簽化RISC-V

2019-02-20 03:38:04余子濠劉志剛李一葦黃博文孫凝暉包云崗
關(guān)鍵詞:指令集開源代碼

余子濠 劉志剛 李一葦 黃博文 王 卅 孫凝暉 包云崗

1(計(jì)算機(jī)體系結(jié)構(gòu)國(guó)家重點(diǎn)實(shí)驗(yàn)室(中國(guó)科學(xué)院計(jì)算技術(shù)研究所) 北京 100190)2(中國(guó)科學(xué)院大學(xué) 北京 100049)

芯片是信息技術(shù)的引擎,推動(dòng)著人類社會(huì)的數(shù)字化、信息化與智能化.隨著摩爾定律瀕臨終結(jié),維持芯片技術(shù)創(chuàng)新面臨挑戰(zhàn).開源芯片設(shè)計(jì)將是應(yīng)對(duì)挑戰(zhàn)的新思路.

如今芯片設(shè)計(jì)動(dòng)輒需要上億研發(fā)費(fèi)用、投入上百人年,而一旦流片失敗,將會(huì)浪費(fèi)巨大的成本,只有少數(shù)企業(yè)才能承擔(dān)相應(yīng)的風(fēng)險(xiǎn)[1].反觀互聯(lián)網(wǎng)領(lǐng)域通過開源軟件降低開發(fā)門檻,創(chuàng)造了繁榮的互聯(lián)網(wǎng)產(chǎn)業(yè).如果開源芯片設(shè)計(jì)能實(shí)現(xiàn)敏捷開發(fā),將芯片設(shè)計(jì)門檻降低幾個(gè)數(shù)量級(jí)——3~5人的小團(tuán)隊(duì)在3~4個(gè)月內(nèi),只需幾萬(wàn)元便能研制出一款有市場(chǎng)競(jìng)爭(zhēng)力的芯片,就可以大大降低芯片開發(fā)的成本和風(fēng)險(xiǎn),必將吸引大量人員投入芯片產(chǎn)業(yè),重塑繁榮.

加州大學(xué)伯克利分校設(shè)計(jì)的開放指令集RISC-V[2]朝著這個(gè)目標(biāo)邁出了第1步,它有望像開源軟件生態(tài)中的操作系統(tǒng)Linux那樣,成為計(jì)算機(jī)芯片與系統(tǒng)創(chuàng)新的基石.但為了實(shí)現(xiàn)芯片的敏捷開發(fā),只有RISC-V是遠(yuǎn)遠(yuǎn)不夠的,還需要一個(gè)能夠經(jīng)過流片驗(yàn)證的RISC-V SoC開源設(shè)計(jì),以及一門面向敏捷開發(fā)的硬件構(gòu)建語(yǔ)言[3].因此在推廣RISC-V的同時(shí),伯克利研究團(tuán)隊(duì)也開放了RISC-V的SoC實(shí)現(xiàn)Rocket Chip[4-5],以及面向敏捷開發(fā)的硬件構(gòu)建語(yǔ)言Chisel[6],期望通過這三駕馬車率領(lǐng)芯片設(shè)計(jì)領(lǐng)域邁進(jìn)敏捷開發(fā)的時(shí)代[注]RISC-V和Chisel是由伯克利中2個(gè)不同的團(tuán)隊(duì)分別設(shè)計(jì)的.

本文希望探索這樣一個(gè)問題:RISC-V,Rocket Chip和Chisel是如何推動(dòng)芯片敏捷開發(fā)的?為了探討這個(gè)問題,我們將探討3個(gè)方面的內(nèi)容.

1) RISC-V和Rocket Chip如何降低芯片開發(fā)的門檻?為了探索這個(gè)問題,我們介紹了RISC-V的開源開放理念,同時(shí)以中國(guó)科學(xué)院計(jì)算技術(shù)研究所開展的標(biāo)簽化 RISC-V[7-8](Labeled RISC-V)研究項(xiàng)目為案例,分別從設(shè)計(jì)開源度、定制靈活性、生態(tài)完整性以及社區(qū)活躍度4個(gè)方面,把開放不活躍的SPARC V9[9]、活躍不開放的MicroBlaze[10],與開放又活躍的RISC-V進(jìn)行對(duì)比,揭示了一款不開放或者不活躍的指令集對(duì)芯片設(shè)計(jì)項(xiàng)目帶來(lái)的限制,從而展示了RISC-V和Rocket Chip對(duì)降低芯片開發(fā)門檻的價(jià)值.

2) Chisel如何對(duì)項(xiàng)目的敏捷開發(fā)提供幫助?為了回答這個(gè)問題,我們分別介紹了Chisel的信號(hào)整體連接、元編程、面向?qū)ο缶幊桃约昂瘮?shù)式編程的特性.同時(shí)我們以標(biāo)簽化RISC-V中的項(xiàng)目經(jīng)驗(yàn)為例子,展現(xiàn)了這些特性如何幫助我們快速地開發(fā)項(xiàng)目需要的功能,并將這些特性與傳統(tǒng)的硬件描述語(yǔ)言,包括Verilog[11]和SystemVerilog[12]進(jìn)行比較,展示Chisel代碼的簡(jiǎn)潔性、易讀性以及易維護(hù)性,從而對(duì)項(xiàng)目的敏捷開發(fā)提供幫助.

3) 敏捷開發(fā)和傳統(tǒng)開發(fā)相比,編碼的效率和質(zhì)量怎么樣?為了展現(xiàn)2種開發(fā)模式的效率對(duì)比,我們分別使用2種模式來(lái)開發(fā)一個(gè)功能相同的二級(jí)緩存(L2 cache)模塊.結(jié)果顯示:與傳統(tǒng)開發(fā)模式相比,敏捷開發(fā)模式的開發(fā)效率提升了一個(gè)數(shù)量級(jí),同時(shí)編寫出的代碼可讀性更好,更容易排除錯(cuò)誤.為了展示2種開發(fā)模式的質(zhì)量對(duì)比,進(jìn)一步屏蔽設(shè)計(jì)的差異,我們將采用傳統(tǒng)開發(fā)模式的Verilog代碼翻譯成功能相同的Chisel代碼,并在FPGA流程上對(duì)翻譯前后代碼的性能、功耗、面積進(jìn)行評(píng)估.結(jié)果顯示:敏捷開發(fā)能達(dá)到與傳統(tǒng)開發(fā)相當(dāng)甚至更優(yōu)的編碼質(zhì)量.

1 開放指令集的理念

2010年,伯克利研究團(tuán)隊(duì)準(zhǔn)備為接下來(lái)的一系列項(xiàng)目選擇一款指令集.結(jié)合項(xiàng)目的需求,他們最后決定在x86和ARM中進(jìn)行選擇.但是選擇x86是不可能的,首先它有知識(shí)產(chǎn)權(quán)問題,而且設(shè)計(jì)非常復(fù)雜.但ARM也是幾乎不可能,它不僅和x86有同樣的問題,而且當(dāng)時(shí)并沒有64位指令集的規(guī)范.這讓伯克利研究團(tuán)隊(duì)感到困擾.

他們對(duì)當(dāng)時(shí)指令集的狀況進(jìn)行了一些調(diào)研,發(fā)現(xiàn)即使是一個(gè)小小的SoC芯片,里面也包含很多處理器,包括應(yīng)用處理器、圖形處理器、圖像處理器、視頻DSP、音頻DSP等.但是這些大大小小的處理器使用的指令集可能都各不相同,比如應(yīng)用處理器一般用ARM指令集,從不同廠商購(gòu)買的IP核也許都會(huì)用自己私有的指令集,就連SoC廠商自己設(shè)計(jì)的核心,也可能會(huì)用自己的指令集.而這些都位于同一顆SoC芯片上的各種核心,都有自己獨(dú)立的一套軟件棧.

但是,我們真的需要這么多不同的指令集嗎?為了回答這個(gè)問題,伯克利研究團(tuán)隊(duì)又調(diào)研了開源軟件的狀況,發(fā)現(xiàn)和指令集的情況大不相同.如表1所示,開源軟件中的不同領(lǐng)域,都有一套開放的標(biāo)準(zhǔn),在這套開放的標(biāo)準(zhǔn)之下,既有開放自由的實(shí)現(xiàn),也有私有的實(shí)現(xiàn).雖然總體上私有實(shí)現(xiàn)的效果更優(yōu),但開放自由的社區(qū)也非?;钴S.然而,以私有實(shí)現(xiàn)主導(dǎo)的指令集領(lǐng)域卻毫無(wú)生機(jī).

Table 1 Summary of Open Software Standards表1 開放軟件和標(biāo)準(zhǔn)小結(jié)[13]

如果有一款開放自由的指令集,大家都可以用它來(lái)做任何事情,會(huì)怎么樣呢?借鑒軟件領(lǐng)域的發(fā)展?fàn)顩r,伯克利研究團(tuán)隊(duì)認(rèn)為,指令集體系結(jié)構(gòu)作為軟硬件接口的一種標(biāo)準(zhǔn),不應(yīng)該像x86和ARM等指令集那樣需要授權(quán)才能使用,而應(yīng)該開放(open)出來(lái)讓大家自由(free)使用,這樣才能塑造指令集領(lǐng)域的繁榮生態(tài)[14].于是伯克利研究團(tuán)隊(duì)發(fā)起了一個(gè)持續(xù)3個(gè)月的暑期項(xiàng)目,目標(biāo)是從零開始設(shè)計(jì)一款新的指令集,并將其徹底開放.

這套新的指令集被命名為RISC-V(讀作RISC-Five).2011年5月第1版RISC-V指令集正式發(fā)布.

實(shí)際上,第1版RISC-V發(fā)布后并未受到關(guān)注,也未取得預(yù)期反響,反而備受多方質(zhì)疑.一方面,很多學(xué)術(shù)界人士認(rèn)為RISC-V指令集毫無(wú)技術(shù)創(chuàng)新;另一方面,工業(yè)界對(duì)于這種由學(xué)術(shù)界推出的新指令集也是持觀望態(tài)度.開放指令集的理念和意義并未得到廣泛認(rèn)可.

面對(duì)各方質(zhì)疑,伯克利研究團(tuán)隊(duì)采取了3項(xiàng)措施:

1) 研究團(tuán)隊(duì)設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于RISC-V指令集的順序執(zhí)行64位處理器核心(代號(hào)為Rocket),并對(duì)相應(yīng)的SoC設(shè)計(jì)Rocket Chip進(jìn)行開源.隨后伯克利研究團(tuán)隊(duì)又推出了開源的亂序執(zhí)行核心BOOM(Berkeley out-of-order machine)[15-16].這兩款開源的微結(jié)構(gòu)設(shè)計(jì)打破了學(xué)術(shù)界長(zhǎng)期缺乏可用芯片原型的困境,很快吸引了學(xué)術(shù)界的廣泛關(guān)注.

2) 伯克利研究團(tuán)隊(duì)在2015年成立非盈利組織RISC-V基金會(huì)(RISC-V Foundation),旨在凝聚全世界的力量一起共同構(gòu)建開放、合作的軟硬件社區(qū),打造RISC-V生態(tài)系統(tǒng).

3) 伯克利研究團(tuán)隊(duì)從2015年開始組織舉辦RISC-V技術(shù)研討會(huì),鼓勵(lì)企業(yè)和科研機(jī)構(gòu)在研討會(huì)上分享RISC-V相關(guān)的工作和研究,從而傳播RISC-V開放指令集的理念和意義,大大地加深了人們對(duì)RISC-V的了解[17].

伯克利研究團(tuán)隊(duì)實(shí)施的這一套組合拳,很快讓RISC-V成長(zhǎng)為一個(gè)開放又活躍的社區(qū).

2 標(biāo)簽化RISC-V項(xiàng)目中的指令集選擇

關(guān)于RISC-V開源開放的理念對(duì)學(xué)術(shù)研究的意義,我們?cè)陂_展標(biāo)簽化體系結(jié)構(gòu)這一科研項(xiàng)目的過程中也深有體會(huì).標(biāo)簽化RISC-V是一個(gè)基于RISC-V指令集的標(biāo)簽化體系結(jié)構(gòu)的實(shí)現(xiàn),它基于RISC-V指令集的開源實(shí)現(xiàn)Rocket Chip,添加了標(biāo)簽化體系結(jié)構(gòu)相關(guān)的功能.標(biāo)簽化體系結(jié)構(gòu)的主要思想是通過標(biāo)簽向底層硬件傳播軟件信息,向硬件添加身份識(shí)別、區(qū)分服務(wù)、性能調(diào)控等新功能.標(biāo)簽化體系結(jié)構(gòu)有4點(diǎn)特性[18]:

1) 細(xì)粒度對(duì)象.所有訪存和I/O請(qǐng)求都帶上標(biāo)簽.

2) 語(yǔ)義關(guān)聯(lián).標(biāo)簽和軟件實(shí)體(包括虛擬機(jī)、進(jìn)程、線程或變量)進(jìn)行關(guān)聯(lián).

3) 攜帶傳播.標(biāo)簽隨著請(qǐng)求一同在整個(gè)系統(tǒng)中傳播.

4) 可編程控制邏輯.對(duì)攜帶不同標(biāo)簽的不同請(qǐng)求進(jìn)行區(qū)分化處理.

基于這些特性,標(biāo)簽化體系結(jié)構(gòu)的其中一個(gè)應(yīng)用場(chǎng)景,是保證關(guān)鍵應(yīng)用性能的同時(shí),提高系統(tǒng)的資源利用率[19].具體地,我們可以通過標(biāo)簽向底層硬件傳遞訪存和I/O請(qǐng)求的身份信息,這一身份信息會(huì)隨著請(qǐng)求在整個(gè)系統(tǒng)中傳播.這樣以后,硬件共享資源的控制器(如末級(jí)緩存控制器、內(nèi)存控制器等)就可以識(shí)別收到的一個(gè)請(qǐng)求來(lái)源于哪個(gè)應(yīng)用,若發(fā)現(xiàn)請(qǐng)求來(lái)源于關(guān)鍵應(yīng)用,則優(yōu)先對(duì)其進(jìn)行處理,并保證其使用的資源不受非關(guān)鍵應(yīng)用的干擾;若發(fā)現(xiàn)請(qǐng)求來(lái)源于非關(guān)鍵應(yīng)用,則對(duì)其提供盡力而為的服務(wù).

原則上,標(biāo)簽化體系結(jié)構(gòu)可以實(shí)現(xiàn)在任意一款指令集之上.在項(xiàng)目前期,我們也曾經(jīng)在多款指令集中進(jìn)行選擇和嘗試,最終體會(huì)到RISC-V的開放活躍對(duì)學(xué)術(shù)研究的意義.

2.1 開放不活躍的SPARC V9

我們一開始在2013年7月選擇了OpenSPARC T1[20]來(lái)開展項(xiàng)目.它是一個(gè)8核32線程的64位工業(yè)級(jí)微結(jié)構(gòu)實(shí)現(xiàn),采用SPARC V9指令集,在2006年通過GPL協(xié)議開源.我們本來(lái)以為這款工業(yè)級(jí)的開源實(shí)現(xiàn)可以給項(xiàng)目帶來(lái)性能上的保障,但是在開展過程中,我們遇到了4個(gè)挑戰(zhàn):

1) 工具不再維護(hù),所依賴的庫(kù)版本較老,難以尋找與其適配的開發(fā)環(huán)境;

2) 缺少詳細(xì)設(shè)計(jì)文檔,工程中注釋較少,閱讀并理解工程中的Verilog代碼較為困難;

3) 生態(tài)不完善,難以運(yùn)行真實(shí)應(yīng)用;

4) 社區(qū)不再活躍,難以尋求幫助.

我們?cè)?jì)劃將OpenSPARC T1的實(shí)現(xiàn)從8核32線程裁剪為單核單線程,再開展標(biāo)簽化的研究.但由于上述挑戰(zhàn),裁剪的定制工作非常困難,進(jìn)行了約半年時(shí)間卻未有明顯進(jìn)展,最后無(wú)奈放棄OpenSPARC T1這款開源設(shè)計(jì).這說明,只開放但不活躍的指令集,雖然能讓研究者使用,但定制的難度很高,要基于一個(gè)不活躍指令集開展項(xiàng)目研究還是很困難.

2.2 活躍不開放的MicroBlaze

之后我們嘗試了賽靈思(Xilinx)的MicroBlaze架構(gòu),它是一款主要面向嵌入式領(lǐng)域的處理器.與OpenSPARC T1相比,MicroBlaze的微結(jié)構(gòu)設(shè)計(jì)、生態(tài)和社區(qū)都由賽靈思維護(hù).2009年6月,MicroBlaze作為第1款軟核CPU架構(gòu)并入Linux內(nèi)核主線;3個(gè)月后,MicroBlaze的GNU工具鏈也開始并入相應(yīng)的主線倉(cāng)庫(kù)[21]并一直在演進(jìn),而GCC則從4.6發(fā)行版開始支持MicroBlaze[22].在賽靈思論壇的MicroBlaze板塊,開發(fā)者踴躍提問,并且能很快得到賽靈思工作人員的答復(fù).這表明,MicroBlaze的生態(tài)和社區(qū)狀況非常健康,這也是我們項(xiàng)目選擇MicroBlaze的一個(gè)重要原因.

我們雖然在開發(fā)過程中也會(huì)遇到困難,但借助社區(qū)的力量,我們很快就解決了困難,構(gòu)建出一套可以運(yùn)行Linux的系統(tǒng).然后我們?cè)贛icroBlaze上進(jìn)行了4個(gè)方面的擴(kuò)展,實(shí)現(xiàn)了標(biāo)簽化體系結(jié)構(gòu):

1) 細(xì)粒度對(duì)象.在核外添加標(biāo)簽寄存器.

2) 語(yǔ)義關(guān)聯(lián).標(biāo)簽寄存器中存放虛擬機(jī)的標(biāo)識(shí).

3) 攜帶傳播.把標(biāo)簽寄存器中存放的標(biāo)簽連接到AXI總線的USER域中,通過AXI總線將標(biāo)簽傳播到整個(gè)系統(tǒng)中.

4) 可編程控制邏輯.向賽靈思系統(tǒng)緩存(Xilinx system cache[23])模塊的替換算法添加基于標(biāo)簽路劃分的功能,并添加可編程的緩存控制邏輯模塊,對(duì)路劃分的參數(shù)進(jìn)行編程,來(lái)實(shí)現(xiàn)緩存容量的隔離;同時(shí)在內(nèi)存控制器前的數(shù)據(jù)通路中添加基于標(biāo)簽的令牌桶模塊,并添加可編程的內(nèi)存控制邏輯模塊,對(duì)令牌桶的參數(shù)進(jìn)行編程,來(lái)實(shí)現(xiàn)內(nèi)存帶寬的隔離.

雖然我們成功在MicroBlaze上實(shí)現(xiàn)了標(biāo)簽化體系結(jié)構(gòu),但在實(shí)現(xiàn)過程中,我們?nèi)匀挥龅搅吮?中的困難.

Table 2 Summary of Challenges About MicroBlaze表2 使用MicroBlaze的挑戰(zhàn)總結(jié)

表2中,第1種困難屬于模塊復(fù)雜度較高,同時(shí)缺少相關(guān)資料幫助理解該模塊的細(xì)節(jié).例如賽靈思系統(tǒng)緩存模塊的代碼約6萬(wàn)行,我們需要在其中添加基于標(biāo)簽路劃分的替換算法,但由于缺少詳細(xì)設(shè)計(jì)文檔和注釋,理解代碼較為困難.這種困難可以通過投入足夠時(shí)間來(lái)克服.我們安排了一位工程師專門閱讀賽靈思系統(tǒng)緩存模塊的代碼,花費(fèi)了將近半年時(shí)間才完成替換算法的添加,雖然最終成功實(shí)現(xiàn)這一功能,但這也一定程度上也影響了從想法到原型的周期(time to prototype).

第2種困難是代碼不開源帶來(lái)的限制,雖然對(duì)工程實(shí)現(xiàn)有一定影響,但可付出少量代價(jià)繞開.例如AXI數(shù)據(jù)寬度轉(zhuǎn)換器會(huì)截?cái)郩SER域[24],導(dǎo)致基于USER域?qū)崿F(xiàn)的標(biāo)簽無(wú)法繼續(xù)往后傳播.但由于相關(guān)代碼不開源,我們無(wú)法修改轉(zhuǎn)換器的代碼,只能在項(xiàng)目中小心地規(guī)劃模塊的順序,避免在標(biāo)簽傳播的通路上使用這個(gè)轉(zhuǎn)換器;在必須使用轉(zhuǎn)換器的情況下,只能額外將標(biāo)簽接入到轉(zhuǎn)換器的下游模塊中來(lái)讓標(biāo)簽繼續(xù)傳播.另一個(gè)例子是由于MicroBlaze處理器不開源,我們無(wú)法在處理器內(nèi)部添加寄存器來(lái)實(shí)現(xiàn)進(jìn)程級(jí)標(biāo)簽,只能把標(biāo)簽寄存器放置在處理器外面,讓操作系統(tǒng)通過I/O的方式來(lái)設(shè)置進(jìn)程級(jí)標(biāo)簽.雖然這個(gè)解決方案會(huì)帶來(lái)一定的性能開銷,但至少繞開了無(wú)法修改處理器的限制.

第3種困難同樣是代碼不開源帶來(lái)的限制,雖然沒有解決方案,但相關(guān)的研究工作還是可以繼續(xù)開展.例如MicroBlaze處理器主要面向嵌入式場(chǎng)景,性能一般.我們?cè)跍y(cè)試后發(fā)現(xiàn),在運(yùn)行云計(jì)算典型應(yīng)用(如Memcached)時(shí),軟件管理的TLB在缺頁(yè)頻繁時(shí)帶來(lái)了約20%的性能開銷,但由于處理器代碼不開源,我們無(wú)法對(duì)相關(guān)設(shè)計(jì)進(jìn)行改進(jìn).不過對(duì)于我們的項(xiàng)目來(lái)說,這一性能開銷還是可以接受.

第4種困難也是代碼不開源帶來(lái)的限制,但卻無(wú)法解決,會(huì)直接限制相關(guān)研究工作無(wú)法開展.例如MicroBlaze無(wú)法運(yùn)行多核操作系統(tǒng),這是因?yàn)闉榱诉\(yùn)行多核操作系統(tǒng),我們需要一種多核核間通信的方式,例如核間中斷(inter-processor interrupt, IPI),還需要一種內(nèi)存同步和通信的方式.要實(shí)現(xiàn)這些功能,就需要對(duì)處理器內(nèi)部進(jìn)行改動(dòng)[25],但由于處理器代碼不開源,我們無(wú)法對(duì)其進(jìn)行改進(jìn),使其支持多核操作系統(tǒng).另一個(gè)例子是流片,不開源的處理器自然也無(wú)法流片.

因此,不開放的指令集和微結(jié)構(gòu)實(shí)現(xiàn),會(huì)對(duì)相關(guān)研究工作在項(xiàng)目周期、工程實(shí)現(xiàn)和性能表現(xiàn)等方面帶來(lái)頗多影響,甚至?xí)沟貌糠诸嵏彩角把匮芯繜o(wú)法開展.為了解決這些問題,就需要有一款開放的指令集以及相應(yīng)的開源微結(jié)構(gòu)實(shí)現(xiàn).

2.3 開放又活躍的RISC-V

有了SPARC V9和MicroBlaze的經(jīng)歷,我們意識(shí)到需要有一個(gè)開放又活躍的指令集來(lái)支撐項(xiàng)目的開展.事實(shí)上,期間我們還因?yàn)锳RM的活躍社區(qū)和生態(tài)而調(diào)研過基于ARM的解決方案,然而ARM的開放性比MicroBlaze還弱,而且需要支付高額的授權(quán)費(fèi)用,一般的研究項(xiàng)目無(wú)法承擔(dān),最終還是放棄了ARM的選擇.最后我們選擇了RISC-V,依托其開放的理念及活躍的生態(tài),在其微結(jié)構(gòu)實(shí)現(xiàn)Rocket Chip上成功解決了在MicroBlaze上遇到的問題:

1) 實(shí)現(xiàn)簡(jiǎn)單.Rocket Chip的二級(jí)緩存模塊代碼約1 000行,即使缺少詳細(xì)設(shè)計(jì)文檔和注釋,我們花費(fèi)約3天時(shí)間就成功實(shí)現(xiàn)了之前在賽靈思系統(tǒng)緩存上實(shí)現(xiàn)的功能,效率提高了50倍.

2) 修改靈活.我們通過Rocket Chip上使用的開放總線協(xié)議TileLink[26]來(lái)傳播標(biāo)簽,我們?cè)赥ileLink總線上靈活地添加一組信號(hào)來(lái)專門傳播標(biāo)簽,在TileLink總線適配器(如數(shù)據(jù)寬度轉(zhuǎn)換器等)不能自動(dòng)傳播標(biāo)簽時(shí),可以靈活地修改適配器的硬件代碼來(lái)實(shí)現(xiàn)標(biāo)簽的傳播;此外,我們可以靈活地在Rocket核心中添加一個(gè)新的控制狀態(tài)寄存器(control status register, CSR)來(lái)存放進(jìn)程級(jí)標(biāo)簽的信息,操作系統(tǒng)可以通過CSR指令高效地進(jìn)行設(shè)置.

3) 性能較高.RISC-V的TLB為硬件管理,性能比MicroBlaze高,而且若性能不能滿足項(xiàng)目需要,可以對(duì)處理器自由進(jìn)行修改.

4) 支持多核.RISC-V豐富的生態(tài)已經(jīng)支持多核操作系統(tǒng)的運(yùn)行.

5) 允許流片.Rocket Chip的代碼全部開源,RISC-V也無(wú)需授權(quán)費(fèi)用,可以進(jìn)行流片.

表3總結(jié)了我們項(xiàng)目對(duì)不同指令集進(jìn)行的嘗試.其中,基于SPARC V9指令集的OpenSPARC T1的微結(jié)構(gòu)設(shè)計(jì)雖然開源,但由于代碼難以閱讀,對(duì)設(shè)計(jì)進(jìn)行定制化非常困難,而且軟件生態(tài)的支持非常有限,社區(qū)也不活躍,對(duì)科研項(xiàng)目來(lái)說難以使用.MicroBlaze的生態(tài)和社區(qū)都由賽靈思進(jìn)行維護(hù),活躍度很好,但其設(shè)計(jì)不開源,只能對(duì)其進(jìn)行很有限的配置,雖然總體上能滿足一些嵌入式研究工作的需求,但對(duì)于性能要求更高或者對(duì)芯片有所創(chuàng)新的研究工作,MicroBlaze還是難以勝任.RISC-V則結(jié)合了兩者的優(yōu)點(diǎn),首先開放的理念吸引了大批企業(yè)和個(gè)人幫助其建設(shè)生態(tài),社區(qū)非?;钴S;其次RISC-V有一款開源的微結(jié)構(gòu)設(shè)計(jì)Rocket Chip,無(wú)論是指令集的模塊化,還是微結(jié)構(gòu)的設(shè)計(jì)細(xì)節(jié),大家都可以根據(jù)各自的需求對(duì)其進(jìn)行靈活的個(gè)性化定制,而且可以直接將設(shè)計(jì)進(jìn)行流片.

Table 3 Summary of Different ISA表3 不同ISA的特點(diǎn)總結(jié)

正是這些好處給芯片相關(guān)的科研工作帶來(lái)了很多嶄新的機(jī)會(huì):與模擬器相比,在一個(gè)可綜合的平臺(tái)上進(jìn)行驗(yàn)證的工作將會(huì)更有說服力,同時(shí)距離真正芯片的實(shí)現(xiàn)也更近;而對(duì)工業(yè)界來(lái)說,這些好處也同樣受到青睞.因此,開放活躍的指令集和相應(yīng)開源的微結(jié)構(gòu)設(shè)計(jì),是邁向開源芯片設(shè)計(jì)的第1步.

3 基于Chisel的敏捷開發(fā)

在學(xué)術(shù)界,目前大多數(shù)微結(jié)構(gòu)相關(guān)的研究還是在模擬器上進(jìn)行,這是因?yàn)榛贔PGA的工作周期一般都比較長(zhǎng),例如我們的標(biāo)簽化RISC-V研究需要花費(fèi)約半年的時(shí)間來(lái)完成FPGA原型系統(tǒng)的構(gòu)建,基于真實(shí)芯片設(shè)計(jì)的研究工作則鮮有聽聞.在工業(yè)界,芯片的開發(fā)周期長(zhǎng)達(dá)2~3年,其中設(shè)計(jì)和驗(yàn)證工作需要花費(fèi)1~2年,投片需要花費(fèi)約1年.如果流片失敗,投入的時(shí)間和精力將會(huì)付諸東流,風(fēng)險(xiǎn)相當(dāng)大[1].因此,如果有辦法加快芯片設(shè)計(jì)的效率,實(shí)現(xiàn)芯片的敏捷開發(fā),那么將會(huì)對(duì)學(xué)術(shù)研究和芯片產(chǎn)業(yè)帶來(lái)巨大的影響.

伯克利的另一個(gè)研究團(tuán)隊(duì)在2010年的時(shí)候已經(jīng)考慮到這方面的問題了,他們?cè)?012年的DAC會(huì)議上發(fā)表了一門新的編程語(yǔ)言Chisel[6]來(lái)進(jìn)行硬件的敏捷開發(fā).Chisel的主要目標(biāo)是減少項(xiàng)目中的重復(fù)代碼,提高代碼密度,從而提升開發(fā)效率、代碼的可讀性和易維護(hù)性.編寫Chisel代碼后,用Chisel編譯器將其編譯成底層的Verilog代碼(網(wǎng)表),可用于標(biāo)準(zhǔn)的ASIC和FPGA流程.需要說明的是,雖然Chisel支持傳統(tǒng)硬件描述語(yǔ)言不具備的很多高級(jí)特性,但Chisel還是一門硬件構(gòu)建語(yǔ)言,而不是高層次綜合語(yǔ)言.硬件構(gòu)建語(yǔ)言用于描述電路具體如何構(gòu)建,而高層次綜合則用于描述算法的流程.

3.1 信號(hào)整體連接

Chisel豐富的類型系統(tǒng)使得我們可以很容易地修改類型的定義,在不修改引用該類型的代碼(如通過該類型來(lái)定義的信號(hào))的情況下,可以輕松對(duì)該類型的信號(hào)進(jìn)行全局修改.此外,整體連接運(yùn)算符“”會(huì)根據(jù)類型的定義,把相同類型的2組信號(hào)的相應(yīng)成員信號(hào)一一連接,從而省去重復(fù)而且易出錯(cuò)的連線代碼.在工程項(xiàng)目中,我們一般會(huì)在代碼中的不同位置定義同種類型的信號(hào),比如總線信號(hào).在這種情況下,信號(hào)整體連接的特性能大幅減少項(xiàng)目中的重復(fù)代碼.

在標(biāo)簽化RISC-V項(xiàng)目中,為了在TileLink總線上添加標(biāo)簽并實(shí)現(xiàn)攜帶傳播,我們只需要添加4行Chisel代碼.圖1中以“+”為行首的代碼為添加的代碼.具體地,添加的代碼首先定義一個(gè)寬度為tlDsidBits的新信號(hào)dsid,然后把這個(gè)新信號(hào)加入到TileLink協(xié)議的元數(shù)據(jù)中.在類型系統(tǒng)的作用下,項(xiàng)目中定義的所有TileLink總線都會(huì)自動(dòng)帶上這個(gè)新成員信號(hào)dsid.此外,由于項(xiàng)目中使用“”來(lái)連接TileLink總線,因此“”也會(huì)自動(dòng)將新成員信號(hào)dsid連接起來(lái).我們無(wú)需編寫額外的代碼,就已經(jīng)實(shí)現(xiàn)了標(biāo)簽在TileLink總線上的攜帶傳播了.

Fig. 1 Implemention of labels over TileLink圖1 在TileLink總線上添加標(biāo)簽的代碼實(shí)現(xiàn)

這個(gè)例子展示了敏捷開發(fā)中的一個(gè)常見現(xiàn)象:需求變更時(shí),可以對(duì)項(xiàng)目快速進(jìn)行修改以實(shí)現(xiàn)新的需求.使用Verilog語(yǔ)言進(jìn)行開發(fā)時(shí),若要對(duì)總線的成員信號(hào)進(jìn)行改動(dòng),工程師只能對(duì)項(xiàng)目中所有用到總線的模塊端口逐一進(jìn)行改動(dòng),同時(shí)還需要手工添加或移除相應(yīng)成員信號(hào)的assign語(yǔ)句,這對(duì)Verilog工程師來(lái)說是一件非常麻煩的事情.SystemVerilog的interface特性一定程度上也能實(shí)現(xiàn)類似Chisel中信號(hào)整體連接的功能,但它仍然有一些局限性,例如modport不能嵌套定義,使得我們無(wú)法從不同的interface中將相同的部分進(jìn)一步抽象出來(lái).Chisel中的信號(hào)整體連接特性比SystemVerilog還要強(qiáng)大,這使得我們可以進(jìn)一步減少重復(fù)的代碼,實(shí)現(xiàn)“一改全改”的效果,從而提升項(xiàng)目的開發(fā)效率.

3.2 元編程

Chisel支持基于Scala的元編程,可以借助Scala的特性抽象出多份相似的Chisel代碼的共性部分,我們只需要維護(hù)一份共性代碼,具體的Chisel代碼可以通過對(duì)共性代碼實(shí)例化得到,從而進(jìn)一步減少冗余的代碼.一個(gè)常見的例子是使用模板來(lái)實(shí)現(xiàn)隊(duì)列原型.無(wú)論隊(duì)列中的元素是何種類型,隊(duì)列本身的功能都是一樣的.使用模板可以將隊(duì)列本身的功能抽象成一個(gè)帶類型參數(shù)的隊(duì)列原型,然后在實(shí)例化時(shí)給出隊(duì)列元素類型就可以得到一個(gè)該種元素類型的隊(duì)列.通過這種方式,我們不必分別實(shí)現(xiàn)不同元素類型的隊(duì)列,只需要維護(hù)一份隊(duì)列原型即可.

圖2展示了Chisel使用模板類Queue來(lái)抽象出隊(duì)列原型的一個(gè)例子.行①表示這個(gè)模板類接收隊(duì)列元素gen和隊(duì)列項(xiàng)數(shù)entries兩個(gè)參數(shù),其中隊(duì)列元素類型并未事先確定.行②定義模塊的輸入輸出端口.行③定義隊(duì)列的存儲(chǔ)單元,它們均與隊(duì)列元素類型有關(guān).行④和行⑤分別定義隊(duì)列的讀寫指針.剩余代碼未列出,但其實(shí)現(xiàn)與傳統(tǒng)硬件描述語(yǔ)言非常類似.有了Queue模板類,我們就可以通過它來(lái)定義各種元素類型的隊(duì)列了.

Fig. 2 Example of template class in Chisel
圖2 Chisel模板類例子

在標(biāo)簽化RISC-V項(xiàng)目中,在TileLink總線中添加標(biāo)簽之后,一個(gè)需要考慮的問題是,項(xiàng)目中有一些對(duì)TileLink請(qǐng)求進(jìn)行緩沖的隊(duì)列.我們希望標(biāo)簽?zāi)軌螂S著請(qǐng)求一同經(jīng)過隊(duì)列,以實(shí)現(xiàn)攜帶傳播的效果,這也許要求我們修改相關(guān)的代碼.幸運(yùn)的是,元編程的功能已經(jīng)自動(dòng)實(shí)現(xiàn)了這一效果.這是因?yàn)槲覀兺ㄟ^擴(kuò)充TileLink元數(shù)據(jù)類型的方式加入標(biāo)簽,本質(zhì)上修改了TileLink類型,但上述隊(duì)列原型可適用于各種元素類型,從而無(wú)需修改相關(guān)的代碼.而為了在Verilog中實(shí)現(xiàn)這一功能, 針對(duì)代碼中的所有相關(guān)隊(duì)列,我們要么增加隊(duì)列元素的寬度,要么增加一個(gè)新隊(duì)列來(lái)專門對(duì)標(biāo)簽進(jìn)行緩沖,同時(shí)還需要維護(hù)標(biāo)簽和請(qǐng)求的對(duì)應(yīng)關(guān)系,十分繁瑣.SystemVerilog也支持模板,但相應(yīng)的代碼是不可綜合的,更多的是用在測(cè)試激勵(lì)的編寫中.

3.3 面向?qū)ο缶幊?/h3>

Chisel可以使用面向?qū)ο缶幊痰奶匦詠?lái)提高硬件開發(fā)的效率,在這里我們介紹繼承和重載.

3.3.1 繼 承

面向?qū)ο缶幊讨械睦^承特性允許我們將一些共同的代碼特性通過一個(gè)父類抽象出來(lái),達(dá)到減少冗余代碼的效果,同時(shí)層次化的類型系統(tǒng)還可以使類型檢查的過程更加嚴(yán)格,從而降低代碼出錯(cuò)的可能性.具體地,我們?cè)趯?shí)現(xiàn)一個(gè)模塊時(shí),只需要從父類繼承,就可以讓該模塊自動(dòng)擁有父類定義的所有特性,從而避免在不同的模塊中重復(fù)實(shí)現(xiàn)這些特性.

在硬件項(xiàng)目中,不少模塊之間都有一些共同的特性,例如cache的不同替換算法都需要讀出并更新歷史狀態(tài),而對(duì)于帶有總線接口的模塊,總線相關(guān)的參數(shù)也非常相似.在這些情況下,使用繼承特性可以有效地節(jié)省項(xiàng)目的代碼量.

在標(biāo)簽化RISC-V項(xiàng)目中,我們需要編寫一個(gè)生成隨機(jī)地址的TileLink負(fù)載發(fā)生器,來(lái)對(duì)基于標(biāo)簽的令牌桶模塊進(jìn)行壓力測(cè)試.圖3展示了該負(fù)載發(fā)生器的Chisel實(shí)現(xiàn).其中,行[注]實(shí)際上是diplomacy[28]語(yǔ)言的功能定義了模塊的名稱TileLinkTrafficGenerator,它從TLModule類繼承.行②~⑤定義了該模塊的輸入輸出端口,包括一組TileLink主端口out以及一個(gè)從令牌桶模塊傳過來(lái)的使能信號(hào)traffic_enable.模塊內(nèi)部的具體實(shí)現(xiàn)未列出,但整個(gè)模塊的代碼量只有20行.

Fig. 3 Example of inheritance in Chisel
圖3 Chisel繼承例子

從TLModule模塊繼承后,負(fù)載發(fā)生器模塊會(huì)自動(dòng)擁有TLModule所擁有的所有特性,這些特性是具有TileLink接口的模塊所共同擁有的,包括總線的大量參數(shù),如地址位寬、數(shù)據(jù)位寬等.這樣,我們就可以在行③通過1行Chisel代碼直接定義一個(gè)TileLink的主端口,而無(wú)需額外顯式指定大量的總線參數(shù),讓代碼功能一目了然,容易維護(hù).相比之下,傳統(tǒng)的硬件描述語(yǔ)言則難以實(shí)現(xiàn)類似的效果,例如若使用Verilog編寫,就需要40行代碼來(lái)聲明TileLink主端口,然后還需要編寫另外40行代碼對(duì)端口中的每一個(gè)信號(hào)進(jìn)行賦值操作,加上模塊內(nèi)部的具體實(shí)現(xiàn),共需要約200行代碼來(lái)編寫此模塊,是Chisel代碼的10倍.在這種情況下,Verilog代碼就難以一目了然了.而SystemVerilog雖然支持繼承,但功能有限,而且相應(yīng)的代碼不可綜合[27],無(wú)法對(duì)硬件構(gòu)建提供幫助.

3.3.2 重 載

面向?qū)ο缶幊痰牧硪粋€(gè)特性是重載,重載可以提升代碼的可讀性.首先,Chisel支持以函數(shù)的方式來(lái)對(duì)電路進(jìn)行抽象(包括模塊實(shí)例化),以達(dá)到復(fù)用的效果,同時(shí)可以把函數(shù)返回值當(dāng)做相應(yīng)電路的輸出,直接作為Chisel表達(dá)式的一部分,而無(wú)需額外定義函數(shù)的輸出信號(hào).此外,Chisel支持函數(shù)名重載,允許定義帶有不同參數(shù)的多個(gè)同名函數(shù),而且可以設(shè)置缺省參數(shù),在調(diào)用函數(shù)時(shí),Chisel會(huì)在多個(gè)函數(shù)定義中自動(dòng)選擇類型匹配的函數(shù)定義.運(yùn)算符重載則是把運(yùn)算符當(dāng)作一個(gè)特殊的函數(shù),可以根據(jù)運(yùn)算符左右兩側(cè)的變量類型來(lái)決定運(yùn)算符的具體行為.

在標(biāo)簽化RISC-V項(xiàng)目中,我們需要在訪存通路上添加一個(gè)延遲器來(lái)凸顯二級(jí)緩存的效果,從而測(cè)試基于標(biāo)簽的路劃分實(shí)現(xiàn)是否有效.圖4的陰影部分展示了新增的代碼.其中,原代碼通過函數(shù)AXI4RAM(),AXI4Buffer(),AXI4Fragmenter()和AXI4MasterNode(),分別實(shí)例化了AXI4接口的SRAM、緩沖器、分片器以及主節(jié)點(diǎn),并將它們的AXI4主從端口依次連接起來(lái).此處項(xiàng)目對(duì)運(yùn)算符“∶=”進(jìn)行了重載①,讓運(yùn)算符兩側(cè)節(jié)點(diǎn)的AXI4主從端口通過“”進(jìn)行整體連接.為了在通路上添加延遲器,我們只需要添加AXI4Delayer()的調(diào)用,來(lái)實(shí)例化一個(gè)延遲為150周期的延遲器,并通過重載后的“∶=”接入到訪存通路中,代碼功能一目了然,容易維護(hù).相比之下,Verilog和SystemVerilog中的函數(shù)、任務(wù)和運(yùn)算符均不支持重載,無(wú)法實(shí)現(xiàn)上述效果,只能使用module來(lái)實(shí)例化這些模塊,從而引入大量的連線代碼.

Fig. 4 Example of overloading in Chisel
圖4 Chisel重載例子

3.4 函數(shù)式編程

Chisel支持使用函數(shù)式編程的特性來(lái)描述電路,可以編寫更緊湊、可讀性更好的代碼.首先,Chisel使用“容器”(collection)來(lái)抽象電路元素,容器中可以是信號(hào)、寄存器、端口、模塊、映射等,或者是這些元素的復(fù)合.然后,Chisel使用map算子對(duì)容器中的對(duì)象進(jìn)行批量操作,操作可以是連接、歸約、算術(shù)和邏輯運(yùn)算、選擇、實(shí)例化、函數(shù)調(diào)用、計(jì)算新映射等,或者是這些操作的復(fù)合,操作結(jié)果返回一個(gè)新容器.通過容器和map算子的組合,我們可以輕松地通過少量代碼描述復(fù)雜電路.

在標(biāo)簽化RISC-V項(xiàng)目中,我們需要把3.3.1節(jié)中介紹的負(fù)載發(fā)生器接入到Rocket Chip中,來(lái)測(cè)試標(biāo)簽化令牌桶在極限情況下的效果,接入方式如圖5所示.具體地,我們希望在第2到n個(gè)核心的數(shù)據(jù)通路中分別添加一個(gè)2選1的TileLink crossbar,并接入相應(yīng)的負(fù)載發(fā)生器,而第1個(gè)核心的數(shù)據(jù)通路則保持不變,從而達(dá)到讓n-1個(gè)負(fù)載發(fā)生器與第1個(gè)核心競(jìng)爭(zhēng)L1toL2 Network模塊入口帶寬的效果.此外,我們還希望n是可配置的,取值可以是2,4,8等.

Fig. 5 Diagram of connecting traffic generators圖5 負(fù)載發(fā)生器連接示意圖

我們可以通過圖6所示的Chisel代碼實(shí)現(xiàn)這一功能.其中,行①的cachedPortsBeforeGenerator表示每個(gè)核心的TileLink主端口的集合,take(1)表示取出其中第1個(gè)核心的端口.行②的drop(1)表示取出除去第1個(gè)核心之外剩余其他核心(即第2到n個(gè)核心)的端口,map算子表示對(duì)這些端口迭代進(jìn)行行③~⑨的操作.具體地,首先為每個(gè)端口取一個(gè)別名p(行③),行④實(shí)例化一個(gè)負(fù)載發(fā)生器模塊;行⑤將令牌桶的使能信號(hào)接入負(fù)載發(fā)生器;行⑥實(shí)例化一個(gè)2選1的TileLink crossbar;行⑦將迭代中的端口p和負(fù)載發(fā)生器模塊的主端口組織成一個(gè)列表,然后通過“”將2個(gè)端口分別接入到crossbar的2個(gè)輸入口;行⑧將crossbar的輸出口作為一次迭代操作的結(jié)果.這樣,行②~⑨的結(jié)果就是第2到n個(gè)核心的數(shù)據(jù)通路中crossbar的輸出口,連同第1個(gè)核心的端口構(gòu)成的集合,取名為cachedPorts.行通過“”將cachedPorts接入到L1toL2 Network模塊中,就能實(shí)現(xiàn)圖5的效果.

Fig. 6 Example of functional programming in Chisel
圖6 Chisel函數(shù)式編程例子

這個(gè)例子說明了Chisel確實(shí)是一門硬件構(gòu)建語(yǔ)言,而不是高層次綜合語(yǔ)言:容器中的對(duì)象和map算子的操作,都是可綜合電路中的概念.Chisel只是使用高級(jí)特性來(lái)方便地描述電路,而不是通過它們來(lái)描述算法.而Verilog雖然有for和generate特性,但它們只能基于整數(shù)進(jìn)行迭代,與Chisel中可以對(duì)任意對(duì)象批量進(jìn)行任意操作的功能相比,Verilog的迭代功能就非常有限了.例如上述例子在map算子中使用了“”運(yùn)算符,能實(shí)現(xiàn)進(jìn)一步減少重復(fù)代碼的效果,而Verilog和SystemVerilog均不支持函數(shù)式編程,難以實(shí)現(xiàn)類似效果.

3.5 開發(fā)語(yǔ)言對(duì)比小結(jié)

表4總結(jié)了Chisel和傳統(tǒng)的硬件描述語(yǔ)言(Verilog和SystemVerilog)之間的對(duì)比.Chisel支持信號(hào)整體連接,可以將類型相同的2組信號(hào)的相應(yīng)成員信號(hào)自動(dòng)連接起來(lái);SystemVerilog的interface特性也可以實(shí)現(xiàn)類似的效果,但有一定的局限性,如modport不能嵌套定義;而Verilog則不支持此功能,其類型(wire和reg)不具備語(yǔ)義,因此只能逐個(gè)信號(hào)地定義和連接.Chisel支持元編程,包括模板類和模板函數(shù),可以把功能近似但類型不同的類或函數(shù)進(jìn)行抽象,進(jìn)一步實(shí)現(xiàn)代碼重用的效果;System-Verilog也支持模板的部分功能,但相應(yīng)代碼不可綜合,無(wú)法對(duì)硬件構(gòu)建提供幫助,而Verilog則不支持模板.Chisel支持面向?qū)ο缶幊蹋ㄟ^繼承可以使子類自動(dòng)帶上父類的特性,從而減少重復(fù)的代碼,層次化的類型系統(tǒng)也可以使類型檢查更加嚴(yán)格,降低代碼出錯(cuò)的可能性,同時(shí)重載可以提升代碼的可讀性;SystemVerilog不支持重載,雖然支持繼承的部分功能,但和模板類似,相應(yīng)的代碼是不可綜合的;而類型系統(tǒng)較弱的Verilog則完全不支持面向?qū)ο缶幊?Chisel還支持函數(shù)式編程,可以將任意電路對(duì)象作為容器的元素,并通過map算子對(duì)這些對(duì)象批量進(jìn)行任意操作,從而實(shí)現(xiàn)用少量代碼描述復(fù)雜電路的效果;而SystemVerilog和Verilog均不支持函數(shù)式編程.

Table 4 Summary of Different Hardware Description Languages表4 不同硬件描述語(yǔ)言的特性總結(jié)

和傳統(tǒng)的硬件描述語(yǔ)言相比,Chisel的這些高級(jí)特性可以大大減少項(xiàng)目中的冗余代碼,提高項(xiàng)目的開發(fā)效率,同時(shí)高密度的代碼也提高了可讀性,使得項(xiàng)目更容易維護(hù).正是Chisel語(yǔ)言的這些特性,使得它成為硬件敏捷開發(fā)的利器.

4 敏捷開發(fā)案例評(píng)估

我們將通過項(xiàng)目中的2個(gè)開發(fā)案例,分別從編碼效率(開發(fā)耗時(shí)和代碼量)和編碼質(zhì)量(性能、功耗和面積)這2方面,對(duì)分別以Chisel和Verilog為代表的敏捷開發(fā)模式和傳統(tǒng)開發(fā)模式進(jìn)行對(duì)比.

4.1 Chisel與Verilog編碼效率對(duì)比

我們團(tuán)隊(duì)曾經(jīng)由于項(xiàng)目需要,期望盡快實(shí)現(xiàn)一個(gè)簡(jiǎn)單的共享二級(jí)緩存.該二級(jí)緩存無(wú)需實(shí)現(xiàn)一致性協(xié)議的功能,只需要具有緩存功能即可,但需要集成到標(biāo)簽化RISC-V項(xiàng)目中并正確運(yùn)行.團(tuán)隊(duì)中的2人分別進(jìn)行獨(dú)立開發(fā),具體情況如表5所示.

參與開發(fā)的其中一位是團(tuán)隊(duì)中的工程師,他在標(biāo)簽化項(xiàng)目的早期閱讀并理解過OpenSPARC T1的二級(jí)緩存源代碼,也修改過賽靈思系統(tǒng)緩存,在其中成功添加基于標(biāo)簽的路劃分功能,具有豐富的緩存設(shè)計(jì)經(jīng)驗(yàn).這位工程師使用傳統(tǒng)開發(fā)模式,選擇Verilog語(yǔ)言來(lái)開發(fā)這個(gè)二級(jí)緩存,并決定從零開始搭建測(cè)試環(huán)境,不復(fù)用任何代碼.他主要開發(fā)了6周,編寫了約1 700行有效代碼.遺憾的是,截至本文投稿為止,他開發(fā)的二級(jí)緩存模塊仍然無(wú)法在標(biāo)簽化RISC-V項(xiàng)目上成功運(yùn)行.

Table 5 Case Study of Implementing an L2 Cache表5 L2 Cache開發(fā)案例對(duì)比

參與開發(fā)的另外一位人員是團(tuán)隊(duì)中的大四本科實(shí)習(xí)生,他做過CPU課程設(shè)計(jì),并有9個(gè)月的Chisel開發(fā)經(jīng)驗(yàn),但從未設(shè)計(jì)過二級(jí)緩存.這位本科生使用敏捷開發(fā)模式,選擇Chisel語(yǔ)言來(lái)開發(fā)這個(gè)二級(jí)緩存,并使用Chisel標(biāo)準(zhǔn)庫(kù)來(lái)幫助設(shè)計(jì),同時(shí)也復(fù)用標(biāo)簽化RISC-V項(xiàng)目的測(cè)試環(huán)境.經(jīng)過了2天的設(shè)計(jì)和仿真驗(yàn)證,他就寫出了一個(gè)可以支持多核Linux啟動(dòng)的二級(jí)緩存,有效代碼量約350行,只有工程師編寫代碼的1/5.不過這個(gè)二級(jí)緩存一開始并不支持不完整的突發(fā)讀寫,導(dǎo)致DMA模式的以太網(wǎng)模塊不能正確工作.一周后團(tuán)隊(duì)將這個(gè)情況反饋給他,他又額外花了一天時(shí)間改動(dòng)了約50行有效代碼[29],添加了對(duì)不完整突發(fā)讀寫的支持,并進(jìn)行仿真驗(yàn)證,最終成功支持DMA模式的以太網(wǎng)模塊正確工作.

這個(gè)案例充分展示了敏捷開發(fā)在項(xiàng)目中的優(yōu)勢(shì):運(yùn)用語(yǔ)言的各種高級(jí)特性、復(fù)用標(biāo)準(zhǔn)庫(kù)中已經(jīng)經(jīng)過驗(yàn)證的模塊來(lái)編寫易讀、易維護(hù)、高密度的代碼,可以大大提升項(xiàng)目開發(fā)的效率.具體在這個(gè)案例中,敏捷開發(fā)模式的效率是傳統(tǒng)開發(fā)模式的14倍!由于沒有進(jìn)行代碼和環(huán)境的復(fù)用,這位工程師表示他花費(fèi)了一半的時(shí)間在構(gòu)建測(cè)試環(huán)境和編寫并測(cè)試基本元件(如RAM、隊(duì)列、仲裁器等)中,而使用Chisel的本科生并沒有在這些事情上花費(fèi)任何時(shí)間.不過即使把工程師花費(fèi)的一半時(shí)間排除在效率比較的范圍之外,敏捷開發(fā)模式的效率仍然是傳統(tǒng)開發(fā)模式的7倍.實(shí)際上代碼重用是敏捷開發(fā)的一個(gè)基本理念,代碼的重用率越高,項(xiàng)目開發(fā)的效率就越高.

有趣的是,這位工程師后來(lái)提到,當(dāng)時(shí)為了編寫一份端口數(shù)量可配置的總線連接代碼,他在generate特性的基礎(chǔ)上運(yùn)用了一些特殊技巧實(shí)現(xiàn)了這一功能,編寫了約250行Verilog代碼.但是工程師在編寫過程中,由于連線和數(shù)字下標(biāo)太多,并且需要顧及總線握手協(xié)議,他曾經(jīng)因疏忽而導(dǎo)致2個(gè)連線錯(cuò)誤的bug,花了約3天時(shí)間才發(fā)現(xiàn)并修復(fù)它們.這位工程師還表示,這部分代碼的可讀性其實(shí)并不好,使用Verilog實(shí)現(xiàn)這一功能實(shí)在太繁瑣了,即使在代碼中有相應(yīng)注釋,他在一周后也不能馬上理解他使用的特殊技巧是如何工作的了.相比之下,若使用Chisel來(lái)實(shí)現(xiàn)類似功能,我們只需要編寫2行代碼即可,可讀性好,而且?guī)缀醪粫?huì)出現(xiàn)錯(cuò)誤.此外,本科生實(shí)際上也是在一周后重新回頭閱讀并修改自己編寫的二級(jí)緩存,但他仍然在一天內(nèi)成功修復(fù)了問題,這說明代碼的可讀性對(duì)項(xiàng)目維護(hù)來(lái)說是非常重要的.

4.2 Chisel與Verilog編碼質(zhì)量對(duì)比

考慮上述案例展示的2個(gè)設(shè)計(jì),雖然它們的需求是一致的,但不同的開發(fā)人員可能會(huì)采用不同的實(shí)現(xiàn)方式,導(dǎo)致編碼質(zhì)量的可比性不強(qiáng).為了進(jìn)一步對(duì)比Chisel和Verilog的編碼質(zhì)量,我們找到團(tuán)隊(duì)中的另一位沒有Chisel開發(fā)經(jīng)驗(yàn)的大四實(shí)習(xí)本科生,讓他來(lái)把上述Verilog代碼中的部分關(guān)鍵模塊翻譯成功能等價(jià)的Chisel代碼.我們?cè)陧?xiàng)目中提供了一些測(cè)試,用于驗(yàn)證翻譯結(jié)果的等價(jià)性.

4.2.1 逐句翻譯

由于這位本科生一開始并沒有Chisel的開發(fā)經(jīng)驗(yàn),他需要從零開始學(xué)習(xí)Chisel,并選擇最簡(jiǎn)單的翻譯方式:逐句翻譯,而不使用Chisel的高級(jí)特性.這位本科生表示,他一開始覺得Chisel代碼比較難讀懂,但是學(xué)習(xí)并逐句翻譯Chisel代碼的過程中,他也逐漸感受到Chisel的方便之處,例如豐富的標(biāo)準(zhǔn)庫(kù)、方便的數(shù)據(jù)類型系統(tǒng)及其轉(zhuǎn)化機(jī)制、簡(jiǎn)潔的時(shí)序邏輯編碼風(fēng)格等,這些特性讓他對(duì)Chisel有了新的認(rèn)識(shí).

我們用Chisel編譯器把翻譯后的Chisel代碼編譯成Verilog代碼(網(wǎng)表),然后對(duì)其以及工程師編寫的Verilog代碼分別進(jìn)行評(píng)估.我們?cè)赩ivado 2017.01中,使用xc7v2000tfhg1716-1型號(hào)的FPGA,在125 MHz的時(shí)鐘頻率下進(jìn)行評(píng)估,結(jié)果如表6中第2,3列所示.為了評(píng)估設(shè)計(jì)的性能,我們展示了時(shí)序報(bào)告中的最差負(fù)時(shí)序余量(worst negative slack, WNS),并將其換算成可運(yùn)行的最高時(shí)鐘頻率,結(jié)果顯示Verilog和Chisel最高分別可運(yùn)行在135.814 MHz和136.388 MHz的時(shí)鐘頻率下,性能非常接近.而兩者的功耗則分別為0.770 W和0.749 W,和Verilog相比,Chisel的功耗節(jié)省了2.73%.而為了展示面積開銷,我們給出2份設(shè)計(jì)各自消耗的查找表(lookup table, LUT)和觸發(fā)器(flip-flop, FF)數(shù)量.我們對(duì)LUT的消耗分成邏輯和存儲(chǔ)2部分來(lái)統(tǒng)計(jì),和Verilog代碼相比,Chisel代碼多消耗了13.14%的LUT邏輯,但節(jié)省了29.62%的LUT存儲(chǔ),這是因?yàn)镃hisel標(biāo)準(zhǔn)庫(kù)提供了RAM相關(guān)的基本元件,它與工程師實(shí)現(xiàn)的RAM被Vivado分別映射成RAM64M和RAM64X1D這2種不同的原語(yǔ)[30],其中RAM64M會(huì)消耗更多的LUT邏輯,但節(jié)約大量LUT存儲(chǔ).對(duì)于FF,Chisel比Verilog節(jié)省了14.72%,這是因?yàn)镃hisel編譯器對(duì)代碼進(jìn)行了更進(jìn)一步的優(yōu)化.從代碼量上看,即使是逐句翻譯,Chisel也比Verilog節(jié)約了23.95%的代碼量,這是因?yàn)椋?)和Verilog的generate特性相比,基于Scala的元編程特性編寫出的代碼更加緊湊;2)在Chisel中編寫時(shí)序邏輯無(wú)須像Verilog那樣聲明always塊;3)Chisel代碼不會(huì)產(chǎn)生鎖存器(latch),無(wú)須像Verilog那樣補(bǔ)全if和switch的所有分支.

Table 6 PPA and LoC Comparison of Chisel and Verilog表6 Chisel和Verilog的性能、功耗、面積和對(duì)比

逐句翻譯方式的整體評(píng)估結(jié)果說明,使用Chisel開發(fā)不但節(jié)省了代碼,編碼質(zhì)量也和Verilog非常接近,在部分指標(biāo)上甚至優(yōu)于Verilog.

4.2.2 使用Chisel高級(jí)特性

這位本科生對(duì)Chisel上手之后,我們讓他使用Chisel的高級(jí)特性對(duì)代碼進(jìn)行重構(gòu),包括使用Chisel標(biāo)準(zhǔn)庫(kù)來(lái)實(shí)例化RAM和隊(duì)列等基本元件,同時(shí)使用第3節(jié)提到的信號(hào)整體連接、元編程、面向?qū)ο缶幊毯秃瘮?shù)式編程來(lái)節(jié)省代碼量.在使用這些高級(jí)特性的過程中,這位本科生逐漸認(rèn)識(shí)到Chisel的更多好處,他表示:使用Chisel標(biāo)準(zhǔn)庫(kù)之后,因?yàn)榇蟛糠之惒酵ㄐ疟唤y(tǒng)一封裝為Decoupled模板類,為了能使用“”進(jìn)行信號(hào)整體連接,自然就會(huì)嘗試從Bundle類繼承來(lái)定義模塊端口,進(jìn)而也會(huì)考慮使用函數(shù)式編程中的map算子對(duì)Vec數(shù)組進(jìn)行簡(jiǎn)便的連接.這些好處讓他體會(huì)到“Chisel高級(jí)特性的一以貫之,相輔相成”.

我們對(duì)重構(gòu)之后的Chisel代碼進(jìn)行評(píng)估,結(jié)果如表6中第4列(Chisel-opt)所示.令人驚訝的是,和Verilog相比,Chisel-opt的LUT邏輯節(jié)省了54.30%,而FF則節(jié)省了82.49%!這是因?yàn)楹凸こ處熅帉懙幕驹啾?,Chisel標(biāo)準(zhǔn)庫(kù)提供的基本元件更成熟,能使用更少的資源實(shí)現(xiàn)相同的功能.由于資源的大幅節(jié)省,Chisel-opt的性能也得到了進(jìn)一步的提升.具體地,可運(yùn)行的最高時(shí)鐘頻率提升到154.107 MHz,與Verilog相比提升了13.47%.除此之外,Chisel的高級(jí)特性使得Chisel-opt的代碼量更加精簡(jiǎn),和Verilog相比,節(jié)省了74.92%的代碼量.

有趣的是,這位工程師一開始看到Chisel-opt的評(píng)估數(shù)據(jù)時(shí),并不相信這一結(jié)果,甚至懷疑是本科生的代碼編寫錯(cuò)誤,導(dǎo)致Vivado對(duì)代碼進(jìn)行了非預(yù)期的優(yōu)化,才使得評(píng)估結(jié)果大幅優(yōu)于Verilog.但Chisel-opt確實(shí)通過了工程師親自編寫的所有仿真測(cè)試,工程師不得不相信Chisel-opt確實(shí)可以正確工作.但當(dāng)他看到Chisel-opt生成可讀性較差的網(wǎng)表級(jí)Verilog代碼時(shí),仍然不敢相信,并先后提出“這樣子生成的Verilog代碼,最后的結(jié)果應(yīng)該是挺差勁的才對(duì)”、“也許是Chisel生成的代碼太亂了,Vivado正巧才匹配上一些復(fù)雜的原語(yǔ)”、“Chisel也許對(duì)各種型號(hào)的FPGA原語(yǔ)有專門的優(yōu)化”等各種猜測(cè).工程師對(duì)Vivado報(bào)告進(jìn)行詳細(xì)的分析,最后發(fā)現(xiàn)是自己在RAM中實(shí)現(xiàn)的一個(gè)性能優(yōu)化特性消耗了大量的LUT邏輯,把這個(gè)特性去掉之后,Verilog消耗的LUT邏輯就減少到與Chisel-opt相當(dāng)?shù)乃?,但這會(huì)給當(dāng)前的Verilog設(shè)計(jì)帶來(lái)額外的延遲,使得仿真測(cè)試的性能數(shù)據(jù)反而不如Chisel-opt.不過關(guān)于FF的大量差異,工程師最后仍然找不到可以令他信服的原因.經(jīng)過這次詳細(xì)分析,工程師最后也不得不相信,“使用Chisel開發(fā)并不會(huì)引入明顯的資源開銷”,“除非FPGA工程師直接調(diào)用原語(yǔ),不然正常情況下只會(huì)跟Chisel的資源消耗持平,或者反而消耗更多資源”,甚至表示“如果ASIC也是這樣的趨勢(shì),Chisel肯定是下一代HDL的強(qiáng)力競(jìng)爭(zhēng)者”.

這個(gè)案例很好地展現(xiàn)了一個(gè)敏捷開發(fā)的例子:一個(gè)本科生的Chisel新手,可以在更短的時(shí)間內(nèi)編寫更少的代碼,編碼質(zhì)量就能達(dá)到和工程師相當(dāng)?shù)乃?,甚至還可以超越工程師.即使編碼質(zhì)量與傳統(tǒng)開發(fā)有20%的差距,敏捷開發(fā)仍然展現(xiàn)了其節(jié)省人力和時(shí)間的價(jià)值:能快速構(gòu)建一個(gè)可以工作的原型,對(duì)項(xiàng)目開展來(lái)說是非常有意義的.從這點(diǎn)來(lái)看,敏捷開發(fā)確實(shí)大大降低了硬件開發(fā)的門檻.

5 改進(jìn)與展望

誠(chéng)然,當(dāng)前這些項(xiàng)目也有不足之處.例如由于Rocket Chip的迭代速度過快,基于Rocket Chip的研究項(xiàng)目需要花費(fèi)一定的精力來(lái)跟進(jìn)主線的功能,若跟進(jìn)后發(fā)現(xiàn)主線的改動(dòng)與研究項(xiàng)目的內(nèi)容有所沖突,還需要花費(fèi)額外的精力去解決這些沖突.我們?cè)?jīng)多次參加RISC-V國(guó)際研討會(huì),會(huì)上不少同行都表示對(duì)此感到困擾.同時(shí)Rocket Chip項(xiàng)目的版本管理目前也有待完善,截止到本文投稿為止,Rocket Chip在github上的開源倉(cāng)庫(kù)雖然受到廣泛關(guān)注,但仍然沒有發(fā)布任何穩(wěn)定的發(fā)行版本[31],這對(duì)于初次接觸Rocket Chip項(xiàng)目、想尋找一個(gè)穩(wěn)定版本的開發(fā)者來(lái)說并不友好.

相對(duì)來(lái)說,對(duì)Chisel表達(dá)建議的聲音就更多了.首先Chisel的學(xué)習(xí)曲線比較陡峭,不少硬件開發(fā)者比較少接觸面向?qū)ο缶幊?,?duì)其編程思維在硬件開發(fā)中的應(yīng)用缺少清晰的認(rèn)識(shí),而函數(shù)式編程對(duì)硬件開發(fā)者來(lái)說就更是遙不可及了.然而關(guān)于Chisel語(yǔ)言的資料也較為缺乏,不少開發(fā)者因?yàn)檎也坏胶线m的學(xué)習(xí)資料而處于觀望狀態(tài),面對(duì)充滿Chisel高級(jí)特性的Rocket Chip項(xiàng)目更是望而卻步.此外,目前EDA工具對(duì)Chisel的支持并不完善,由于Chisel生成的Verilog代碼屬于低層次的網(wǎng)表級(jí)別,并不是給硬件工程師閱讀的,讓他們使用EDA工具對(duì)這樣的Verilog代碼進(jìn)行驗(yàn)證和調(diào)試是非常困難的.

事實(shí)上,對(duì)開源芯片設(shè)計(jì)來(lái)說,開源EDA工具也是一個(gè)很重要的部分.我們對(duì)目前的開源EDA工具進(jìn)行了簡(jiǎn)單的調(diào)研,發(fā)現(xiàn)開源EDA工具面臨3個(gè)挑戰(zhàn):1)目前開源的器件庫(kù)較少且工藝較老,如Qflow工具支持的最先進(jìn)器件庫(kù)為0.18 μm[32],這限制了芯片的實(shí)用性;2)開源EDA工具的可靠性相對(duì)較弱,遇到問題時(shí)也不易尋求幫助,這是因?yàn)檫@些工具未被廣泛使用,社區(qū)較??;3)目前缺少完整高效、靈活可配置且簡(jiǎn)單易用的開源EDA工具鏈.

但是,芯片敏捷開發(fā)的趨勢(shì)是不可阻擋的.據(jù)了解,最近一兩年越來(lái)越多大型IT企業(yè)傳出了擁抱RISC-V的消息[33-34],甚至一些初創(chuàng)企業(yè)也嘗試使用Chisel進(jìn)行項(xiàng)目開發(fā),并表示效果不錯(cuò).因此只要給予充分的時(shí)間,上述問題是可以解決的.甚至上述部分問題已經(jīng)被列入了DARPA牽頭的電子復(fù)興計(jì)劃[35]將要解決的問題列表中.

本文中分享的案例側(cè)重于提高前端的編碼效率,但這只是敏捷開發(fā)所倡導(dǎo)的其中一項(xiàng)原則.伯克利研究團(tuán)隊(duì)曾經(jīng)根據(jù)自己的經(jīng)驗(yàn)提出了硬件敏捷開發(fā)宣言[3],包括:1)優(yōu)先開發(fā)未完成但容易改造的原型,而非構(gòu)建功能齊全卻難以擴(kuò)展的模型;2)優(yōu)先組建靈活協(xié)作的團(tuán)隊(duì),而非強(qiáng)調(diào)各司其職的分工;3)優(yōu)先完善工具和生成器,而非改進(jìn)獨(dú)立的設(shè)計(jì)實(shí)例;4)優(yōu)先擁抱變化,而非遵循計(jì)劃.事實(shí)上,傳統(tǒng)的觀點(diǎn)認(rèn)為硬件開發(fā)需要使用傳統(tǒng)的開發(fā)模型,是因?yàn)橛布_發(fā)的特點(diǎn)與軟件開發(fā)有較大差異.這些差異包括硬件的設(shè)計(jì)和驗(yàn)證周期更長(zhǎng)、完整的硬件設(shè)計(jì)流程需要更多更專業(yè)的技能(總體架構(gòu)設(shè)計(jì)、微結(jié)構(gòu)設(shè)計(jì)、前端RTL設(shè)計(jì)和驗(yàn)證、后端物理設(shè)計(jì)和驗(yàn)證)、硬件成品無(wú)法進(jìn)行頻繁的更新等.但伯克利研究團(tuán)隊(duì)認(rèn)為,正是因?yàn)檫@些差異,我們更需要借鑒軟件開發(fā)的經(jīng)驗(yàn)來(lái)提升硬件開發(fā)的效率.例如通過高效的工具和生成器來(lái)實(shí)現(xiàn)代碼復(fù)用,縮短硬件開發(fā)周期,節(jié)省驗(yàn)證成本;培養(yǎng)全棧的工程團(tuán)隊(duì)來(lái)節(jié)省溝通成本;通過管理多個(gè)未完成原型的版本來(lái)?yè)肀枨蟮淖兓?這些做法背后的原理,和軟件敏捷開發(fā)的理念是非常相似的.

伯克利研究團(tuán)隊(duì)的實(shí)踐已經(jīng)展示了敏捷開發(fā)的驚人效果:他們?cè)?年時(shí)間內(nèi)進(jìn)行了11次投片[3],平均每5~6個(gè)月完成一款芯片的設(shè)計(jì),與傳統(tǒng)的2年設(shè)計(jì)一款芯片相比,設(shè)計(jì)效率提高了4~5倍.最近睿思芯科也公布了他們?cè)O(shè)計(jì)的第1款芯片,他們使用RISC-V相關(guān)的基礎(chǔ)設(shè)施進(jìn)行芯片的敏捷開發(fā),從零開始到設(shè)計(jì)完成,只用了7個(gè)月的時(shí)間[36],是傳統(tǒng)芯片設(shè)計(jì)效率的3倍.

這些例子說明了,通過敏捷開發(fā)來(lái)將芯片設(shè)計(jì)門檻降低幾個(gè)數(shù)量級(jí),是有可能實(shí)現(xiàn)的.我們即將迎來(lái)芯片設(shè)計(jì)的黃金時(shí)代,希望更多的有識(shí)之士能加入到這股潮流之中.

6 總 結(jié)

本文通過分享標(biāo)簽化RISC-V的項(xiàng)目經(jīng)驗(yàn),分別從設(shè)計(jì)開源度、定制靈活性、生態(tài)完整性以及社區(qū)活躍度4個(gè)方面,對(duì)SPARC V9,MicroBlaze和RISC-V 三種指令集進(jìn)行比較,說明了開放又活躍的指令集及其開源的微結(jié)構(gòu)設(shè)計(jì),是芯片敏捷開發(fā)的必要條件.同時(shí)本文也介紹了Chisel中有利于敏捷開發(fā)的特性,將這些特性與傳統(tǒng)的硬件描述語(yǔ)言進(jìn)行比較,展示了Chisel代碼的簡(jiǎn)潔性、易讀性以及易維護(hù)性,從而對(duì)項(xiàng)目的敏捷開發(fā)提供幫助.最后,本文還將敏捷開發(fā)和傳統(tǒng)開發(fā)的效率和質(zhì)量進(jìn)行對(duì)比,結(jié)果顯示:敏捷開發(fā)能在編碼效率提升一個(gè)數(shù)量級(jí)的同時(shí),達(dá)到與傳統(tǒng)硬件開發(fā)模式相當(dāng)甚至更優(yōu)的性能、功耗與面積.

猜你喜歡
指令集開源代碼
3DNow指令集被Linux淘汰
五毛錢能買多少頭牛
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
大家說:開源、人工智能及創(chuàng)新
開源中國(guó)開源世界高峰論壇圓桌會(huì)議縱論開源與互聯(lián)網(wǎng)+創(chuàng)新2.0
實(shí)時(shí)微測(cè)量系統(tǒng)指令集及解析算法
開源計(jì)算機(jī)輔助翻譯工具研究
慈利县| 南皮县| 徐水县| 商丘市| 渑池县| 怀仁县| 西贡区| 合山市| 石家庄市| 南京市| 滨海县| 马鞍山市| 双辽市| 汉中市| 娄烦县| 南京市| 潢川县| 奉节县| 郴州市| 金寨县| 航空| 杭锦旗| 灵宝市| 昭平县| 西平县| 镇江市| 内丘县| 于都县| 神池县| 佛冈县| 浦江县| 平乐县| 大庆市| 太仆寺旗| 图木舒克市| 治多县| 江川县| 古田县| 绥江县| 木里| 杭锦旗|