• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

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

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

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

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

      如今芯片設(shè)計(jì)動輒需要上億研發(fā)費(fèi)用、投入上百人年,而一旦流片失敗,將會浪費(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ì)門檻降低幾個數(shù)量級——3~5人的小團(tuán)隊(duì)在3~4個月內(nèi),只需幾萬元便能研制出一款有市場競爭力的芯片,就可以大大降低芯片開發(fā)的成本和風(fēng)險(xiǎn),必將吸引大量人員投入芯片產(chǎn)業(yè),重塑繁榮.

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

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

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

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

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

      1 開放指令集的理念

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

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

      但是,我們真的需要這么多不同的指令集嗎?為了回答這個問題,伯克利研究團(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ū)也非常活躍.然而,以私有實(shí)現(xiàn)主導(dǎo)的指令集領(lǐng)域卻毫無生機(jī).

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

      如果有一款開放自由的指令集,大家都可以用它來做任何事情,會怎么樣呢?借鑒軟件領(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)出來讓大家自由(free)使用,這樣才能塑造指令集領(lǐng)域的繁榮生態(tài)[14].于是伯克利研究團(tuán)隊(duì)發(fā)起了一個持續(xù)3個月的暑期項(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指令集毫無技術(shù)創(chuàng)新;另一方面,工業(yè)界對于這種由學(xué)術(shù)界推出的新指令集也是持觀望態(tài)度.開放指令集的理念和意義并未得到廣泛認(rèn)可.

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

      1) 研究團(tuán)隊(duì)設(shè)計(jì)并實(shí)現(xiàn)了一個基于RISC-V指令集的順序執(zhí)行64位處理器核心(代號為Rocket),并對相應(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ù)界長期缺乏可用芯片原型的困境,很快吸引了學(xué)術(shù)界的廣泛關(guān)注.

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

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

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

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

      關(guān)于RISC-V開源開放的理念對學(xué)術(shù)研究的意義,我們在開展標(biāo)簽化體系結(jié)構(gòu)這一科研項(xiàng)目的過程中也深有體會.標(biāo)簽化RISC-V是一個基于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)簽向底層硬件傳播軟件信息,向硬件添加身份識別、區(qū)分服務(wù)、性能調(diào)控等新功能.標(biāo)簽化體系結(jié)構(gòu)有4點(diǎn)特性[18]:

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

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

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

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

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

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

      2.1 開放不活躍的SPARC V9

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

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

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

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

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

      我們原計(jì)劃將OpenSPARC T1的實(shí)現(xiàn)從8核32線程裁剪為單核單線程,再開展標(biāo)簽化的研究.但由于上述挑戰(zhàn),裁剪的定制工作非常困難,進(jìn)行了約半年時間卻未有明顯進(jìn)展,最后無奈放棄OpenSPARC T1這款開源設(shè)計(jì).這說明,只開放但不活躍的指令集,雖然能讓研究者使用,但定制的難度很高,要基于一個不活躍指令集開展項(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個月后,MicroBlaze的GNU工具鏈也開始并入相應(yīng)的主線倉庫[21]并一直在演進(jìn),而GCC則從4.6發(fā)行版開始支持MicroBlaze[22].在賽靈思論壇的MicroBlaze板塊,開發(fā)者踴躍提問,并且能很快得到賽靈思工作人員的答復(fù).這表明,MicroBlaze的生態(tài)和社區(qū)狀況非常健康,這也是我們項(xiàng)目選擇MicroBlaze的一個重要原因.

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

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

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

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

      4) 可編程控制邏輯.向賽靈思系統(tǒng)緩存(Xilinx system cache[23])模塊的替換算法添加基于標(biāo)簽路劃分的功能,并添加可編程的緩存控制邏輯模塊,對路劃分的參數(shù)進(jìn)行編程,來實(shí)現(xiàn)緩存容量的隔離;同時在內(nèi)存控制器前的數(shù)據(jù)通路中添加基于標(biāo)簽的令牌桶模塊,并添加可編程的內(nèi)存控制邏輯模塊,對令牌桶的參數(shù)進(jìn)行編程,來實(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ù)雜度較高,同時缺少相關(guān)資料幫助理解該模塊的細(xì)節(jié).例如賽靈思系統(tǒng)緩存模塊的代碼約6萬行,我們需要在其中添加基于標(biāo)簽路劃分的替換算法,但由于缺少詳細(xì)設(shè)計(jì)文檔和注釋,理解代碼較為困難.這種困難可以通過投入足夠時間來克服.我們安排了一位工程師專門閱讀賽靈思系統(tǒng)緩存模塊的代碼,花費(fèi)了將近半年時間才完成替換算法的添加,雖然最終成功實(shí)現(xiàn)這一功能,但這也一定程度上也影響了從想法到原型的周期(time to prototype).

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

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

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

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

      2.3 開放又活躍的RISC-V

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

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

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

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

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

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

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

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

      正是這些好處給芯片相關(guān)的科研工作帶來了很多嶄新的機(jī)會:與模擬器相比,在一個可綜合的平臺上進(jìn)行驗(yàn)證的工作將會更有說服力,同時距離真正芯片的實(shí)現(xiàn)也更近;而對工業(yè)界來說,這些好處也同樣受到青睞.因此,開放活躍的指令集和相應(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的工作周期一般都比較長,例如我們的標(biāo)簽化RISC-V研究需要花費(fèi)約半年的時間來完成FPGA原型系統(tǒng)的構(gòu)建,基于真實(shí)芯片設(shè)計(jì)的研究工作則鮮有聽聞.在工業(yè)界,芯片的開發(fā)周期長達(dá)2~3年,其中設(shè)計(jì)和驗(yàn)證工作需要花費(fèi)1~2年,投片需要花費(fèi)約1年.如果流片失敗,投入的時間和精力將會付諸東流,風(fēng)險(xiǎn)相當(dāng)大[1].因此,如果有辦法加快芯片設(shè)計(jì)的效率,實(shí)現(xiàn)芯片的敏捷開發(fā),那么將會對學(xué)術(shù)研究和芯片產(chǎn)業(yè)帶來巨大的影響.

      伯克利的另一個研究團(tuán)隊(duì)在2010年的時候已經(jīng)考慮到這方面的問題了,他們在2012年的DAC會議上發(fā)表了一門新的編程語言Chisel[6]來進(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)硬件描述語言不具備的很多高級特性,但Chisel還是一門硬件構(gòu)建語言,而不是高層次綜合語言.硬件構(gòu)建語言用于描述電路具體如何構(gòu)建,而高層次綜合則用于描述算法的流程.

      3.1 信號整體連接

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

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

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

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

      3.2 元編程

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

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

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

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

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

      Chisel可以使用面向?qū)ο缶幊痰奶匦詠硖岣哂布_發(fā)的效率,在這里我們介紹繼承和重載.

      3.3.1 繼 承

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

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

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

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

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

      3.3.2 重 載

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

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

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

      3.4 函數(shù)式編程

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

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

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

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

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

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

      3.5 開發(fā)語言對比小結(jié)

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

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

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

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

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

      4.1 Chisel與Verilog編碼效率對比

      我們團(tuán)隊(duì)曾經(jīng)由于項(xiàng)目需要,期望盡快實(shí)現(xiàn)一個簡單的共享二級緩存.該二級緩存無需實(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的二級緩存源代碼,也修改過賽靈思系統(tǒng)緩存,在其中成功添加基于標(biāo)簽的路劃分功能,具有豐富的緩存設(shè)計(jì)經(jīng)驗(yàn).這位工程師使用傳統(tǒng)開發(fā)模式,選擇Verilog語言來開發(fā)這個二級緩存,并決定從零開始搭建測試環(huán)境,不復(fù)用任何代碼.他主要開發(fā)了6周,編寫了約1 700行有效代碼.遺憾的是,截至本文投稿為止,他開發(fā)的二級緩存模塊仍然無法在標(biāo)簽化RISC-V項(xiàng)目上成功運(yùn)行.

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

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

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

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

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

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

      4.2.1 逐句翻譯

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

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

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

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

      4.2.2 使用Chisel高級特性

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

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

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

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

      5 改進(jìn)與展望

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

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

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

      但是,芯片敏捷開發(fā)的趨勢是不可阻擋的.據(jù)了解,最近一兩年越來越多大型IT企業(yè)傳出了擁抱RISC-V的消息[33-34],甚至一些初創(chuàng)企業(yè)也嘗試使用Chisel進(jìn)行項(xiàng)目開發(fā),并表示效果不錯.因此只要給予充分的時間,上述問題是可以解決的.甚至上述部分問題已經(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)證周期更長、完整的硬件設(shè)計(jì)流程需要更多更專業(yè)的技能(總體架構(gòu)設(shè)計(jì)、微結(jié)構(gòu)設(shè)計(jì)、前端RTL設(shè)計(jì)和驗(yàn)證、后端物理設(shè)計(jì)和驗(yàn)證)、硬件成品無法進(jìn)行頻繁的更新等.但伯克利研究團(tuán)隊(duì)認(rèn)為,正是因?yàn)檫@些差異,我們更需要借鑒軟件開發(fā)的經(jīng)驗(yàn)來提升硬件開發(fā)的效率.例如通過高效的工具和生成器來實(shí)現(xiàn)代碼復(fù)用,縮短硬件開發(fā)周期,節(jié)省驗(yàn)證成本;培養(yǎng)全棧的工程團(tuán)隊(duì)來節(jié)省溝通成本;通過管理多個未完成原型的版本來擁抱需求的變化.這些做法背后的原理,和軟件敏捷開發(fā)的理念是非常相似的.

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

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

      6 總 結(jié)

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

      猜你喜歡
      指令集開源代碼
      3DNow指令集被Linux淘汰
      五毛錢能買多少頭牛
      創(chuàng)世代碼
      動漫星空(2018年11期)2018-10-26 02:24:02
      創(chuàng)世代碼
      動漫星空(2018年2期)2018-10-26 02:11:00
      創(chuàng)世代碼
      動漫星空(2018年9期)2018-10-26 01:16:48
      創(chuàng)世代碼
      動漫星空(2018年5期)2018-10-26 01:15:02
      大家說:開源、人工智能及創(chuàng)新
      開源中國開源世界高峰論壇圓桌會議縱論開源與互聯(lián)網(wǎng)+創(chuàng)新2.0
      實(shí)時微測量系統(tǒng)指令集及解析算法
      開源計(jì)算機(jī)輔助翻譯工具研究
      襄垣县| 翁牛特旗| 兰溪市| 高碑店市| 望江县| 宁强县| 芜湖县| 中牟县| 朝阳区| 娱乐| 清涧县| 宜城市| 宝丰县| 宜都市| 北海市| 龙山县| 麻城市| 福清市| 泸定县| 长沙县| 梨树县| 新和县| 栾城县| 沂水县| 沿河| 成都市| 明光市| 阳东县| 新巴尔虎右旗| 中西区| 中牟县| 卢湾区| 桐乡市| 梁河县| 东山县| 醴陵市| 建水县| 朝阳县| 栾川县| 南漳县| 临沂市|