簡(jiǎn)易R(shí)ISC-V處理器設(shè)計(jì) (二.處理器的基本構(gòu)成)

本文為通過Verliog HDL編寫簡(jiǎn)易R(shí)ISC-V CPU的試驗(yàn)筆記,如有錯(cuò)誤敬請(qǐng)指正。

電路建模
復(fù)雜電路通常使用自頂向下的設(shè)計(jì)方法,先決定電路所需的功能,劃分出實(shí)現(xiàn)功能的各個(gè)子模塊,確保頂層設(shè)計(jì)無邏輯錯(cuò)誤后,再進(jìn)行各子模塊的設(shè)計(jì)。
處理器的結(jié)構(gòu)總是與指令集相關(guān),對(duì)于RISC-V指令集,處理器需要按指令集的要求對(duì)數(shù)據(jù)進(jìn)行處理操作。
一. 指令行為分析
對(duì)于任意一條RISC-V指令,它在處理器中的執(zhí)行步驟皆可概括如下。

獲得指令
從外部或儲(chǔ)存器獲得當(dāng)前需要執(zhí)行的指令,如:;
分析指令
獲得指令后,使可以按指令的內(nèi)容進(jìn)行執(zhí)行,但電路中指令以二進(jìn)制方式儲(chǔ)存,電路得到的只是32位的0、1,不能直接用于執(zhí)行。為使電路"理解"指令的內(nèi)容,需要對(duì)指令進(jìn)行"翻譯"以得到電路控制訊號(hào)。
對(duì)此,處理器須加入一個(gè)譯碼模塊,作用按指令內(nèi)容為生成電路各模塊的控制訊號(hào)。
如對(duì)進(jìn)行分析,得知ALU執(zhí)行加法操作,數(shù)據(jù)來源A的地址為Rs1,數(shù)據(jù)來源B的地址為Rs2;運(yùn)算結(jié)果保存至Rd。此時(shí)應(yīng)設(shè)定電路為寄存器取數(shù)據(jù)的加法模式。
實(shí)例:進(jìn)行譯碼,從
得知為R-Type類型,從
得到電路執(zhí)行加法操作,數(shù)據(jù)來源A的地址為
,數(shù)據(jù)來源B的地址為
,運(yùn)算結(jié)果保存至
。
附注:在實(shí)際的電路譯碼中,不分析Rs1,Rs2,Rd的信息,而是根據(jù)Opcode及指令中的其他信息位設(shè)置數(shù)據(jù)通路與算朮單元。
取得數(shù)據(jù)
寄存器獲取
出于節(jié)省指令長度,方便數(shù)據(jù)調(diào)用等考量,指令中并不直接包含需操作的32位數(shù)據(jù)。而是記錄了儲(chǔ)存數(shù)據(jù)的5位地址數(shù)據(jù)。處理器通過5位地址對(duì)儲(chǔ)存單元進(jìn)行訪問,間接得到所需的運(yùn)算數(shù)據(jù)。在這一步中,處理器中需要個(gè)32位寄存器組以儲(chǔ)存臨時(shí)數(shù)據(jù)。
如:,結(jié)果儲(chǔ)存至Rd,數(shù)據(jù)來源A的地址為Rs1,數(shù)據(jù)來源B的地址為Rs2;從Rs1,Rs2中獲得寄存的32位數(shù)據(jù)。
附注:在處理器中,少量的臨時(shí)數(shù)據(jù)被儲(chǔ)存于寄存器而非內(nèi)存,其特點(diǎn)為訪問速度快,需要時(shí)可直接進(jìn)行存放以獲得數(shù)據(jù),若儲(chǔ)存于內(nèi)存則至少需要占用一個(gè)指令周期以獲得數(shù)據(jù)。
立即數(shù)擴(kuò)展
對(duì)于立即數(shù)形式指令,其運(yùn)算數(shù)據(jù)被部份地儲(chǔ)存于指令當(dāng)中,一般為12位(I-Type)或20位(J-Type)。不符合32位操作數(shù)的標(biāo)準(zhǔn),需要對(duì)數(shù)據(jù)進(jìn)行擴(kuò)展以得到完整的32位操作數(shù)。在RISC-V中,大部分立即數(shù)皆按有符號(hào)數(shù)進(jìn)行擴(kuò)展處理。
如:,結(jié)果儲(chǔ)存至Rd,數(shù)據(jù)來源A的地址為Rs1,數(shù)據(jù)來源B為指令中儲(chǔ)存的99,
,但輸入為32位,需擴(kuò)展為
。
附注:符號(hào)擴(kuò)展,由于立即數(shù)通過補(bǔ)碼保存,正數(shù)的補(bǔ)碼表示為其自身的二進(jìn)制值,負(fù)數(shù)的補(bǔ)碼表示為自身的二進(jìn)制值取反加一,如,為7的4位二進(jìn)制表示,若以8位表示則有
,把4位二進(jìn)制擴(kuò)展為8位,只需判斷數(shù)據(jù)的符號(hào)位(最高位),隨后隨擴(kuò)展每一位值與最高值相同即可。
數(shù)據(jù)處理
參考指令集中定義的幾種數(shù)據(jù)處理方式,分別有算朮加法、按位與、按位或、左右移。對(duì)數(shù)據(jù)的處理一般通過算朮邏輯單元(ALU)進(jìn)行處理。
數(shù)據(jù)儲(chǔ)存
假若處理結(jié)果不被保存或不改變狀態(tài)機(jī),則數(shù)據(jù)運(yùn)算顯得毫無意義。對(duì)大部分指令而言,數(shù)據(jù)的處理結(jié)果需要重新寫回至寄存器組中等待后續(xù)指令的調(diào)用。又或是通過Store指令儲(chǔ)存至"大型"儲(chǔ)存器,如內(nèi)存當(dāng)中。
二. 邏輯框圖
下為RISC-V處理器的基礎(chǔ)構(gòu)成框圖,其組成與上述提到的指令執(zhí)行步驟相差不大。

三. 模塊劃分
數(shù)據(jù)通路
數(shù)據(jù)通路是處理器的重要構(gòu)成部份,主要負(fù)責(zé)模塊間的數(shù)據(jù)傳遞。主要的部件為受譯碼模塊控制的數(shù)據(jù)選擇器。譯碼器通過選擇器控制各模塊的輸入數(shù)據(jù),例如選擇ALU運(yùn)算數(shù)據(jù)從寄存器或是立即數(shù)單元進(jìn)行輸入。
數(shù)據(jù)通路的設(shè)計(jì)需與指令相配合,對(duì)于RISC-V指令集的指令執(zhí)行流程,可以得到一種數(shù)據(jù)通路設(shè)計(jì)如上。
程序計(jì)數(shù)器
在處理器中,指令一般被順序存放于存儲(chǔ)器,存儲(chǔ)器的特點(diǎn)時(shí)訪問數(shù)據(jù)時(shí)需提供地址,隨后存儲(chǔ)器通過地址取得被儲(chǔ)存的數(shù)據(jù)。因此,程序計(jì)數(shù)器的核心為記錄當(dāng)前執(zhí)行的指令計(jì)數(shù),隨后通過此計(jì)數(shù)值于存儲(chǔ)器中讀出相應(yīng)的32位指令碼。
在RISC-V中,若不考慮跳轉(zhuǎn)與分支等情況,則PC在每條指令執(zhí)行完畢后自增4。對(duì)應(yīng)的電路為一組32位觸發(fā)器及一個(gè)32位加法器。
指令儲(chǔ)存器
存放指令的存儲(chǔ)區(qū)域,可以是專用的指令儲(chǔ)存器,亦可以是內(nèi)存中特定的一塊區(qū)域。
譯碼模塊
翻譯指令編碼為控制訊號(hào)的電路,一般需與數(shù)據(jù)通路及其他模塊協(xié)同設(shè)計(jì)。作為例子,譯碼器需為算朮邏輯單元提供操作碼,以確保算朮邏輯單元的行為正確。亦需為數(shù)據(jù)通路中的各數(shù)據(jù)選擇器提供操作訊號(hào),確保各模塊的輸入數(shù)據(jù)正確。
寄存器組
處理器臨時(shí)存放程序數(shù)據(jù)的寄存器,寄存器組的加入使程序數(shù)據(jù)能被迅速取用而無需專門訪問內(nèi)存空間,減少電路的延時(shí)。
算朮邏輯單元(ALU)
算朮邏輯單元的行為與使用的指令集有重要關(guān)系。對(duì)于RV32I指令集,指令集中包含了加減法、與、或、或非、移位、比較等操作指令。對(duì)應(yīng)地需為ALU設(shè)計(jì)加法器及邏輯單元,從而實(shí)現(xiàn)指令集規(guī)定的操作行為。
隨機(jī)存儲(chǔ)器(RAM)
隨機(jī)存儲(chǔ)單元用于大規(guī)模地保存程序中的數(shù)據(jù),對(duì)于大型程序,32個(gè)寄存器并不足以存放所有程序數(shù)據(jù),但增加寄存器將導(dǎo)致地址位寬的進(jìn)一步上升,使指令體系變得臃腫。因此必須使用規(guī)模更大,代價(jià)更低的器件以儲(chǔ)存大量的運(yùn)行數(shù)據(jù)。其中隨機(jī)存儲(chǔ)單元由于成本相對(duì)較低,數(shù)據(jù)可隨機(jī)存放等特點(diǎn)而被廣泛用于數(shù)據(jù)存儲(chǔ)中。
附注:隨機(jī)存儲(chǔ)器中隨機(jī)二字不是指獲取的數(shù)據(jù)隨機(jī),而是指電路可以非順序的方式讀取儲(chǔ)存器中的數(shù)據(jù)。如磁帶、CD、硬碟等存儲(chǔ)介質(zhì)需從數(shù)據(jù)起始點(diǎn)開始一個(gè)個(gè)數(shù)據(jù)讀取,而不能直接讀取某一位置的數(shù)據(jù)。而隨機(jī)存儲(chǔ)器則可直接讀出存儲(chǔ)器中指定的數(shù)據(jù),因此稱為隨機(jī)存儲(chǔ)器。
作者Blog :?https://starryphantom.github.io/