Learning Objectives
- 把資料路徑與控制單元對應到一顆完整 UC8 的每個微步驟
- 算出一條指令與一段程式要幾個時脈週期
- 說明時脈週期由最長路徑決定,以及加快哪個零件才有用
- 寫一段 UC8 迴圈程式,說明指令也放在記憶體裡的意義
這顆 CPU 的每個零件你都看過
手機裡的處理器看起來和前面的 NAND 閘毫無關係。可是它的基本工作方式和接下來要看的 UC8 一樣:擷取一條指令、解碼、執行,一直重複。
UC8 的零件都來自這條軌道:
| 零件 | 來自 |
|---|---|
| ALU 的加法與減法 | 第 5 課 |
| 匯流排來源的選擇、記憶體選列 | 第 4 課 |
| PC、IR、MAR、MDR、ACC | 第 7、8 課的正反器與暫存器 |
| 記憶體 | 第 10 課 |
| 資料路徑 | 第 11 課 |
| 控制單元 | 第 9 課的有限狀態機、第 12 課的控制表 |
下面用兩個模擬器看同一支程式:UC8 模擬器畫出整顆處理器,說明每一步在做什麼;控制表畫出同一拍開了哪些控制訊號。兩者的指令集與微步驟完全相同,微步驟的計數也一致。
一條指令要幾個時脈週期
UC8 一個微步驟就是一個時脈週期,所以指令的拍數可以直接從控制表數出來:
| 指令 | 擷取 | 解碼 | 執行 | 合計 |
|---|---|---|---|---|
| LDA、ADD、SUB、STA | 3 | 1 | 3 | 7 |
| JMP、JZ、JN、IN、OUT、HLT | 3 | 1 | 1 | 5 |
用到記憶體資料的指令比較慢,因為位址與資料都要多搬一次。剛才那支程式 3 條 7 拍、2 條 5 拍,共 31 拍。
時脈可以多快?第 6 課說過,週期必須大於最長的延遲,否則上升緣到的時候,訊號還沒走完。CPU 的每一拍都用同一個時脈,所以最慢的那一個微步驟,決定全部微步驟的速度。
找出決定時脈的那條路徑
下面用示意的延遲值(不是任何真實晶片的數字)算每個微步驟的路徑長度。猜猜看:把 ALU 加快一倍,時脈可以變快嗎?
加快哪個零件才有用
剛才的結果值得記住:只有縮短最長的路徑,時脈才會變快。在這組示意值裡,週期是 22;ALU 快一倍,週期還是 22。記憶體快一倍,週期只到 19,因為最長的路徑換成了 ALU 那條。
真實的處理器面對的是同一個問題。記憶體比邏輯閘慢很多,如果每一拍都要等記憶體,整顆 CPU 都會被拖慢。常見的解法有:讓讀記憶體佔好幾拍,其他步驟就能用短週期;在 CPU 旁邊放一塊又小又快的記憶體;把工作切得更細。這些都是接下來的主題。
寫程式的時候也一樣。下面的實作題中,迴圈加總每多跑一圈就多走固定的拍數。以參考作法來算,輸入 n 時總共是 52n + 24 拍:n=1 是 76 拍,n=5 是 284 拍,n=10 是 544 拍。
指令也放在記憶體裡
剛才刪掉 HLT 的時候,CPU 把資料 12 當成指令來擷取。12 的二進位是 000 01100,運算碼是系統指令,但沒有定義這個編號,CPU 只好停下來。記憶體不知道一格是指令還是資料,全看 PC 有沒有指到它。
指令與資料放在同一個記憶體的設計,常被稱為馮紐曼架構(von Neumann architecture),名稱來自 John von Neumann 署名、日期為 1945 年 6 月 30 日的 First Draft of a Report on the EDVAC。不過這份草稿沒有列出 EDVAC 設計團隊的其他人,例如 John Mauchly 與 J. Presper Eckert,所以這個名稱至今仍有爭議。
這個設計的代價與好處都很明顯:
- 好處:換一支程式不用改接線,把新的內容載入記憶體就好。編譯器、作業系統都依賴這一點:對它們來說,程式就是資料。
- 代價:程式和資料共用一條路,同一拍只能走一筆,擷取指令和讀資料要排隊。資料也可能被當成指令執行,有些安全漏洞就是這樣發生的,所以現代系統會把記憶體標成「可執行」或「不可執行」。
從 UC8 到真實的 CPU
UC8 完整地示範了基本原理,但真實處理器還多了很多東西。這裡各用一句話帶過:
- 管線(pipeline):把擷取、解碼、執行分成好幾段同時進行,就像生產線,理想情況下每一拍都可以完成一條指令,不像 UC8 每條指令要 5 到 7 拍。
- 快取(cache):在 CPU 旁邊放一塊小而快的記憶體,存最近用過的內容,不用每次都等主記憶體。
- 多核心(multicore):同一顆晶片裡放好幾個完整的核心,可以真的同時執行好幾段程式。
想繼續往下學:計算機組織課程會把這些主題講完整;作業系統軌會看程式怎麼共用這顆 CPU 與記憶體。
確認一下
一段程式有 LDA x、ADD y、JMP 0 各一條,跑完一圈要幾個時脈週期?
最長路徑是記憶體讀取。把 ALU 換成快一倍的版本,這顆 CPU 的時脈可以提高嗎?
UC8 的 PC 指到一格內容是 000 01100 的資料。CPU 會怎麼處理?
參考作法的迴圈加總,輸入 n=16 時總和是 136,超過 8 位元能表示的 127。UC8 會輸出什麼?
為什麼 UC8 把指令放進記憶體,而不是把程式接成電路?
重點整理
- UC8 是前面所有零件的組合:資料路徑做事、控制單元查控制表決定每一拍做什麼。
- 一個微步驟就是一個時脈週期;UC8 的指令要 5 或 7 拍,一段程式的總拍數可以直接算出來。
- 時脈週期由最長路徑決定,只有縮短最長的路徑才會變快。
- 指令與資料放在同一個記憶體,CPU 靠 PC 決定把哪一格當成指令;這讓換程式變得容易,也帶來把資料當指令執行的風險。
- 真實處理器在這個基礎上加了管線、快取與多核心。
到這裡你已經從一個開關走到一顆會跑程式的 CPU。真實晶片的電晶體多到不可能一條一條接,下一課學著讀工程師實際使用的語言:Verilog。