來源:Digi-Key 作者:Bill Giovino RISC-V 指令集架構(gòu) (ISA) 于 2010 年在伯克利問世。雖然 RISC 代表精簡指令集計算機/內(nèi)核,但制造商在使用 RISC ISA 時,總會忍不住在這里添加一條指令,在那里添加一種新尋址模式,填充操作碼映射表,最后導(dǎo)致架構(gòu)更像是 CISC(復(fù)雜指令集計算機),而不是 RISC。不過,伯克利的 RISC-V 開發(fā)人員非常嚴格地要求他們的內(nèi)核是真正的 RISC。RV32I RISC-V ISA 在最初設(shè)計時僅有 47 條基礎(chǔ)指令(這個數(shù)字對《星際迷航》的傳統(tǒng)影迷有一種特殊的意義),11 年之后,指令數(shù)還是這么多。 之所以保持較少的基礎(chǔ)指令數(shù),其原本的理念是復(fù)雜 CISC 指令可以通過一系列的簡單 RISC 指令實現(xiàn)。按照我的經(jīng)驗,這種做法是否能夠提高代碼效率和精簡代碼,要取決于應(yīng)用。過去它確實發(fā)揮過這樣的作用,以至于 Arm 將很多復(fù)雜指令添加到操作碼映射表。 雖然更多指令能夠幫助改進性能,但如果在 32 位內(nèi)核上運行 32 位指令,然后您希望能夠?qū)⒁恍?32 位指令壓縮為 16 位指令以節(jié)省空間,那么情況會變得更加復(fù)雜。然而,若要增加 16 位指令,內(nèi)核的操作碼映射表必須具有更多空間來容納這些壓縮指令,而增加 CISC 指令會減少可用操作碼數(shù)量。 在這種情況下,RISC-V 的優(yōu)勢真正得以發(fā)揮。Arm 后來增加了 Thumb2 壓縮指令格式,通過添加單獨的 16 位 ISA,將這些 16 位指令整合到現(xiàn)有的 ISA 中。但是,RISC-V ISA 從一開始設(shè)計時就提供了壓縮指令的選項,因而僅有一個 ISA。這樣可以使內(nèi)核保持簡單高效,也可以簡化半導(dǎo)體設(shè)計和測試。 利用乘法指令增強 RISC-V RV32I ISA 制造商可通過添加標準化指令擴展來擴展 47 條指令的 ISA(圖 1)。由于基礎(chǔ) ISA 沒有乘法或除法指令,因此 M 擴展提供了這種功能。例如,帶有 M 擴展的 RV32I 會被命名為 RV32IM。 ![]() 圖 1:通過添加標準化指令擴展(用內(nèi)核名稱后的字母后綴表示),可擴展 47 條指令的 RISC-V 基礎(chǔ) ISA。(圖片來源:RISC-V.org) 一個帶有 M 擴展的內(nèi)核示例是 SparkFun Electronics 的 RED-V Thing Plus,它采用開源 150 MHz Freedom E310 (FE310) 32 位 RISC-V 微控制器。該 FE310 內(nèi)核被命名為 RV32IMAC。請參考圖 1,除了基礎(chǔ)整數(shù)計算 (I) 能力之外,它還支持整數(shù)乘法 (M)、原子指令 (A) 和壓縮指令 (C)。 SparkFun 的 DEV-15799 RED-V(讀作“紅 5”)是一款 RISC-V 評估板(圖 2),搭載 32 MB 的程序存儲器 QSPI 閃存,帶有 USB-C 連接器,可連接到主機以獲取電源并進行編程和調(diào)試。另外還有一個連接器,可用于通過電池供電。 ![]() 圖 2:SparkFun DEV-15799 評估板用于評估開源 150 MHz FE310 RV32IMAC RISC-V 內(nèi)核。它通過 USB-C 接口連接到主機。(圖片來源:SparkFun Electronics) M 擴展增加了有符號和無符號 32/32 除法指令 DIV 和 DIVU,以及有符號和無符號求余指令 REM 和 REMU。它還增加了四條乘法指令: · MUL 執(zhí)行 32 x 32 寄存器乘法,將 64 位結(jié)果的低 32 位存儲在寄存器中。 · MULH 和 MULHU 分別執(zhí)行有符號和無符號寄存器乘法,將 64 位結(jié)果的高 32 位存儲在寄存器中。 · MULSHU 執(zhí)行有符號 x 無符號寄存器乘法,將 64 位結(jié)果的高 32 位存儲在寄存器中。 因此,對于 32 x 32 = 64 無符號乘法,推薦的代碼序列為: ![]() 其中寄存器 rs1 和 rs2 分別是被乘數(shù)和乘數(shù),寄存器 rdh 和 rdl 分別是高 32 位和低 32 位結(jié)果。 通過將 64 位乘法結(jié)果分為兩個 32 位運算,ISA 便不需要添加復(fù)雜的 32 x 32 = 64 CISC 指令。這符合使用簡單指令來執(zhí)行 CISC 運算的 RISC 理念。 基礎(chǔ) RV32I ISA 中的大多數(shù)指令的執(zhí)行僅需要 1 個指令時鐘周期,但 RED-V FE310 中的這些乘法指令需要 5 個時鐘周期。這樣推算,上面的推薦代碼序列需要 10 個時鐘周期。雖然這在 150 MHz 頻率下是可以接受的,但我見過一些功耗非常低、時鐘速度非常慢的微控制器應(yīng)用,中斷在這些應(yīng)用中至關(guān)重要,若在 5 MHz 的頻率下執(zhí)行 10 個時鐘周期的乘法,關(guān)鍵中斷是等不起這么長時間的。在此類情況下,我看到一些固件開發(fā)人員使用允許中斷的復(fù)雜匯編語言子例程來執(zhí)行乘法。 然而,F(xiàn)E310 內(nèi)核能夠接受連續(xù)指令,并通過宏融合,將這些指令內(nèi)部融合為一條更快的指令。內(nèi)核微架構(gòu)可將兩條指令融合為一條內(nèi)部指令,這樣其執(zhí)行就不需要 10 個時鐘周期。RISC-V 微架構(gòu)自動對一些代碼序列進行融合,例如 indexed loads、load-pair 和 store-pair 指令,從而顯著加快執(zhí)行速度。更大的好處是,由于 FE310 支持“C”擴展,可以融合兩條兼容的 16 位壓縮指令,因而在代碼和執(zhí)行速度方面都具備優(yōu)勢。 Arm 后來才在他們的架構(gòu)中增加了宏融合,就像壓縮指令那樣,而 RISC-V 從一開始就在設(shè)計中提供宏融合。要真正了解代碼壓縮的優(yōu)勢,以及宏融合發(fā)生的時機,最好的方法是使用 SparkFun DEV-15799 等評估板來觀察這些行為。您可在調(diào)試器中檢測代碼,了解 FE310 微架構(gòu)如何提取和執(zhí)行每條指令。這樣您就能更好地了解匯編語言的行為,幫助您使用支持代碼壓縮和宏融合的 C 編譯器來編寫高效的代碼。 結(jié)語 讓人引以為傲是,RISC-V ISA 僅有 47 條基礎(chǔ)指令,是真正的精簡指令集。使用“M”乘法擴展等標準化擴展,可以增加乘法和除法指令,從而增強這種架構(gòu)。宏融合是 RISC-V 架構(gòu)固有的功能,可以加快兼容指令的代碼執(zhí)行速度,例如連續(xù)乘法指令,而“C”壓縮擴展則可精簡代碼。相比其他架構(gòu),壓縮指令和宏融合都能帶來顯著的性能優(yōu)勢。 |