CPU可以分成幾個部分,不同的設計方案有不同的分割方式,在經典的五級流水線中被分割成取指、譯碼、執行、訪存和寫回五級。
首先是取指。取指就是從指令內存中讀取出CPU要執行的指令。計算機的指令是由0和1組成的。比如說00000000000100010000000110110011這個指令的意思是把寄存器x1與x2的數相加后的值放入寄存器x3中。不同的指令集的指令都不相同,這個是RISC-V架構指令。就像這樣的指令一條接一條占滿了內存。那么我們要想從內存中讀出這些指令肯定不能隨便讀,我們需要一個像書簽一樣的東西告訴我們讀到哪里了,這個東西被稱作程序計數器PC(program counter)。我們就根據PC值作為地址去訪問內存,每訪問完一次內存就把PC值往下加,讓PC值始終指向我們接下去要讀的位置。
這邊所指的內存是指令內存,此外還有數據內存。顧名思義,指令內存中存儲的是指令,數據內存中存儲的是數據。比如打開相冊,相冊作為一個程序是在指令內存中被讀取出來的,而相冊中的圖片則是在數據內存中被讀取。這個只是個比喻,真實情況應該不是這樣的。而對于單片機等計算機,這兩種內存是分開的;對于手機電腦等大多數設備這兩種內存是被承載在同一個物理內存上的,但是其內涵還是有區別的。這邊所說的是內存,要與處理器的緩存和硬盤區分開。
接著是譯碼。我們需要把像上面那樣的指令翻譯成電路實際操作的控制信號,控制數據的走向完成指令所要求的任務。比如說這個指令是個加法指令,那么我就要把數據往加法器那兒領,而不是把數據送向減法器。而這個起向導作用的就是譯碼完的控制信號。
譯碼單元(部分)
再是執行。基礎的RISC-V的架構中有加、減、與、或、移位、比大小等操作。所謂執行就是算出結果。這邊說說移位是什么,移位就是把數字擴大或縮小2的整數次方倍,在二進制中看起來就是數字往高位或低位移動了幾位。這里拿十進制數字舉例。例如2048000縮小1000(10的3次方)倍,那就變為了2048,看起來就像數字向右移了三位。
?
執行單元
然后是訪存。這里的存指的就是數據內存了。訪存既可以是訪(讀取)也可以是存(寫入)。同樣的我們要知道我們要訪哪或者存哪,因此我們還是需要一個書簽,但是不同于前面的PC,我們需要在一個相對集中卻又不一定按順序的地方讀取數據。這里應該很好理解,我們編程的時候是按順序編輯的(程序不一定按順序執行,程序也可以進行跳轉,但大部分情況按順序執行),但是我們的文件可是隨便哪讀隨便哪寫的,甚至可能沒有一點順序可言。因此我們需要一個相對靈活的書簽。這個書簽被稱作基地址,我們想訪存的地址與基地址的差值被稱作偏移量。基地址加上偏移量就是我們想要的目標地址了,基地址相對固定,偏移量由指令給出,這樣我們就可以靈活的進行訪存了。
?
訪存單元
最后是寫回。當指令進行完了之后,我們需要把最后的結果寫回寄存器組,把結果記錄下來。有些指令可能沒有什么要寫回的,比如儲存某個數到內存這樣的指令就沒什么要寫回的,那就忽略這一級流水線(走個過場)就行了。這個圖很零散,就不放上來了。
審核編輯:劉清
評論
查看更多