天天看點

手把手教你設計CPU-1

ISA衆生相

1、x86架構

2、SPARC架構

3、MIPS

4、Power

5、Alpha

6、ARM

7、ARC

8、Andes

9、C-Sky

除了x86都是RISC

RISC-V架構的基本指令數目隻有40多條,加上其他的子產品化擴充指令總共幾十條指令。

RISC-V 架構的整數通用寄存器組,包含 32 個 (I 架構)或者 16 個 (E 架構〉通用整數寄存器,其中整數寄存器 0 被預留為常數 0 , 其他的 31 個 (I 架構)或者 15 個 (E 架構)為普通的通用整數寄存器。

如果使用浮點子產品 (F 或者 D ),則需要另外一個獨立的浮點寄存器組,包含 32 個通用浮點寄存器。如果僅使用 F 子產品的浮點指令子集,則每個通用浮點寄存器的寬度為 32 比特;如果使用了 D 子產品的浮點指令子集,則每個通用浮點寄存器的寬度為 64 比特 。

與所有的 RISC 處理器架構一樣,RISC-V 架構使用專用的存儲器讀( Load )指令和存儲器寫( Store )指令通路存儲器( Memory〉,其他的普通指令無法通路存儲器。

RISC-V有2條無條件跳轉指令

跳轉連結 jal(Jump and Link)指令一一jal 指令可用于進行子程式調用,同時将子程式傳回位址存在連結寄存器( Link Register,由某一個通用整數寄存器擔任〉中 。

跳轉連結寄存器 jalr(Jump and Link-Register ) 指令一jalr 指令能夠用于子程式傳回指令,通過将 jal 指令(跳轉進入子程式)儲存的連結寄存器用于 jalr 指令的基位址寄存器,則可以從子程式傳回。

RISC-V有6條帶條件跳轉指令

無條件碼執行,RISC-V放棄使用“條件碼”指令的方式,對于任何的條件判斷都是用普通的帶條件分支跳轉指令。

無分支延遲槽,RISC-V放棄了分支延遲槽,因為現在的高性能處理器的分支預測算法精度已經非常高。

零開銷硬體循環,RISC-V沒有使用此類。

簡潔的運算指令,很多 RISC 架構的處理器在運算指令産生錯誤之時,例如上溢( Overflow )、下溢(Underflow ),非規格化浮點數( Subnormal )和除零( Divide by Zero ),都會産生軟體異常 。RISC-V 架構的一個特殊之處是對任何的運算指令錯誤(包括整數與浮點指令〉均不産生異常,而是産生某個特殊的預設值,同時設定某些狀态寄存器的狀态位。RISC-V 架構推薦軟體通過其他方法來找到這些錯誤 。 再次清楚地反映了 RISC-V 架構力圖簡化基本的指令集,進而簡化硬體設計的哲學 。

RISC-V架構定義了3種工作模式

• Machine Mode

• Supervisor Mode

• User Mode

其中Machine Mode為必選模式,另外兩種為可選模式。

riscv-tools 的 源代碼在 Github 上被維護成一個宏項目(詳情請在 Github 中搜尋" riscv-tools" ) , 其包含了所有 RISC-V 相關工具鍊 、 仿真器和測試套件等子項目

手把手教你設計CPU-1

蜂鳥 E200 系列處理器的系統示意圖如圖

• 私有的 ITCM(指令緊相合存儲)與 DTCM(資料緊禍合存儲),實作指令與資料的分離存儲同時提高性能。

• 中斷接 口用于與 SoC 級别的中 斷控制器連接配接。

• 調試接口用于與 soc 級别的 JTAG 調試器連接配接。

• 系統總線接口,用于訪存指令或者資料。可以将系統主總線接到此接口上, E200可以通過該總線通路總線上挂載的片上或者片外存儲子產品 。

• 緊耦合的私有外設接口,用于訪存資料。可以将系統中的私有外設直接接到此接口上,使得 E200 無須經過與資料和指令共享的總線便可通路這些外設 。

• 緊耦合的快速 IO 接口,用于訪存資料。可以将系統中的快速 IO 子產品直接接到此接口上,使得 E200 無須經過與資料和指令共享的總線便可通路這些子產品。

• 所有的 ITCM 、 DTCM 、 系統總線接口 、私有外設接口以及快速 IO 接口均可以配置位址區間 。

蜂鳥E200流水線介紹

處理器經典的五級流水線模型:取值、譯碼、執行、訪存、寫回。

手把手教你設計CPU-1

取指

指令取指 Cinstruction Fetch )是指将指令從存儲器中讀取出來的過程。

譯碼

指令譯碼( Instruction Decode )是指将從存儲器中取出的指令進行翻譯的過程。經過譯碼之後得到指令需要的操作數寄存器索引,可以使用此索引從通用寄存器組(Register File, Regfile )中将操作數讀出。

執行

指令譯碼之後所需要進行的計算類型都己得知,并且己經從通用寄存器組中讀取出了所需的操作數,那麼接下來便進行指令執行( Instruction Execute ) 。指令執行是指對指令進行真正運算的過程。 譬如,如果指令是一條加法運算指令,則對操作數進行加法操作;如果是減法運算指令,則進行減法操作。

在“執行”階段的最常見部件為算術邏輯部件運算器( Arithmetic Logical Unit, ALU),作為實施具體運算的硬體功能單元 。

訪存

存儲器通路指令往往是指令集中最重要的指令類型之一, 訪存( Memory Access )是指存儲器通路指令将資料從存儲器中讀出,或者寫入存儲器的過程 。

寫回

寫回 (Write-Back )是指将指令執行的結果寫回通用寄存器組的過程 。 如果是普通運算指令,該結果值來自于“執行”階段計算的結果:如果是存儲器讀指令,該結果來自于“訪存”階段從存儲器中讀取出來的資料。

處理器流水線中的沖突

處理器的流水線設計中另外一個問題便是流水線中的沖突( Hazards ),主要分為資源沖突和資料沖突。

資源沖突:

資源沖突是指流水線中硬體資源的沖突,最常見的是運算單元的沖突,譬如觸發器需要多個時鐘周期才能完成運算。是以在前一個除法指令完成之前,新的觸發指令如果也需要觸發器,則會存在着資源沖突。

解決資源沖突可以通過複制硬體資源或者流水線停頓等待硬體資源的方法解決。

資料沖突

資料沖突指不同的指令之間的操作數存在着資料相關性造成的沖突,常見的資料相關性如下。

WAR/WAW/RAW

蜂鳥E200處理器的流水線

手把手教你設計CPU-1

蜂鳥E200處理器核的流水線結構

1、流水線的第一級為“取指(由IFU完成)”

2、“譯碼(EXU中完成)”“執行(EXU中完成)”“寫回(EXU中完成)”均處于同一個時鐘周期,位于流水線的第二級。

3、“訪存(由LSU完成)”處于EXU之後的第三級流水線,但是LSU寫回的結果仍然需要通過WB子產品寫回通用寄存器組。

取指

每條指令在存儲器空間中所處的位址稱為他的指令PC。

取指(Instruction Fetch)是指處理器核将指令從存儲器中讀取出來的過程(按照其指令PC值對應的存儲器位址)。

手把手教你設計CPU-1

PC值為0x8002150至PC值為0x8000215e處之間都是非分支跳轉指令,處理器需要按順序執行這些指令,指令PC值逐條指令連續增加

PC值為0x80002160出的bne指令,如果操作數a6和a3寄存器中的值不相等,則需要發生跳轉去執行PC為0x80002150處的指令。

有的指令編碼寬度是16位,而有的指令編碼寬度是32位的。對于寬度為32位的指令,其對應的PC位址可能與32位位址邊界不對齊,譬如PC值為0x8000217a處的32位指令所處的存儲器位址(0x8000217a)便與32位位址邊界不對齊(無法被4整除)。

如何快速取指

通常使用ITCM和I-Cache的方法,保證存儲器的讀延時盡量小。

1、ITCM(Instruction Tightly Coupled Memory)

指令緊耦合存儲。實作簡單,容易了解,且能保證明時性。

使用位址區間尋址,是以無法像Cache那樣映射無限大的存儲器空間。

2、I-Cache(Instruction Cache)

指令緩存,将容量巨大的外部指令存儲空間動态映射到容量優先的指令緩存中。

通路緩存存在着相當大的不确定性。

如何處理非對其指令

1、普通指令非對齊

使用剩餘緩存儲存上次取指令後沒有用完的比特位,供下次使用。

2、分支跳轉指令非對齊

使用多體化的SRAM進行指令存儲。使用兩塊32位寬的SRAM交錯的進行存儲。

對于位址不與32位對齊的指令,則一個周期可以同時通路兩塊SRAM取出兩個連續的32位指令字,然後各取其一部分進行拼接成真正需要的32位指令。

如何處理分支指令

1、分支指令的類型:

(1)無條件跳轉/分支:無條件直接跳轉/分支指令、無條件間接跳轉/分支指令。

•無條件直接跳轉/分支,跳轉的目标位址從指令編碼的立即數可以直接計算而得。如jal

•無條件間接跳轉/分支,間接是指跳轉的目标位址需要從寄存器索引的操作數中計算出來。如jalr

(2)帶條件跳轉/分支:帶條件直接跳轉/分支、帶條件間接跳轉/分支

•無條件直接跳轉/分支,跳轉的目标位址從指令編碼中的立即數可以直接計算而得。如6條帶條件分支指令

•無條件間接跳轉/分支,間接是指跳轉的目标位址需要從寄存器索引的操作數中計算出來。RISC-V架構沒有此指令。

為了提高性能,現代處理器的取指單元一般會采用分支預測技術。

2、預測方向

(1)靜态預測,僅依靠這條分支指令本身的資訊進行預測。

(2)動态預測,依賴已經執行過得指令的曆史和分支指令本身的資訊綜合進行“方向“預測。

3、預測位址

(1)分支目标緩存BTB

(2)傳回位址堆棧RAS

(3)間接BTB

RISC-V取指簡化

(1)規整指令編碼長度

(2)指令長度訓示碼放在低位

(3)簡單的分支跳轉指令

(4)沒有分支延遲槽指令

(5)提供明确的靜态分支預測依據

(6)提供明确的RAS依據

蜂鳥E200處理器的取指實作

(1)IFU總體設計思路,包括如下功能:

1、對取回的位址進行簡單譯碼

2、簡單的分支預測

3、生成取值的PC

4、根據PC的位址通路ITCM或BIU

蜂鳥E200處理器的執行實作

EXU,蜂鳥E200是兩級流水線架構,“譯碼”“執行”“寫回”均處于第二級流水,功能如下:

1、将IFU通過IR寄存器發送給EXU的指令進行譯碼和派遣

2、通過譯碼出的操作數寄存器索引讀出Regfile

3、維護指令的資料相關性

4、将指令派遣給不同的運算單元執行

5、将指令傳遞

6、将指令運算的結果寫回Regfile

蜂鳥E200處理器的傳遞實作

流水線中的指令被“傳遞”,是指該指令不再是預測執行狀态。它被判定為可以真正地在處理器中被執行,可以對處理器狀态産生影響。

“傳遞”“取消”“沖刷”。當處理器流水線需要将沒有“傳遞”的後續指令全部“取消”掉時,就會造成“流水線沖刷”

RISC-V可大幅簡化“傳遞”硬體實作

1、指令沒有條件碼,是以不需要處理單挑指令“取消”情況

2、所有的運算指令都不會産生異常。大多指令集規定“除以0”為錯誤異常,浮點指令也會有若幹錯誤異常。但RISC-V規定這些運算指令一概不産生錯誤異常。

綜上所述,RISC-V架構的處理器隻需要處理如下兩類流水線沖刷情形:

1、分支預測指令錯誤在成的後續指令流取消。

2、中斷和異常造成的後續指令流取消。

蜂鳥E200處理器的寫回

從不同的運算單元執行完畢後的指令也最終都會将其計算結果寫回通用寄存器組。

将指令劃分為單周期指令和長指令兩大類。

将長指令的“傳遞”和“寫回”分開,是的即便執行了多周期長指令,仍然不回阻塞流水線,讓後續的單周期指令仍然能夠順利低寫回和傳遞。