各位的小伙伴們大家好呀。
提到CPU,
大家首先就會想到"卡脖子"事件。
X86和ARM的IP授權雖然方便,但是不自主和不可控,
一被限制就可能導致國內一夜間"無芯"可用。
今天我們就來聊聊一個解決芯片卡脖子的有效方式--開源RISC-V芯片。
1.RISC-V概述及歷史 ? RISC-V 起源于加州大學伯克利分校。在 2010 年夏季,Krste Asanovic 教授帶領他的兩個學生 Andrew Waterman 和 Yunsup Lee 啟動了一個3個月的項目,目標是針對 x86 和ARM 指令集架構復雜和需要IP 授權的問題,開發一個簡化和開放的指令集架構。RISC-V基金會創建于2015 年,是一家非營利組織。基金會董事會最早由 Bluespec、Google、Microsemi、NVIDIA、NXP、UC Berkeley、Western Digital 七家單位組成,目前的主席是 Krste Asanovi 教授。 ? 成員單位現在已經比較多了: ?
? 基金會為核心芯片架構制定標準和建立生態,標準公開免費下載。基金會旗下有超過 1 000 家成員,包括高通、NXP、阿里巴巴和華為等。RISC-V 基金會成員可以使用 RISC-V 商標。RISC-V 指令集架構采用開源BSD 授權,任何企業、高校和個人都可以遵循RISC-V 架構指南設計自己的 CPU.秉承開放、中立的宗旨,RISC-V 基金會總部從美國遷往瑞士,并于 2020年3月完成在瑞士的注冊,更名為 RISC-V 國際基金會(RISC-V International Association)。近日,基金會 CEO Calista Redmond 撰文 RISC-V Catalyst for ChangRISC-V,文章指出,RISC-V 標準是免費和開放的,沒有任何一個實體可以控制RISC-V 技術。企業、學術界和機構都可以自由地在 RISC-V 指令集架構上進行創新,共同推動計算前沿技術的迅速發展。 ?
自RISC-V 架構誕生以來,市場上已有數十個版本的 RISC-V 內核和SoC芯片它們中的一部分是開源免費的,而商業公司開發的 RISC-V 處理器內核和平臺是需要商業授權的。某些商業公司開發用于內部使用的 RISC-V 內核,但也可以開源運作。西部數據的 SweRV架構(RV32IMC)是 RISC-V內核處理器的典型代表,它是一個32 bit 順序執行指令架構,具有雙向超標量設計和9 級流水線,采用 28 nm 工藝技術實現,運行頻率高達 1.8 GHz,可提供 4.9 CoreMark/MHz 的性能,略高于ARM的 Cortex A15,已經在西部數據的 SSD和 HDD 控制器上使用,SweRV項目是一個開源項目(Chip Alliance)典型的開源 RISC-V 內核有 Rocket Core,它是加州大學伯克利分校開發的一個經典的 RV64 設計。伯克利分校還開發了一個 BOOM Core,它與 Rocket Core不同的是面向更高的性能。蘇黎世理工大學(ETH Zurich)開發的 Zero-riscy,是經典的RV32 設計。蘇黎世理工大學還開發了另外一款 RISC-V R15CY Core,可配置成RV32E,面向的是超低功耗、超小芯片面積的應用場景。由 Clifford Wolf 開發的RISC-V Core-Pico RV32,其內核重點在于追求面積和 CPU頻率的優化。 ?
開源的 RISC-V 內核非常適用于研究和教學,但用于商業芯片設計還有許多工作要做。SiFive(美國賽防科技)由 Yunsup Lee 創立,他也是 RISC-V 的創始人之一。2017 年 SiFive公司發布首個 RISC-V 內核SOC平臺家族,以及相關支持軟件和開發板。在這些芯片中,包括采用 28 nm 制造技術,支持 Linux 操作系統的64位多核CPUU500,以及采用 180 nm 制造技術的多外設低成本IOT 處理器內核 E300。 ? 國產處理器芯片起步較晚,從2013年至今,集成電路每年的進口額均超過了 2000 億美元。RISC-V和AI(人工智能)芯片是我國最有希望突破的領域之一。RISC-V使用的領域還是對于生態依賴比較小的嵌入式系統或者新興的IoT(物聯網)、邊緣計算、人工智能領域,但RISC-V得到了產業界和社區的廣泛支持,同時,現在很多企業開始對 RISC-V 重視,所以說RISC-V 應用前景會非常樂觀。 ?
? 2.RISC-V指令集特點
? CPU 支持的所有指令和指令的字節級編碼就是這個 CPU 的指令集架構(Instruction Set Architecture,ISA),指令集在計算機軟件和硬件之間搭起了一座橋梁。不同的 CPU 家族,例如 86、PowerPC 和 ARM,都有不同的 ISA。RISC-VISA 開源,更確切地講是它的指令集規范和標準開源。 ? RISC-V指令集是基于精簡指令集計算原理建立的開放指令集架構(ISA),RISC-V是在指令集不斷發展和成熟的基礎上建立的全新指令。RISC-V ISA可以免費使用,允許任何人設計、制造和銷售 RISC-V 芯片和軟件。 ? ? ? RISC-V(讀音“risk-five”)是一個新的指令集體系結構(ISA),它最初用于支持計算機 體系結構研究和教學,但現在我們希望它也成為一個對于工業實現來說標準、免費、開放的 體系結構。RISC-V官方定義 RISC-V 的目的包括:
一個完全開放的 ISA,能夠自由地提供給學術界和工業界使用。
一個真正的 ISA,能夠適合直接在硬件上實現,而不僅僅是適用于模擬或者二進制 翻譯。
一個避免對某一種微體系結構風格(例如微編碼、按序、去耦合、亂序等)或者實 現技術(例如全定制、ASIC、FPGA)“過度體系結構化(over-architecting)”的 ISA, 但是也能夠非常高效地利用任何一種技術實現。
包含一個小的基本整數 ISA(可以作為一個定制的加速器的基礎或者作為教學用途) 和多個可選的標準擴展的 ISA,可以支持通用的軟件開發。
支持修訂的 2008 IEEE-754浮點標準。
ISA 支持豐富的用戶級 ISA 擴展和各種特殊的變種。
對應用程序、操作系統內核、硬件實現的32 位、64 位地址空間變種。
ISA 支持高度并行的多核、眾核實現,包括異構多處理器等。
可選的變長指令,以支持擴展可用的指令編碼空間、支持一個可選的密集指令編碼, 以提高性能、靜態代碼大小和能耗效率。
一個可完全虛擬化的 ISA,以簡化虛擬機監督管理器(Hypervisor)的開發。
ISA 支持新的管理員級(supervisor-level)和虛擬機監督管理級(hypervisor-level) ISA 設計。
3.關于RISC-V的V
RISC-V 這個名字,代表了 UC Berkeley 大學設計的第五代主要的 RISC ISA(前 四個是 RISC-I[18]、RISC-II[11]、SOAR[27]和 SPUR[14])。羅馬數字“V”也暗示 了“變種(Variations)”和“向量(Vectors)”,以支持各種體系結構研究,包括各種數據并行加速器,也是這個 ISA 設計的明確目標。 ? ?
4、發明者為什么要開發一個新的ISA
關于為什么要有RISC-V,發明者這么說: 硬件上實現一些研究思想特別感興趣(自從這個規范的第一個版本發布之后, 我們已經完成了 11 塊不同的 RISC-V 硅片的制造),在課堂上提供給學生真實 的實現(在 Berkeley,RISC-V 處理器的 RTL 設計代碼已經用于多個本科生、研 究生的課程)。在我們當前的研究中,由于傳統晶體管不斷變小帶來的能耗約 束,我們對特殊、異構的加速器特別感興趣。我們需要一個高度靈活、高度可 擴展的基本 ISA,在此基礎上可以構建我們自己的研究。 ? 我們總被問及這樣一個問題“為什么要開發一個新的 ISA?”。使用一個已 有的商業化的 ISA,其顯而易見最大的優勢在于其已經具備了豐富和廣泛支持。 ? 的軟件生態系統,包括開發工具和可移植的應用程序,而在研究和教學中,這 些都是可以利用的。其他的好處包括擁有大量的文檔和教程示例。然而,我們 的經驗證明,在科研和教學中使用商業的指令集,在實際中獲得的好處很小, 而且掩蓋不了它的缺點: ?
商業 ISA 都是私有的。除了 SPARC V8(它是一個開放的IEEE 標準[1]), 絕大多數 ISA 的擁有者非常小心地保護他們的知識產權,并且并不歡 迎自由實現的競爭實現。對于僅僅使用軟件模擬器來進行學術研究和 教學來說,這并不是一個問題,但是對于那些希望分享真實硬件實現 的科研小組來說,這就是一個大問題。對于那些被強迫信任僅有的幾 個商業 ISA 實現,而不允許創建自己的全新實現(clean room implementation)的企業來說,這也是一個大問題。我們并不能確保 所有的 RISC-V 實現沒有侵犯第三方專利,但是我們確保我們絕不會 起訴一個 RISC-V 的實現者。
? (1)商業 ISA 僅僅在某個市場領域比較流行。當書寫此文檔時,最顯而易 見的例子就是 ARM 體系結構在服務器領域并沒有得到很好的支持, 而 Intel x86 體系結構(或者幾乎任何一種其他的體系結構)在移動領 域并沒有得到很好的支持,雖然 Intel 和 ARM 正在試圖進入對方的市 場領域。另外一個例子是 ARC 和 Tensilica,它們提供了可擴展的內核, 但是只關注嵌入式市場。這種市場的劃分,使得支持某種特定商業 ISA 獲得的好處大大削弱,因為事實上軟件生態系統只存在于某個領 域,到了別的領域,必須重新構建。
(2)商業 ISA 此起彼伏。以前基于商業 ISA 構建的研究基礎設施,并不流 行(SPARC、MIPS),甚至不再生產(Alpha)。這對于一個活躍的軟件 生態系統來說是一個大損失,一些圍繞 ISA 和支持工具的知識產權問 題,也使得感興趣的第三方難以繼續支持這個 ISA。一個開放的 ISA 也可能失去流行性,但是任何感興趣的人,都可以繼續使用它并研發 相應的生態系統。
(3)流行的商業 ISA 是復雜的。占統治地位的 ISA(x86 和 ARM)若要支 持常用軟件棧和操作系統,那么其硬件實現都非常復雜。更糟糕的是, 幾乎所有的復雜性都來自于糟糕的、或者至少是過時的ISA設計考慮, 而不是那些真正提高效率的特性。
(4)僅靠商業 ISA 并不足以運行應用程序。即使我們努力實現了一個商業 ISA,對于運行一個現有的應用程序來說,仍然是不夠的。絕大多數 應用程序需要一個完整的 ABI(application binary interface)才能運行, 而不僅僅是用戶級 ISA。絕大多數 ABI 依賴于庫(libraries),而庫又 依賴于操作系統支持。為了運行一個已有的操作系統,需要實現管理 員級 ISA、OS 需要的設備接口。這些通常并沒有很好的規范,而在實 現上比用戶級 ISA 具有更大的復雜性。
(5)流行的商業 ISA 不是為可擴展性設計的。占統治地位的商業 ISA 并沒 有為可擴展性而進行特殊的設計,結果就是,隨著后續指令集不斷地 增長,指令編碼的復雜度大幅度增加。而類似 Tensilica(被 Cadence 公司收購)、ARC(被 Synopsys 公司收購)這樣的公司,它們圍繞 可擴展性構建了 ISA 和工具鏈(toolchain),但是它們瞄準的是嵌入 式應用而不是通用計算系統。
一個修改過的商業 ISA 實際上是一個新的 ISA。我們的一個主要目標 是支持體系結構研究,包括主要的 ISA 擴展。即使是很小的擴展,也 減弱了使用標準 ISA 而帶來的好處,因為必須修改編譯器,而應用程 序必須從源代碼進行重新編譯,以利用這些擴展。引入了新的體系結 構狀態的大一些的擴展,也需要對操作系統進行修改。最終使得一個 修改的商業 ISA 變成一個新的 ISA,但是不得不肩負著所有基本 ISA 遺留下來的包袱。我們堅信 ISA 是整個計算系統中最重要的接口,沒有理由把這么重要的接 口變成私有的。占統治地位的商業 ISA 都是基于超過 30 年歷史的指令集。軟 件開發者應當能夠定位到一個開放標準的硬件目標機,商業處理器設計者應當 在實現質量上進行競爭。我們并不是第一個為了適合硬件實現而提出開放 ISA 設計的。我們也考慮 了其他現有的開放 ISA 設計,其中 OpenRISC 體系結構[17]與我們的目標最為 接近。 ? 我們由于幾個技術原因,并不采用 OpenRISC ISA: ?
1、OpenRISC 有條件碼(condition code)和分支延遲槽(branch delay slot), 這對于更高性能的實現來說,變得更為復雜。 ? 2、OpenRISC 使用了 32 位定長指令編碼和 16 位立即數,阻礙了更密集 的指令編碼,并對后續 ISA 擴展限制了空間。
? 3、OpenRISC 并不支持 2008 修訂的 IEEE-754 浮點標準。 ? 在我們開始的時候,64 位 OpenRISC 設計并沒有完成。從零開始,我們可以設計一個符合我們所有需求的 ISA,當然,這花了比 我們在開始時預期多得多的努力。現在我們在構建 RISC-V ISA 基礎設施上投入 了大量的精力,包括文檔、編譯器工具鏈、操作系統移植、參考 ISA 模擬器、 FPGA 實現、高效的 ASIC 實現、體系結構測試套件、教學材料等。自本文檔的 上一個版本以來,在學術界和工業界對此 RISC-V ISA 都有大量的吸收(uptake), 我們也創建了非盈利的 RISC-V 基金會來保護和推進這個標準。RISC-V 基金會的 網址在 http://riscv.org,包含了基金會成員最新的信息和各種各樣使用 RISC-V 的開源項目。 ?
? 5.RISC-V指令集的優勢
(1)完全開源。對于 RISC-V 指令集的使用,RISC-V基金會不收取高額的授權費。開源采用寬松的BSD 協議,企業可以完全自由免費使用,同時也允許企業添加自有指令集,而不必開放共享,實現差異化發展。
? (2)架構簡單。RISC-V設。處理器領域,流的架構為x8與ARM架構。x86與ARM架構的發展過程也伴隨了現代處理器架構技術的不斷發展成熟,但作為商用的架構,為了能夠保持架構的向后兼容性,不得不保留許多過時的定義,導致其指令數目多,指令冗余嚴重,文檔數量龐大,所以要在這些架構上開發新的操作系統或者直接開發應用門檻很高。而RISC-V 架構則完全拋棄包袱,借助計算機體系結構經過多年的發展已經成為比較成熟的技術的優勢,從輕上路。RISC-V基礎指令集只有40多條,加上其他的模塊化擴展指令總共也就幾十條指令。RISC-V的規范文檔僅有145頁,而特權架構文檔的篇幅也僅為 91頁。 ?
(3)易于移植操作系統。現代操作系統都做了特權級指令和用戶級指令的分離,特權指今只能由操作系統調用,而用戶級指令才能在用戶模式調用,保障操作系統的穩定。RISC-V提供了特權級指令和用戶級指令,同時提供了詳細的 RISC-V 特權級指令規范和 RISC-V 用戶級指令規范的詳細信息,使開發者能非常方便地移植 Linux 和 UNIX 系統到RISC-V平臺上。
? (4)模塊化設計。RISC-V 架構不僅短小精悍,其不同的部分還能以模塊化的方式組紗在一起,從而試圖通過一套統一的架構滿足各種不同的應用場景。用戶能夠靈活選擇不同的模塊組合,來實現自己定制化設備的需要,比如針對小面積低功耗嵌入式場景,用戶可以選擇RV32IC 組合的指令集,僅使用Machine Mode(機器模式);而高性能應用操作系統場景則可以選擇RV32IMFDC 指令集,使用 Machine Mode(機器模式)與User Mode()戶模式)兩種模式。
? (5)完整的工具鏈。對于設計CPU 來說,工具鏈是軟件開發人員和 CPU 交互的窗口,若沒有工具鏈,則對軟件開發人員開發軟件要求很高,甚至軟件開發者無法讓CPU 工作起來在CPU 設計中,工具鏈的開發是一個巨大的工作。如果用RISC-V來設計芯片,芯片設計公司則不用再擔心工具鏈問題,只需專注于芯片設計,RISC-V社區已經提供了完整的工具鏈 RISC-V 基金會持續維護該工具鏈。當前RISC-V的支持已經合并到主要的工具中,比如編評工具鏈 GCC、仿真工具 QEMU 等。 ? ?
6、RISC-V的特點
? 1)沒有立即數減法 ? 只有立即數加法指令(addi),沒有立即數減法指令(subi),那么減法怎么辦?無論是數學上還是程序上,x-y都等價于x+(-y),也就是說可以把減法變成加法,把被減數轉化成負數然后再加上減數就實現了和減法一樣的功能。正是基于這個原理,RISC-V只提供立即數加法,沒有提供立即數減法,如果需要立即數減法,那么就要麻煩編譯器把這個立即數轉化成負數,然后繼續使用加法。這也是 RISC-V將立即數作為有符號數處理的原因。 ?
2)x0 寄存器簡化指令集 ? 引入x0 寄存器后,很多特殊指令只需用普通的指令加上 x0 做操作數就能解決,指令的數量大大減少,處理器的解碼電路也大大簡化。
? 3)32 位常量 ? 之前使用的ARM 處理器是將立即數表示不下的常量存到常量池,然后用PC相關的LDR指令加載到寄存器。RISC-V 的常量完全是用指令拼接,不需要 Load 指令,使用 Load 指令需要額外的訪問周期。RISC-V 單條指令可以表示 12 位的有符號常量,超過 12 位需要兩條指令來合成。其中一條指令是 lui,lui 指令加載常量的高 20 位,低 12 位可以用addi指令上去,這個過程需要編譯器算出立即數到底是什么,因為 addi 指令執行的是有符號加法,其中的 12 位立即數會先被符號擴展成 32 位的有符號數再參與計算。ARM 的常量加載需要8個字節,一條指令加一個常量;RISC-V的常量加載也是需要8個字節,兩條指令,兩者占用的程序空間一樣。
? 4)只有小于和大于等于 ? RISC-V 的比較跳轉指令只有 blt 和 bge,即只有小于和大于等于。但大于和小于等于也是需要的,RISC-V用了一個很巧妙的辦法用兩條指令實現了四條指令的工作,將 blt 的兩個參與比較的操作數位置換一下就有了 bgt(大于跳轉),將bge 的兩個參與比較的操作數位置換一下就有了 ble(小于或等于跳轉)。
? 5)讓編譯器做更多工作 ? 對 RISC 的理解是處理器盡量少做、編譯器盡量多做,這是非常有道理的,畢竟編譯的次數遠少于執行的次數。上面幾點就提到不少要讓編譯器多做的工作,又例如 B-type 是比較跳轉指令的格式,J-type 是長跳轉或函數調用指令格式,注意它們的立即數排列次序,把填充這里的立即數交給了鏈接器的工作。這樣排放偏移地址立即數是為了簡化處理器的設計,但明顯給編譯器增加了工作。
? 6)其他省掉的指令 ? 很多常用的指令都被省掉了,比如nop、move、not、neg 等,但所有這些功能都還有只不過都是用其他的指令來等價實現,比如not 指令是用xorird,rs,-1實現。 ? ?
7、RISC-V的x0寄存器 ? Linux 有兩個特殊的設備:/dev/zero 和/dev/null。從/dev/zero 可以源源不斷地讀到0,往dev/null 寫的任何內容都被丟棄。如果要創建一個需要填0的文件,就從dev/zero 拷貝,如果要丟棄一些輸出,就把輸出重定向到/dev/null。RISC-V的x0寄存器就相當于是硬件版的/dev/zero 和/dev/null的組合體。從0讀出來的總是0,往x0 寫進去的總是被丟棄。所以 x0 提供兩種功能:一是提供常量0,在軟件編程中0可以說是最常用的常量:二是提供一個可以丟棄結果的場所。有了 x0 寄存器,很多本來需要單獨指令的操作只要在普通的指令前加上x0 就可以實現。 ? (1)nop 空指令,RISC-V沒有提供nop 指令,而是用addi x0,x0,0來實現空指令,這條addi 使用x0作為目標存器,會丟棄結果,所以這條指令不會對程序狀態產生任何影響,和空指令是完全等價的,這就不需要單獨的空指令了。 ? (2)neg 取負數指令,RISC-V用 sub rd,x0,rs 來實現,x0-rs 等價于0-rs,等價于-rs,有了x0,就可以用更普通的減法指令來實現取負數指令。
? (3)j跳轉指令,RISC-V 沒有單獨的跳轉指令,只有jal跳轉鏈接指令,跳轉之前總是要把下一條指令的地址拷貝到寄存器,但是如果用 x0 作為jal 的操作寄存器,即把下-條指令的地址拷貝到 x0,那么效果就等價于j跳轉指令了,因為寫入 x0 的任何值都會被丟棄。
? (4)beqz等于零跳轉指令等一系列和0比較的跳轉指令,程序中和0比較是相當常見的操作,RISC-V 中和0比較的指令是普通的比較跳轉指令,是用 x0 寄存器做指令的操作數。還有很多其他這樣的指令,用普通的指令加上 x0 做操作數,就實現了那些沒有x0 寄存器的處理器需要單獨指令或者需要組合兩條指令才能實現的操作。
? 審核編輯:黃飛
?
評論
查看更多