12
CHAPTER 1 處理器與 MIPS 時間開始了! ——胡風1949 讓我們以一句詩意的話,開始本書的閱讀。 時間從 1971 11 15 日開始,那一天,Intel 發布了世界上第一款單晶片微處理器 40041.1 電腦的簡單模型 電腦很複雜,可以聽歌、看電影、上網、玩遊戲,內部是怎工作的,這個問題太 可怕、太複雜了。 電腦很簡單,只可以做加、減、乘、除、邏輯、移位、轉移、儲存、載入等幾類的 操作,太簡單了。 複雜?簡單?其實取決於個人對事物的認識程度,認識得越多,瞭解得越深刻,那 就越接近本質,而本質往往都是簡單的,例如大名鼎鼎的質能方程式,一個簡單 的式子就解釋了質量與能量的關係。 電腦就是一台計算的設備,而且是一台很基礎的計算設備,只能計算小學數學課堂 上講授的四則運算,再加上一些並不複雜的與、或、非等邏輯運算,其餘諸如平方、 開根號、微分、積分等都是做不了的。有讀者會有疑惑,你說得太簡單了吧,別急, 且聽我慢慢道來。

處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

CHAPTER 1 處理器與 MIPS

時間開始了!

——胡風•1949

讓我們以一句詩意的話,開始本書的閱讀。

時間從 1971年 11月 15日開始,那一天,Intel發布了世界上第一款單晶片微處理器

4004。

1.1 電腦的簡單模型

電腦很複雜,可以聽歌、看電影、上網、玩遊戲,內部是怎麽工作的,這個問題太

可怕、太複雜了。

電腦很簡單,只可以做加、減、乘、除、邏輯、移位、轉移、儲存、載入等幾類的

操作,太簡單了。

複雜?簡單?其實取決於個人對事物的認識程度,認識得越多,瞭解得越深刻,那

麽就越接近本質,而本質往往都是簡單的,例如大名鼎鼎的質能方程式,一個簡單

的式子就解釋了質量與能量的關係。

電腦就是一台計算的設備,而且是一台很基礎的計算設備,只能計算小學數學課堂

上講授的四則運算,再加上一些並不複雜的與、或、非等邏輯運算,其餘諸如平方、

開根號、微分、積分等都是做不了的。有讀者會有疑惑,你說得太簡單了吧,別急,

且聽我慢慢道來。

Page 2: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

Chapter 1 處理器與 MIPS

1-2

1.1.1 電腦的簡單組成模型

電腦的組成有三大部分:處理器(Central Processing Unit,CPU)、輸入輸出

(Input/Output,I/O)、記憶體(Memory)。處理器從記憶體中取得指令,然後按

照指令執行一定的操作,輸入/輸出用來提供運算資料、顯示運算結果。如圖 1-1所

示。

010110100110100110101111……

記憶體

處理器

輸入

輸出

圖 1-1 電腦的簡單組成模型

記憶體中儲存的是指令,指令就是一條運算命令,例如:將 a 與 b 相加,結果儲存

到 c 中,處理器按照命令執行即可。目前的電腦是一個二進制的世界,所有的資訊

都是用 0、1 組合來表示的,所以一條指令就是一串 0、1編碼,正如圖 1-1所示。

處理器內部具有解碼功能,用來解釋接收到的 0、1編碼表示的運算類型,據此進行

運算。

1.1.2 電腦的簡單使用模型

我們使用電腦上網、辦公,都是透過一定的應用程式實現的,而這些應用程式實際

就是一批指令的集合,當然,這裡的“一批”指的是指令的數目龐大,實際上種類

是非常少的,只有幾百條,常用的也就幾十條。透過這些指令的組織、配合,就實

現了目前豐富多彩的應用。

理論上,可以直接使用 0、1編碼進行程式設計,但是那樣顯然太不方便、容易出錯,

於是人們使用一些助記符號來表示各種指令,這就是組譯指令,使用組合語言程式

將組譯指令翻譯爲電腦可以識別的 0、1編碼,後來,又發明瞭進階語言,其語法、

使用方式比組譯更加方便、更加易於理解。一般使用編譯程式將進階語言編寫的程

式翻譯爲組譯指令,然後再使用組合語言程式將其翻譯爲 0、1編碼。本質上是一樣

的。如圖 1-2所示。

Page 3: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

1.4 MIPS32 指令集架構簡介

1-9

7. microMIPS32/64

microMIPS32/64指令集架構整合了 16位元和 32位元優化指令的高性能程式碼壓縮

技術,保持了 98% 的 MIPS32性能,同時至少減少了 30% 的程式碼體積,從而降

低晶片成本,也有助於降低系統功耗。MIPS M14K核心是 MIPS科技於 2009年發

布的首款遵循 microMIPS指令集架構的 MIPS32相容核心。

MIPS 指令集架構的演變可以使用圖 1-3 描述。注意圖中沒有 Release 4,這是因爲

對於很多人來說,4是個不吉利的數字,所以 MIPS沒有發布 Release 4,而是直接

發布 Release 5。

MIPS32 Release 1 MIPS64 Release 1

MIPS32 Release 2 MIPS64 Release 2

MIPS32 Release 3 microMIPS32 MIPS64 Release 2 microMIPS64

MIPS32 Release 5 MIPS64 Release 5

MIPS I

MIPS II

MIPS III

MIPS IV

MIPS V

32位元 64位元

圖 1-3 MIPS 指令集架構的演變

1.4 MIPS32 指令集架構簡介

本書設計的處理器遵循 MIPS32 Release 1架構,所以本節介紹的 MIPS32指令集架

構指的就是 MIPS32 Release 1。

Page 4: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

CHAPTER 2 可程式設計邏輯裝置與

Verilog HDL

透過第 1 章的介紹,讀者應該知道 CPU 內部有一些基本的電路,例如:解碼電路、

運算電路、控制電路,此外還有一些暫存器等。這些電路怎麽實現呢?當然可以透

過一大堆分立的裝置實現,實際上在 2008 年,美國加州的遊戲開發人士 Steve

Chamberlin 就自己製造了一款 8 位元 CPU,耗時 18 個月,花費 1000 美元,總共使

用了 1253 條線纜,如圖 2-1 所示,Steve Chamberlin 為它起了一個十分貼切的名

稱——BMOW(Big Mess of Wires)。

圖 2-1 BMOW 的背面(左)與正面

還有一位叫 Bill Buzbee 的朋友也用 200 多塊 74 系列的 TTL 整合電路純手工製造了

一款 CPU。

上述事件只是證明瞭使用分立裝置實現 CPU 的可行性,但那並不是實現 CPU 的好

方法,本書是透過“程式碼 + FPGA”的方式實現 CPU 的,本章將對其原理進行解

釋,並對使用的程式設計語言 Verilog HDL 進行介紹。

Page 5: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

Chapter 2 可程式設計邏輯裝置與 Verilog HDL

2-2

2.1 可程式設計邏輯裝置概述

FPGA 是可程式設計邏輯裝置(Programmable Logic Device,PLD)的一種。PLD

是 1970 年代發展起來的一種新型裝置,它的應用和發展不僅簡化了電路設計,降低

了開發成本,提高了系統可靠性,而且給數位系統的設計方法帶來了革命性的變化。

截至目前為止,出現了多種工藝、不同原理的 PLD,如下:

PLA(Programmable Logic Array)可程式設計邏輯陣列

PAL(Programmable Array Logic)可程式設計陣列邏輯

GAL(Generic Array Logic)通用陣列邏輯

PROM(Programmable Read-Only Memory)可程式設計唯讀記憶體

EPLD(Erasable Programmable Logic Device)可抹除可程式設計邏輯裝置

CPLD(Complex Programmable Logic Device)複雜可程式設計邏輯裝置

FPGA(Field Programmable Gate Array)現場可程式設計閘陣列

按照不同的內部架構可以將 PLD 裝置分為如下兩類。

1. 基於乘積項(Product-Term)架構的 PLD 裝置

任何組合邏輯電路函數均可化為“與或”表達式,用“與閘-或閘”兩階電路實現,

而任何時序電路又都可以由組合電路加上儲存裝置(觸發器)構成。因此,從原理

上說,與或陣列加上觸發器的架構就可以實現任意的數位邏輯電路。基於乘積項架

構的 PLD 裝置的主要架構就是與或陣列,透過靈活設定的互連線,實現任意邏輯功

能。其基本架構如圖 2-2 所示。

輸入

緩衝

電路

輸出

緩衝

陣列… …

輸入

輸出

圖 2-2 基於乘積項架構的 PLD 裝置架構圖

基於乘積項架構的 PLD 裝置由輸入緩衝電路、與陣列、或陣列和輸出緩衝電路四部

分組成。“與陣列”和“或陣列”是主體,主要用來實現各種邏輯函數和邏輯功能;

輸入緩衝電路用於産生輸入訊號的原變數和反變數,並增強輸入訊號的驅動能力;

Page 6: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

Chapter 2 可程式設計邏輯裝置與 Verilog HDL

2-40

點擊工具列中的 Run-All 按鈕,就可開始模擬,如圖 2-29 所示,模擬結果如圖 2-30

所示。從模擬結果可知,處理器取指令電路實現正確。

點擊Run-All,開始模擬

圖 2-29 點擊 Run-All 按鈕開始模擬

(2)在195ns的時候重設訊號轉為無效

(1)時脈訊號每隔10ns翻轉一次,一個時脈週期是20ns,所以頻率是50MHz

(3)指令記憶體啟用訊號ce有效,開始取指令

(4)取指令位址依序遞增

(5)inst_o就是指令記憶體ROM中位址為pc處對應的指令

圖 2-30 模擬結果

2.9 本章小結

本章花了比較大的篇幅介紹了可程式設計邏輯裝置的基本知識,以及基於可程式設

計邏輯裝置的數位系統設計流程,包括設計輸入、合成、佈局布線、下載、模擬等

幾步,這與傳統的數位系統設計流程還是有很大不同的。然後介紹了 Verilog HDL

這樣一種硬體程式設計語言,這也是將要用來實現 OpenMIPS 處理器的語言。在此

基礎上,設計實現了一個簡化的處理器取指令電路,並使用 ModelSim 模擬驗證該

電路實現的正確性。在後期教學版 OpenMIPS 的設計實現過程中,主要也是使用

ModelSim 模擬驗證,步驟都是一樣的。

從第 3 章開始,就正式進入 OpenMIPS 處理器的設計實現階段了。

Page 7: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

CHAPTER 5 邏輯、移位操作與空指令的實現

第 4 章建立了原始的 OpenMIPS 五階管線架構,但是只實現了一條 ori 指令,從本

章開始,將逐步完善。本章首先討論了管線資料相依問題,然後修改 OpenMIPS以

解決該問題,並在 5.3 節驗證了解決效果。接著對邏輯、移位操作與空指令的指令

格式、用法、作用進行了一一說明,在 5.5節透過擴充 OpenMIPS實現了這些指令,

最後編寫測試程式,對實現效果進行了檢驗。

5.1 管線資料相依問題

我們在第 4 章實現的五階管線架構很簡單,如果按照“簡單即美(Simple is

Beautiful)”的標準,那麼我們的管線是美的,但是不完美,因為現實往往是複雜

的,一個簡單的管線是解決不了如此多現實問題的,本節探討的資料相依問題就是

其中一個問題。在我們實現邏輯、移位操作等其他指令之前,必須先討論這個問題,

因為這個問題已經影響測試程式的編寫了。

管線中經常有一些被稱為“相依”的情況發生,它使得指令序列中下一條指令無法

按照設計的時脈週期執行,這些“相依”會降低管線的性能。管線中的相依分為以

下三種類型。

(1) 架構相依:指的是在指令執行的過程中,由於硬體資源滿足不了指令執行的要

求,發生硬體資源衝突而產生的相依。例如:指令和資料都共享一個記憶體,

在某個時脈週期,管線既要完成某條指令對記憶體中資料的存取操作,又要完

成後續的取指令操作,這樣就會發生記憶體存取衝突,產生架構相依。

(2) 資料相依:指的是在管線中執行的幾條指令中,一條指令依賴於前面指令的執

行結果。

Page 8: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

Chapter 5 邏輯、移位操作與空指令的實現

5-6

① 插入暫停週期:當檢測到相依時,在管線中插入一些暫停週期,如圖 5-4所示。

取指令

解碼 執行

時脈

1 ori $1,$0,0x1100

取指令

2 ori $2,$1,0x0020

存取記憶體

回寫

插入暫停週期

解碼 執行存取記憶體

回寫

圖 5-4 在管線中插入暫停週期消除資料相依

② 編譯器分派:編譯器檢測到相依後,可以改變部分指令的執行順序,如圖 5-5

所示。

……ori $1,$0,0x1100ori $2,$1,0x0020ori $4,$3,0xffffori $6,$5,0x00ff……

……ori $1,$0,0x1100ori $4,$3,0xffffori $6,$5,0x00ffori $2,$1,0x0020……

存在資料相依 消除資料相依

圖 5-5 編譯器透過改變指令執行順序消除相依

③ 資料前推:將計算結果從其產生處直接送到其他指令需要處或所有需要的功能

單元處,避免管線暫停。如圖 5-6所示的例子中,新的$1值實際上在第 1條 ori

指令的執行階段已經計算出來了,可以直接將該值從第 1條 ori指令的執行階段

送入第 2條 ori指令的解碼階段,從而使第 2條 ori指令在解碼階段得到 $1的新

值。也可以直接將該值從第 1條 ori指令的存取記憶體階段送入第 3條 ori指令

的解碼階段,從而使第 3條 ori指令在解碼階段也得到$1的新值。

取指令

解碼 執行

時脈

1 ori $1,$0,0x1100

取指令

2 ori $2,$1,0x0020

存取記憶體

回寫

取指令

解碼 執行3 ori $3,$1,0x4400存取記憶體

回寫

解碼 執行存取記憶體

回寫

圖 5-6 資料前推解決管線相依

讀者需要注意,第③種方法有一個前提就是新的暫存器的值可以在執行階段計算出

來,如果是載入指令,那麼就不滿足這個前提,因為載入指令在存取記憶體階段才

Page 9: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

5.2 OpenMIPS 對資料相依問題的解決措施

5-7

能獲得最終結果,這是一種 load相依,本書將在實現載入儲存指令的時候考慮這種

情況,本章暫不考慮。

5.2 OpenMIPS 對資料相依問題的解決措施

OpenMIPS 處理器採用資料前推的方法來解決管線資料相依問題。透過補充完善圖

4-4原始的資料流程圖,添加部分訊號使得可以完成資料前推的工作,如圖 5-7所示。

主要是將執行階段的結果、存取記憶體階段的結果前推到解碼階段,參與解碼階段

選擇運算來源運算元的過程。

指令

記憶體

PC

+4

MUX

MUX立即

數擴

暫存

clk

取指令 解碼 執行存取

記憶體回寫

ALU

圖 5-7 添加了資料前推的 OpenMIPS 資料流程圖

圖 5-8給出了為實現資料前推而對 OpenMIPS 系統架構所做的修改,具體有兩個方

面。

(1) 將處於管線執行階段的指令的運算結果,包括:是否要寫入目的暫存器 wreg_o、

要寫入的目的暫存器位址 wd_o、要寫入目的暫存器的資料 wdata_o等資訊送到

解碼階段,如圖 5-8中虛線所示。

(2) 將處於管線存取記憶體階段的指令的運算結果,包括:是否要寫入目的暫存器

wreg_o、要寫入的目的暫存器位址 wd_o、要寫入目的暫存器的資料 wdata_o等

資訊送到解碼階段。

Page 10: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

CHAPTER 6 移動操作指令的實現

本章將實現移動操作指令,首先在 6.1節介紹了 MIPS32指令集架構中定義的移動操

作指令的格式、作用,接著在 6.2 節探討移動操作指令的實現概念,介紹了修改後

的資料流程圖、新出現的資料相依問題及其解決措施,並給出了修改後的 OpenMIPS

系統架構圖。在 6.3 節列出了詳細的修改過程。本章最後透過一個測試程式驗證移

動操作指令是否正確實現。

6.1 移動操作指令說明

MIPS32指令集架構中定義的移動操作指令共有 6條:movn、movz、mfhi、mthi、

mflo、mtlo,後 4條指令涉及對特殊暫存器 HI、LO的讀取/寫入操作。截至本章為

止,我們的 OpenMIPS處理器只實現了 32個通用暫存器以及 PC,所有的指令也只

是對 32個通用暫存器進行操作,還沒有涉及特殊暫存器,本章將實現 HI、LO這兩

個特殊暫存器。

HI、LO 暫存器用於保存乘法、除法結果。當用於保存乘法結果時,HI 暫存器保存

結果的高 32 位元,LO 暫存器保存結果的低 32 位元;當用於保存除法結果時,HI

暫存器保存餘數,LO暫存器保存商。在後續“算術操作指令的實現”一章中,會進

一步說明。

這 6條移動操作指令的格式如圖 6-1所示。

Page 11: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

6.2 移動操作指令實現思路

6-5

指令

記憶體

PC

MUX

MUX立即

數擴

暫存

clk

取指令 解碼 執行存取

記憶體回寫

ALU

HILO

MUX

+4

圖 6-2 添加移動操作指令後的資料流程圖

6.2.1 新的資料相依情況的解決

進一步考慮 mfhi、mflo 指令的處理過程,這 2 條指令會在管線執行階段讀取 HI、

LO暫存器的值,如果直接採用 HILO模組給出的 HI、LO暫存器的值,可能不是正

確的 HI、LO 暫存器的值,因為此時處於存取記憶體、回寫階段的指令有可能會修

改 HI、LO暫存器,以如下程式為例。

1. lui $1,0x0000 # $1 = 0x00000000

2. lui $2,0xffff # $1 = 0xffff0000

3. mthi $0 # hi = 0x00000000

4. mthi $1 # hi = 0x00000000

5. mthi $2 # hi = 0xffff0000

6. mfhi $4 # $4 = 0xffff0000

指令 3、4、5均要修改 HI暫存器,當指令 6處於執行階段時,指令 5處於存取記憶

體階段,指令 4 處於回寫階段,而此時 HI 暫存器的值是指令 3 剛剛寫入的

0x00000000,HILO 模組正是將該值傳到執行階段,如果採用這個值,那麼就會出

錯,偏離程式設想,正確的值應該是目前處於存取記憶體階段的指令 5 要寫入的資

料,如圖 6-3所示。

Page 12: 處理器與 MIPS - 碁峰資訊epaper.gotop.com.tw/PDFSample/ACA020600.pdfVerilog HDL 透過第1 章的介紹,讀者應該知道CPU內部有一些基本的電路,例如:解碼電路、

6.3 修改 OpenMIPS 以實現移動操作指令

6-7

圖 6-5 為實現移動操作指令而對 OpenMIPS 系統架構所做的修改

主要有三個方面。

(1) 增加了 HILO模組,用於實現 HI、LO暫存器。

(2) 執行階段的 EX 模組增加了 whilo_o、hi_o、lo_o 介面,分別表示是否要寫入

HILO、要寫入 HI暫存器的值、要寫入 LO暫存器的值。這三個介面傳遞出來的

對 HI、LO暫存器的修改資訊會透過 EX/MEM、MEM、MEM/WB三個模組一

直傳遞到回寫階段,並最終傳遞給 HILO模組。

(3) 執行階段的 EX模組增加了與 HI、LO暫存器有關的輸入介面,包括為解決 HI、

LO暫存器的資料相依問題而引入的介面,在 6.3.3節會有詳細介紹。

6.3 修改 OpenMIPS 以實現移動操作指令

6.3.1 HI、LO 暫存器的實現

在 HILO模組中實現 HI、LO暫存器,HILO模組的介面描述如表 6-1所示。

表 6-1 HILO 模組的介面

序號 介面名稱 寬度(bit) 輸入/輸出 作用

1 rst 1 輸入 重設訊號

2 clk 1 輸入 時脈訊號

3 we 1 輸入 HI、LO暫存器寫入啟用訊號