基於risc-v架構cpu


一、定義:

   CPU ,全稱為中央處理器單元,簡稱為處理器,是一個不算年輕的概念 早在 20 世紀60 年代便己誕生了第一款 CPU請注意區分“處理器”和“處理器核”“ PU ”和“Core ”的概念。嚴格來說 “處理器核”和“ Core ”是指處理器內部最核心的部分,是真正的處理器內核;而“處理器”和“CPU"往往是一個完整的 Soc ,包含了處理器內核和其他的設備或者存儲器 但是在現實中大多數往往不會嚴格地遵循兩者的差別,時常混用,因此讀者需要根據上下文自行顫別體會具體的含義經過幾十年的發展,到 天已 相繼誕生或消亡過了幾十種不同的 CPU 架構 1-1為近幾十年來知名 CPU 架構的誕生時間表 什么是 CPU 架構?下面讓我們來探討區分 CPU的主要標准 CPU 靈魂一一指令集架構 Clnstructio Set Architecture, ISA )。
   RISC-V(讀音“risk-five”)是一個新的指令集體系結構(ISA),它最初用於支持計算機體系結構研究和教學,但現在我們希望它也成為一個對於工業實現來說標准、免費、開放的體系結構。RISC-V ISA 被定義為一個基本的整數 ISA,必須在任何實現中存在,另外可以包含基於基本 ISA 的其他擴展。這個基本的整數 ISA 與早期的 RISC 處理器非常相似,除了沒有分支延遲槽(delay slot),另外支持可選的變長指令編碼。這個基本核心被小心地限制具有最少的指令,足夠支持一個合理的目標機,以便編譯器、匯編器、鏈接器、操作系統(包含額外的管理員級操作)可以在之上運行,這樣就可以提供一個方便的 ISA 和軟件工具鏈“骨架”,圍繞它可以構建更為定制化的處理器 ISA。每一個基本整數指令集,被整數寄存器寬度和相應的用戶地址空間大小進行分類。有兩種主要的基本整數變種,RV32I 和 RV64I,分別提供了 32 位和 64 位用戶級地址空間。硬件實現和操作系統可以提供給用戶程序使用 RV32I 或者 RV64I中的一種或者兩種。還描述了未來支持 128 位用戶地址空間的 RV128I 變種基本整數指令集。
二、指令集
  基本 RISC-V ISA 具有 32 位固定長度指令,並且必須在 32 位邊界對齊。然而,標准 RISC-V編碼模式被設計成支持變長指令的擴展,在這個擴展中,每條指令長度可以是 16 位指令包裹(parcel)長度的整數倍,並且這些指令包裹必須在 16 位邊界對齊。第 14 章中描述的標准壓縮 ISA 擴展,通過提供壓縮的 16 位指令,減少了代碼大小,並放松了對齊要求,允許所有指令(16 位和 32 位)對齊到任意 16 位邊界,以提高代碼密度。圖 1.1 展示了標准 RISC-V 指令長度編碼約定。所有基本 ISA 中的 32 位指令的最低 2 位被設置為 11。可選的壓縮 16 位指令集擴展中的指令,最低 2 位被設置為 00、01 或者 10。超過 32 位的標准指令集擴展,在低位有額外的位被設置為 1,48 位、64 位長度約定如圖 1.1所示。指令長度在 80 位到 176 位之間的長度信息,被編碼到一個 3 位的字段[14:12]中,給出了 16 位字的數量,加上最開始的 5×16 位字。位[14:12]編碼為 111,保留給未來更長的指令編碼。

 

 三、32 位指令集

  本文只是簡單的介紹32位指令集的一些原理及使用:

1、立即數編碼變種

1)ADDI將符號擴展的12位立即數加到寄存器rs1上。算術溢出被忽略,而結果就是運算結果的低XLEN位。ADDI rd,rs1,0用於實現MV rd,rs1匯編語言偽指令。SLTI(set less than immediate)將數值1放到寄存器rd中,如果寄存器rs1小於符號擴展的立即數(比較時,兩者都作為有符號數),否則將0寫入rd。SLTIU與之相似,但是將兩者作為無符號數進行比較(也就是說,立即數被首先符號擴展為XLEN位,然后被作為一個無符號數)。注意,SLTIU rd,rs1,1將設置rd為1,如果rs1等於0,否則將rd設置為0(匯編語言偽指令SEQZ rd,rs)。ANDI、ORI、XORI是邏輯操作,在寄存器rs1和符號擴展的12位立即數上執行按位AND、OR、XOR操作,並把結果寫入rd。注意,XORI rd,rs1,-1在rs1上執行一個按位取反操作(匯編語言偽指令NOT rd,rs)。

 

2)被移位常數次,被編碼為I類格式的特例。被移位的操作數放在rs1中,移位的次數被編碼到I立即數字段的低5位。右移類型被編碼到I立即數的一位高位。SLLI是邏輯左移(0被移入低位);SRLI是邏輯右移(0被移入高位);SRAI是算術右移(原來的符號位被復制到空出的高位中)。

 

 3)LUI(load upper immediate)用於構建32位常數,並使用U類格式。LUI將U立即數放到目標寄存器rd的高20位,將rd的低12位填0。AUIPC(add upper immediate to pc)用於構建pc相對地址,並使用U類格式。AUIPC從20位U立即數構建一個32位偏移量,將其低12位填0,然后將這個偏移量加到pc上,最后將結果寫入寄存器rd。

 

 

2、控制轉移指令

1)無條件跳轉

 跳轉並連接(JAL)指令使用了UJ類格式,此處J立即數編碼了一個2的倍數的有符號偏移量。這個偏移量被符號擴展,加到pc上,形成跳轉目標地址,跳轉范圍因此達到±1MB。JAL將跳轉指令后面指令的地址(pc+4)保存到寄存器rd中。標准軟件調用約定使用x1來作為返回地址寄存器。普通的無條件跳轉指令(匯編語言偽指令J)被編碼為rd=x0的JAL指令

 

2)間接跳轉指令JALR(jump and link register)使用I類編碼。通過將12位有符號I類立即數加上rs1,然后將結果的最低位設置為0,作為目標地址。跳轉指令后面指令的地址(pc+4)保存到寄存器rd中。如果不需要結果,則可以把x0作為目標寄存器。

 

 3)條件分支

  分支指令比較兩個寄存器。BEQ和BNE將跳轉,如果rs1和rs2相等或者不相等。BLT和BLTU將跳轉,如果rs1小於rs2,分別使用有符號數和無符號數進行比較。BGE和BGEU將跳轉,如果rs1大於等於rs2,分別使用有符號數和無符號數進行比較。注意,BGT、BGTU、BLE和BLEU可以通過將BLT、BLTU、BGE、BGEU的操作數對調來實現。

 

 3、Load 和 store 指令

RV32I是一個load-store體系結構,也就是說,只有load和store指令可以訪問存儲器,而算術指令只在CPU寄存器上進行操作運算。RV32I提供了一個32位用戶地址空間,它是字節尋址並且是小端的。執行環境將定義這個地址空間的哪些部分是可以合法訪問的(譯者注:這涉及到存儲保護等)。

Load和store指令在寄存器和存儲器之間傳輸數值。Load指令編碼為I類格式,而store指令編碼為S類格式。有效字節地址是通過將寄存器rs1與符號擴展的12位偏移量相加而獲得的。Load指令將存儲器中的一個值復制到寄存器rd中。Store指令將寄存器rs2中的值復制到存儲器中。LW指令將一個32位數值從存儲器復制到rd中。LH指令從存儲器中讀取一個16位數值,然后將其進行符號擴展到32位,再保存到rd中。LHU指令存儲器中讀取一個16位數值,然后將其進行零擴展到32位,再保存到rd中。對於8位數值,LB和LBU指令的定義與前面類似。SW、SH、SB指令分別將從rs2低位開始的32位、16位、8位數值保存到存儲器中。

 

 

 4、整數寄存器-寄存器操作

ADD和SUB分別執行加法和減法。溢出被忽略,並且結果的低XLEN位被寫入目標寄存器rd。SLT和SLTU分別執行符號數和無符號數的比較,如果rs1<rs2,則將1寫入rd,否則寫入0。注意,SLTU rd,x0,rs2,如果rs2不等於0(譯者注:在RISC-V中,x0寄存器永遠是0),則把1寫入rd,否則將0寫入rd(匯編語言偽指令SNEZ rd,rs)。AND、OR、XOR執行按位邏輯操作。SLL、SRL、SRA分別執行邏輯左移、邏輯右移、算術右移,被移位的操作數是寄存器rs1,移位次數是寄存器rs2的低5位。

 

附錄

 

 這些博客的內容來自我工作、學習時的感悟、與行業前輩的交流感悟以及讀書時的筆記,一部分內容可能與其他的網絡資源類似,如果有相關問題的話(比如內容有錯),請私聊博主或者在博文下面留言評論。

  寫博客最初目的就是記錄自己容易忘記的東西,而不是像寫書那樣專門寫給別人看的。所以,文章可以轉載(轉載請標明出處 http://www.cnblogs.com/podia/ ,作者:podia),無需版權

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM