RISC-V學習筆記

it智能化專欄 發佈 2022-12-08T08:14:20.798056+00:00

在 2010 年夏季,Krste Asanovic 教授帶領他的兩個學生 Andrew Waterman 和 Yunsup Lee 啟動了一個3個月的項目,目標是針對 x86 和ARM 指令集架構複雜和需要IP 授權的問題,開發一個簡化和開放的指令集架構。

1.概述以及RISC-V的歷史

國產處理器晶片起步較晚,從2013年至今,集成電路每年的進口額均超過了 2000 億美元。RISC-V和AI(人工智慧)晶片是我國最有希望突破的領域之一。RISC-V使用的領域還是對於生態依賴比較小的嵌入式系統或者新興的IoT(物聯網)、邊緣計算、人工智慧領域,但RISC-V得到了產業界和社區的廣泛支持,同時,現在很多企業開始對 RISC-V 重視,所以說RISC-V 應用前景會非常樂觀。

CPU 支持的所有指令和指令的字節級編碼就是這個 CPU 的指令集架構(Instruction Set Architecture,ISA),指令集在計算機軟體和硬體之間搭起了一座橋樑。不同的 CPU 家族,例如 86、PowerPC 和 ARM,都有不同的 ISA。RISC-VISA 開源,更確切地講是它的指令集規範和標準開源。

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。

2.RISC-V指令集特點

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浮點標準[10]。
  • 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,其顯而易見最大的優勢在於其已經具備了豐富和廣泛支持。

的軟體生態系統,包括開發工具和可移植的應用程式,而在研究和教學中,這 些都是可以利用的。其他的好處包括擁有大量的文檔和教程示例。然而,我們 的經驗證明,在科研和教學中使用商業的指令集,在實際中獲得的好處很小, 而且掩蓋不了它的缺點:

l 商業 ISA 都是私有的。除了 SPARC V8(它是一個開放的IEEE 標準[1]), 絕大多數 ISA 的擁有者非常小心地保護他們的智慧財產權,並且並不歡 迎自由實現的競爭實現。對於僅僅使用軟體模擬器來進行學術研究和 教學來說,這並不是一個問題,但是對於那些希望分享真實硬體實現 的科研小組來說,這就是一個大問題。對於那些被強迫信任僅有的幾 個商業 ISA 實現,而不允許創建自己的全新實現(clean room implementation)的企業來說,這也是一個大問題。我們並不能確保 所有的 RISC-V 實現沒有侵犯第三方專利,但是我們確保我們絕不會 起訴一個 RISC-V 的實現者。

  • 商業 ISA 僅僅在某個市場領域比較流行。當書寫此文檔時,最顯而易 見的例子就是 ARM 體系結構在伺服器領域並沒有得到很好的支持, 而 Intel x86 體系結構(或者幾乎任何一種其他的體系結構)在移動領 域並沒有得到很好的支持,雖然 Intel 和 ARM 正在試圖進入對方的市 場領域。另外一個例子是 ARC 和 Tensilica,它們提供了可擴展的內核, 但是只關注嵌入式市場。這種市場的劃分,使得支持某種特定商業 ISA 獲得的好處大大削弱,因為事實上軟體生態系統只存在於某個領 域,到了別的領域,必須重新構建。
  • 商業 ISA 此起彼伏。以前基於商業 ISA 構建的研究基礎設施,並不流 行(SPARC、MIPS),甚至不再生產(Alpha)。這對於一個活躍的軟體 生態系統來說是一個大損失,一些圍繞 ISA 和支持工具的智慧財產權問 題,也使得感興趣的第三方難以繼續支持這個 ISA。一個開放的 ISA 也可能失去流行性,但是任何感興趣的人,都可以繼續使用它並研發 相應的生態系統。
  • 流行的商業 ISA 是複雜的。占統治地位的 ISA(x86 和 ARM)若要支 持常用軟體棧和作業系統,那麼其硬體實現都非常複雜。更糟糕的是, 幾乎所有的複雜性都來自於糟糕的、或者至少是過時的ISA設計考慮, 而不是那些真正提高效率的特性。
  • 僅靠商業 ISA 並不足以運行應用程式。即使我們努力實現了一個商業 ISA,對於運行一個現有的應用程式來說,仍然是不夠的。絕大多數 應用程式需要一個完整的 ABI(application binary interface)才能運行, 而不僅僅是用戶級 ISA。絕大多數 ABI 依賴於庫(libraries),而庫又 依賴於作業系統支持。為了運行一個已有的作業系統,需要實現管理 員級 ISA、OS 需要的設備接口。這些通常並沒有很好的規範,而在實 現上比用戶級 ISA 具有更大的複雜性。
  • 流行的商業 ISA 不是為可擴展性設計的。占統治地位的商業 ISA 並沒 有為可擴展性而進行特殊的設計,結果就是,隨著後續指令集不斷地 增長,指令編碼的複雜度大幅度增加。而類似 Tensilica(被 Cadence 公司收購)、ARC(被 Synopsys 公司收購)這樣的公司,它們圍繞 可擴展性構建了 ISA 和工具鏈(toolchain),但是它們瞄準的是嵌入 式應用而不是通用計算系統。

一個修改過的商業 ISA 實際上是一個新的 ISA。我們的一個主要目標 是支持體系結構研究,包括主要的 ISA 擴展。即使是很小的擴展,也 減弱了使用標準 ISA 而帶來的好處,因為必須修改編譯器,而應用程 序必須從原始碼進行重新編譯,以利用這些擴展。引入了新的體系結 構狀態的大一些的擴展,也需要對作業系統進行修改。最終使得一個 修改的商業 ISA 變成一個新的 ISA,但是不得不肩負著所有基本 ISA 遺留下來的包袱。我們堅信 ISA 是整個計算系統中最重要的接口,沒有理由把這麼重要的接 口變成私有的。占統治地位的商業 ISA 都是基於超過 30 年歷史的指令集。軟 件開發者應當能夠定位到一個開放標準的硬體目標機,商業處理器設計者應當 在實現質量上進行競爭。我們並不是第一個為了適合硬體實現而提出開放 ISA 設計的。我們也考慮 了其他現有的開放 ISA 設計,其中 OpenRISC 體系結構[17]與我們的目標最為 接近。

我們由於幾個技術原因,並不採用 OpenRISC ISA:

  • OpenRISC 有條件碼(condition code)和分支延遲槽(branch delay slot), 這對於更高性能的實現來說,變得更為複雜。
  • OpenRISC 使用了 32 位定長指令編碼和 16 位立即數,阻礙了更密集 的指令編碼,並對後續 ISA 擴展限制了空間。
  • 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/。從/dev/zero 可以源源不斷地讀到0,往dev/ 寫的任何內容都被丟棄。如果要創建一個需要填0的文件,就從dev/zero 拷貝,如

果要丟棄一些輸出,就把輸出重定向到/dev/。RISC-V的x0寄存器就相當於是硬體版的/dev/zero 和/dev/的組合體。從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 寄存器的處理器需要單獨指令或者需要組合兩條指令才能實現的操作。

參考資料:

1、risc-v.org

2、《基於risc-v的人工智慧應用開發》

3、《深入理解RISC-V程序開發》

4、《計算機體系結構與SoC設計》

處理器基礎知識合集

RISC-V學習筆記【1】RISC-V概述

【1】8位、16位、32位、64位

除了 CISC與 RISC 之分,處理器指令集架構的位數也是一個重要的概念。通俗來講處理器架構的位數是指通用寄存器的寬度,其決定了尋址範圍的大小、數據運算能力的強弱譬如32位架構的處理器,其通用寄存器的寬度為 32位,能夠尋址的範圍為 232Byte,即4GB的尋址空間,運算指令可以操作的操作數為 32 位。

注意:處理器指令集架構的寬度和指令的編碼長度無任何關係。並不是說 64 位架構的指令長度為 64位(這是一個常見的誤區)。從理論上來講,指令本身的編碼長度越短越好因為可以節省代碼的存儲空間。因此即便在64 位的架構中,也大量存在16位編碼的指

且基本上很少出現過 64 位長的指令編碼。

綜上所述,在不考慮任何實際成本和實現技術的前提下,理論上來講:。通用寄存器的寬度,即指令集架構的位數越多越好,因為這樣可以帶來更大的尋址範圍和更強的運算能力。

指令編碼的長度越短越好,因為這樣可以更加節省代碼的存儲空間常見的架構位數分為8位、16位、32位和64位。早期的單片機以8位和 16 位為主,知名的 8051 單片機是使用廣泛的8位架構。

目前主流的嵌入式微處理器均在向 32 位架構轉移。

目前主流的移動手持、個人計算機和伺服器領域,均使用 64 位架構。

【2】CISC、RISC

常見的指令集架構大體上可以分為兩大類:複雜指令集體系(CISC)和精簡指令集體系(RISC)。

RISC全稱Reduced Instruction Set Compute,精簡指令集計算機。

CISC全稱Complex Instruction Set Computers,複雜指令集計算機。

CISC既有簡單指令也有複雜指令,後來人們發現典型程序中80%的語句都是使用計算機中20%的指令,而這20%的指令都屬於簡單指令;因此花再多時間去研究複雜指令,也僅僅只有20%的使用概率,並且複雜指令會影響計算機的執行速度。既然典型程序的80%都是使用簡單指令完成,那剩下的20%語句用簡單語句來重新組合一下模擬這些複雜指令就行了,而不需要使用這些複雜指令,於是RISC就出現了。

RISC的主要特點:

1)選取使用頻率較高的一些簡單指令以及一些很有用但不複雜的指令,讓複雜指令的功能由使用頻率高的簡單指令的組合來實現。

2)指令長度固定,指令格式種類少,尋址方式種類少。

3)只有取數/存數指令訪問存儲器,其餘指令的操作都在寄存器內完成。

4)CPU中有多個通用寄存器(比CISC的多)

5)採用流水線技術(RISC一定採用流水線),大部分指令在一個時鐘周期內完成。採用超標量超流水線技術,可使每條指令的平均時間小於一個時鐘周期。

6)控制器採用組合邏輯控制,不用微程序控制。

7)採用優化的編譯程序

CICS的主要特點:

1)指令系統複雜龐大,指令數目一般多達200~300條。

2)指令長度不固定,指令格式種類多,尋址方式種類多。

3)可以訪存的指令不受限制(RISC只有取數/存數指令訪問存儲器)

4)各種指令執行時間相差很大,大多數指令需多個時鐘周期才能完成。

5)控制器大多數採用微程序控制。

6)難以用優化編譯生成高效的目標代碼程序

RISC與CISC的比較

1.RISC比CISC更能提高計算機運算速度;RISC寄存器多,就可以減少訪存次數,指令數和尋址方式少,因此指令解碼較快。

2.RISC比CISC更便於設計,可降低成本,提高可靠性。

3.RISC能有效支持高級語言程序。

4.CISC的指令系統比較豐富,有專用指令來完成特定的功能,因此處理特殊任務效率高。

複雜指令集最常見的例子是現在絕大多數家用計算機和網絡伺服器所使用的 AMD64 指令集(也叫 x86-64、x86_64、Intel 64、EM64T 等等,本文以發明人為基準稱為 AMD64。)除此以外有一定使用量,和有歷史意義的複雜指令集還有 IA-32、MC68000、MOS6502、Intel 8051、Intel 8080 等等。複雜指令集其複雜在於指令種類數量巨大,非常多次常用到不常用的功能都會被整合進處理器指令集中。同時複雜指令集系統每條指令的操作數尋址方式複雜,幾乎所有指令都可以直接訪問內存;相應的指令的機器碼編碼方式複雜,普遍使用不定長指令等。同時,複雜指令集系統一般沒有獨立的專用內存訪問指令,處理器內所設置的通用寄存器數量也偏少。(例如 IA-32 沒有嚴格意義上的通用整數寄存器,到了 AMD64 也才勉強設置了八個通用整數寄存器。)

精簡指令集最常見的例子則是常見於智能設備和嵌入式平台的 ARM 指令集家族。除此以外除此以外有一定使用量,和有歷史意義的精簡指令集還有龍芯 LoongArch、MIPS、RISC-V、PowerPC、AVR 等等。精簡指令集其精簡在於指保留最基本最必要的指令,將複雜功能完全交給上層的軟體算法和下層的專用外設去解決。同時精簡指令集系統指令尋址方式往往非常單一,除了專門的訪存指令以外所有指令都只能在寄存器範圍內操作,相應的精簡指令集系統普遍使用固定長度指令,也會配備相對比較多的通用寄存器。(例如上個世紀的 ARMv4T、MIPS32 就都已經有 29~31 個通用寄存器了,相比於同時期 IA-32 的 0 個。)

實際到了應用層面上,對於高級語言程序來說,對於處理器設計來說,兩種指令集架構分類的實際差異已經不大了。Intel 和 AMD 的 AMD64 實現都使用了微代碼,而從複雜指令翻譯出來的微代碼普遍都用了類 RISC 設計。本世紀初的時候還普遍認為複雜指令集處理器速度更快,到了現在精簡指令集已經很強大了,完全比CISC更快。有些CISC最終也是轉化為RISC進行執行了。

【3】8位的CISC——8051

8位和CISC兩個似乎是矛盾的,但是8051活生生的輝煌了40年。

說起 8051 內核,幾乎無人不知無人不曉。8051 作為一款生了數十年之久的微處理器內核,在8位入式微處理器內核領域,它是當之無愧的傳「前輩」

自從Inlel於1980年為入式系統開發Intel MCS-51(通常簡稱 8051)單晶片微控制(單片機)至今,8051 內核架構已經走過將近 40個年頭。Intel 還以專利轉讓的形式8051內核轉讓給了許多其他半導體公司,這些公司進一步發展出不同型號基於 8051內核微控制器晶片,因此形成了一個龐大的 8051 家族。

幾十年發展下來的龐大的用戶群和生態環境,以及多年來眾多備受肯定的成功產品,可以說 8051內核幾乎成為8 位微處理器內核的業界標杆。8051 內核架構在 1998 年失去專利保護,久經沙場的它再次進發出強大的二次生命力,各種形式的 8051 架構 MCU(微控制器Microcontroller Unit)進一步湧入市場,各種基於 8051內核的晶片產品層出不窮,各種免費版本的 8051 內核IP 也可以從各種渠道獲取。

當然由於 8051 內核並沒有一個統一的組織和標準進行管理,所以也存在著體系結構浪亂,各種增強型複雜多樣的問題。雖然時常也都自稱為 8051 內核,但是其實各有差別,琅滿目讓人難以分辨。但是這絲毫不影響 8051 內核的經典地位,時至今日,雖然目前微處理器內核正在經歷著向32位架構遷移的大趨勢,但是 8051內核仍然有著舉足輕重的地位在大量的MCU、數模混合信號晶片、SoC 晶片中仍能看到 8051 內核的身影,並且在相當長的時間內,在適合8位架構處理器內核的應用領域中都將繼續使用 8051 內核,可以說是「廉頗雖老,尚能飯也」。

8051 內核能在嵌入式領域取得如此成功的地位,可以歸功於如下幾個方面的原因。

  • 廣泛的被認知度,簡單的體系結構。
  • 沒有智慧財產權的限制,商業和開源的版本眾多,非常適合中小型晶片公司採用。
  • 用龐大的用戶群以及相應的生態系統。
  • 成熟且免費的軟體工具鏈支持。

——你似乎感受到RISC-V從其一誕生就符合以上幾條的氣質。

儘管如此,8051作為一款誕生了接近 40 年的8位CISC(複雜指令集)架構內核,雖然是「老驥伏析,壯心不已」,但是由於其性能低下,尋址範圍受限,已經難以適應更多的新興應用領域。隨著IoT的發展和崛起,雖然嵌入式領域對於處理器內核的需求更加井噴,但是更多的是開始採用 32 位架構,且很多傳統的 8 位應用領域也在開始向著32位架構遷移。這樣ARM的Cortex-M系列有了成長的機會。

然而在20世紀80年代該單片機剛剛問世時,半導體的製造工藝還只能達到um 級,處理器所能達到的時鐘頻率偏低。而且當時硬體設計語言還處於起步階段也缺乏自動設計的工具,軟體多以手工彙編編程為主。這就導致流水線設計的優勢無法得到發揮,並且每條指令需要多個時鐘周期才能完成。由於上述原因,當時的指令集設計往往具有以下特點:

(1)儘量在每條指令中實現更多的功能。例如 8051的CJNE 指令,就需要在一條指令中依次實現:

①與累加器做減法

②修改進位標示

③將結果做相等比較

④根據比較結果決定是否跳轉

(2)指令集龐大,以實現更多的複雜功能。例如 8051 雖然是 8 位單片機其指令集卻包含高達 255 種不同的指令和格式

(3)由於以上兩點,導致變長指令的出現,以提高內存利用率。8051的指令就有單字節、雙字節與三字節三種不同的種類,而且除了對指令解碼以外,沒有其他的手段幫助判定指令長度。

(4)尋址方式眾多。例如在 8051 指令集中,對數值的操作包括如下方式

①立即數尋址。將常數包含在指令中。

② 直接尋址。將內存地址包含在指令中。

③間接尋址。將內存地址放入寄存器中,然後將寄存器地址包含在指令中.

④寄存器尋址。將操作數放入寄存器中,然後將寄存器地址包含在指令中

【4】8051具備CISC的所有缺點

1)儘量在每條指今中實現更多的功能

為了在實現這些複雜功能的同時保持高吞吐率,流水線的設計者不得不花更多的時間規劃流水線的各級。即便如此,有些指令依然無法實現單周期吞吐,例如上文提到的CJNE 指令,就需要兩個時鐘周期。

另外,現代的8051 處理器開發,早已經採用C語言代替了早期的彙編語言而高級語言的編譯器往往很難把這類複雜、多功能機器指令的威力全部發揮出來有違當初指令集的設計初衷。

當然,指令集複雜這個特點也並非一無是處。由於 CISC 指令集的指令複雜也使得其代碼密度(Code Density)一般要優於同等字寬的RISC處理器

2)龐大的指令集浪費邏輯資源

龐大的指令集必然導致指令的解碼階段變得更為複雜,需要耗費更多的邏輯資源。指令集被分為兩部分對它們各自的解碼分別占用了流水線的一級。這樣設計的原因之一就是為了在龐大指令集下實現高吞吐率、高時鐘頻率,而不得不做出的妥協。同樣時鐘頻率的RISC-V處理器,由於指今集比較精簡,就無須做這樣的妥協,從而大大節省了邏輯資源,簡化了流水線設計。

3)變長指令的出現,以提高內存利用率

8051的指令有單字節、雙字節和三字節三種不同的種類,除解碼(Decode)外沒有其他的手段幫助判定指令長度。這種變長的指令結構,導致指令之間的邊界很難判定,甚至有可能導致內存的非對齊讀取(Unaligned Memory Access),從而對流水線的取指器(Instruction Fetch)設計帶來挑戰。

8051的內存架構是哈佛架構,其代碼與數據在不同的地址空間中分開存放。這就使得代碼存儲部分可以單獨做一些優化設計。

由於8051指令集沒有其他輔助手段來幫助判定指令長度,為了確定指令的邊界,8051的取指器不得不為此花費比 RISC-V 更多的邏輯資源

4)眾多的尋址方式

由於8051存在眾多的尋址方式,使得指令集中的許多指令都可以訪間內存這導致流水線的數據衝突(Data Hazard)很難判斷,有時不得不通過硬體自動插入空操作( Operation,NOP)來保持數據的正確和完整。這樣既消耗了邏輯資源,又降低了流水線的效率,從而對功耗和性能造成雙重打擊。

參考資料及書目:

《基於FPGA與RISC-V的嵌入式系統設計》作者:顧長怡

《RISC-V嵌入式開發快速入門》作者:胡振波

《第六篇:CISC vs. RISC 引發的思考》知乎:Serena Wang

《(計算機組成原理)RISC與CISC的區別》CSDN:我真不聰明

關鍵字: