嚴(yán)浦洲 合肥工業(yè)大學(xué) 計(jì)算機(jī)與信息學(xué)院計(jì)算機(jī)與信息工程系
早期CPU都是單周期的,結(jié)構(gòu)簡(jiǎn)單,即讓CPU每個(gè)時(shí)鐘周期執(zhí)行一條指令。但有的指令執(zhí)行耗時(shí)長(zhǎng),有的指令執(zhí)行耗時(shí)短,且CPU是執(zhí)行完一條指令再處理下一條的,既然給每個(gè)指令的時(shí)鐘周期都是相同的,那么時(shí)鐘周期就是耗時(shí)最長(zhǎng)的指令所需的時(shí)間。后來(lái)人們意識(shí)到了計(jì)算機(jī)的巨大能力,這時(shí)為了提升CPU的速度,優(yōu)化CPU的結(jié)構(gòu),對(duì)指令集的所有指令作分析,可以發(fā)現(xiàn)它們處理過程有相同的地方,于是便可將所有的指令切成幾段基本操作,指令執(zhí)行過程由多個(gè)基本操作組成,便引入了多周期CPU結(jié)構(gòu)。
多周期 CPU 是將單條指令的執(zhí)行劃分為若干個(gè)工作周期,每個(gè)工作周期用一個(gè)時(shí)鐘周期完成,每條指令的具體功能決定了完成該指令需要的工作周期數(shù)目。指令執(zhí)行過程中狀態(tài)的轉(zhuǎn)換由有限狀態(tài)機(jī)進(jìn)行實(shí)現(xiàn),控制單元根據(jù)指令和其所處工作周期發(fā)出為操作命令信號(hào)來(lái)控制指令的執(zhí)行。CPU在處理指令時(shí),一般需要經(jīng)過以下幾個(gè)階段:
(1) 取指令:根據(jù)PC中的指令地址,從存儲(chǔ)器中取出一條指令,同時(shí)PC根據(jù)指令字長(zhǎng)度自動(dòng)遞增產(chǎn)生下一條指令的指令地址。(2)指令譯碼:對(duì)指令進(jìn)行分析并譯碼,確定這條指令需要完成的操作。(3)指令執(zhí)行:根據(jù)指令譯碼得到的操作控制信號(hào),具體地執(zhí)行指令動(dòng)作。(4)存儲(chǔ)器訪問:所有需要訪問存儲(chǔ)器的操作都將在此步驟執(zhí)行,該步驟給出存儲(chǔ)器的數(shù)據(jù)地址,把數(shù)據(jù)寫入到存儲(chǔ)器中數(shù)據(jù)地址所指定的存儲(chǔ)單元或取出。(5)結(jié)果寫回:指令執(zhí)行的結(jié)果或者訪問存儲(chǔ)器中得到的數(shù)據(jù)寫回相應(yīng)的目的寄存器中。
表1 指令格式(每種類型以一條指令為例)
op:操作碼;rs:只讀寄存器;rt:可讀可寫,目的操作數(shù)寄存器;rd:只寫寄存器;sa:位移量;funct:功能碼;immediate:16位立即數(shù),用作操作數(shù)、數(shù)據(jù)加載(load)/數(shù)據(jù)保存(store)指令的數(shù)據(jù)地址字節(jié)偏移量和分支指令中相對(duì)程序計(jì)數(shù)器的有符號(hào)偏移量;address:地址。
圖2 各指令執(zhí)行的狀態(tài)轉(zhuǎn)換圖
首先為每個(gè)狀態(tài)定義一個(gè)參數(shù),例如定義IF為000,ID為001等。對(duì)于EXE狀態(tài),由于分支指令,存取指令和其他指令經(jīng)過的指令執(zhí)行階段各不相同,故定義了aEXE,bEXE,cEXE三個(gè)狀態(tài);對(duì)于WB狀態(tài),由于sw和lw經(jīng)過的指令執(zhí)行階段不相同,故定義了aWB,cWB兩個(gè)狀態(tài)。當(dāng)輸入NextState的狀態(tài)碼與操作碼發(fā)生改變時(shí),使用case產(chǎn)生下一狀態(tài),對(duì)case的設(shè)計(jì)如下:(1)由于所有指令都需要經(jīng)過IF-ID階段,所以IF的nextState一定是ID。(2)對(duì)于ID階段,有四條分叉的支路:對(duì)于j,jal,jr,halt指令,它們直接跳轉(zhuǎn),不需要經(jīng)過后面的狀態(tài)則nextStste為IF;其它指令的nextState是EXE。當(dāng)指令是sw、lw指令時(shí),指令的nextState為cEXE;當(dāng)指令是beq指令時(shí),指令的nextState為bEXE;剩余的指令nextState為aEXE。(3)對(duì)于aEXE,各種運(yùn)算指令的結(jié)果無(wú)需寫回存儲(chǔ)器,故nextState為aWB;對(duì)于bEXE,分支指令的nextState為IF;對(duì)于cEXE,由于是存取指令,需要經(jīng)過存儲(chǔ)區(qū),故nextState自然為MEM。(4)對(duì)于MEM,如果是lw指令,則要將結(jié)果寫回寄存器,那么nextState為cWB;如果是sw指令,則無(wú)需寫回,那么nextState為IF。(5)aWB與cWB的nextState都為IF。
(1)PC
根據(jù)控制信號(hào)PCSrc,計(jì)算獲得下一個(gè)PC以及控制信號(hào)RST重置。根據(jù)復(fù)位信號(hào)RST、PC寫使能信號(hào)PCWre決定輸出的pc值。與PC相關(guān)的部件還有PCAddFour:獲取順序存儲(chǔ)的下一個(gè)地址;PCJump:獲取子程序地址;PCAddImm:獲取跳轉(zhuǎn)后的地址。
(2)指令存儲(chǔ)器
定義8位的寄存器數(shù)組,將指令的32位二進(jìn)制數(shù)分割成4個(gè)8位的小段并順序存儲(chǔ)在數(shù)組中。
(3)寄存器堆
根據(jù)指令中的rs,rt到對(duì)應(yīng)寄存器堆中獲取數(shù)據(jù),得到要讀的數(shù)據(jù),然后根據(jù)rd將輸入的數(shù)據(jù)存到對(duì)應(yīng)的寄存器中。
(4)算術(shù)邏輯單元
在輸入A、輸入B以及ALU控制信號(hào)ALUOp發(fā)生變化時(shí),使用case并根據(jù)ALUOp的值執(zhí)行對(duì)應(yīng)的操作得到計(jì)算的結(jié)果。
(5)數(shù)據(jù)存儲(chǔ)器
定義8位的寄存器數(shù)組,將32位的數(shù)據(jù)分割成4個(gè)8位的小段進(jìn)行存取。寫與讀操作的單位是8位二進(jìn)制數(shù),—共操作四次。大端方式存儲(chǔ)。
(6)數(shù)據(jù)選擇器
二選一數(shù)據(jù)選擇器用于選擇ALU的A操作數(shù),B操作數(shù);選擇存入寄存器的數(shù)和選擇寫入寄存器的數(shù);三選一數(shù)據(jù)選擇器選擇要寫入數(shù)據(jù)的目的寄存器是rt,rd還是31號(hào)寄存器;四選一數(shù)據(jù)選擇器用于選擇下一條指令的地址。
(7)控制單元
控制單元由三個(gè)模塊封裝組成。分別實(shí)現(xiàn)當(dāng)時(shí)鐘上升沿到來(lái)時(shí)進(jìn)行狀態(tài)切換;產(chǎn)生下一階段;根據(jù)當(dāng)前狀態(tài)和操作碼產(chǎn)生各部件的控制信號(hào)三種功能。
(8)其他
臨時(shí)寄存器ADR,BDR,ALUtoDR,DBDR在時(shí)鐘信號(hào)觸發(fā)下將寄存器中的內(nèi)容輸出;指令寄存器IR用于存放正在執(zhí)行的指令代碼。
以指令add $3,$2,$1 (指令編碼為000000 0 0 0 1 0 00001 0001100000000000)為例。
與單周期CPU設(shè)計(jì)相比,多周期CPU的數(shù)據(jù)通路上發(fā)生了一些較為明顯的變化。增加了一定數(shù)量的臨時(shí)寄存器存儲(chǔ)關(guān)鍵數(shù)據(jù),這是由多周期指令特性決定的。同時(shí),多周期cpu的設(shè)計(jì)運(yùn)用了有限狀態(tài)機(jī)的思想,每個(gè)指令在不同的時(shí)鐘周期里,其控制信號(hào)完全不同,所以需要狀態(tài)機(jī)來(lái)控制狀態(tài),并且根據(jù)不同指令的不同狀態(tài)來(lái)決定控制信號(hào)的輸出,這在單周期cpu里是沒有體現(xiàn)的。所以多周期CPU具有時(shí)鐘周期短、各功能部件可共享的優(yōu)點(diǎn),它既符合現(xiàn)代CPU的真實(shí)設(shè)計(jì),又是流水線CPU設(shè)計(jì)的基礎(chǔ)。最后通過軟件仿真驗(yàn)證,來(lái)證實(shí)所設(shè)計(jì)的CPU的正確性,可以看到所設(shè)計(jì)的CPU具有實(shí)用性。