###### tags: `computer organization` `note` `thu` {%hackmd theme-dark %} # computer organization Chapter 4 ## 一個CPU需要的components 1. Program counter 2. Sign Extension Unit 3. Adder 4. Register 5. ALU 6. Data memory 7. Instruction memory ## 各種指令的Datapath ## ***1. R-type*** ![](https://i.imgur.com/M1hyAtL.png) | flag | 值 | 註解 | | -- | -- | -- | |RegDst|1|有rd| |RegWrite|1|有寫入暫存器| |ALUSrc|1|有做運算| |PCsrc|0|沒有跳躍| |MemRead|0|沒有讀取記憶體| |MemWrite|0|沒有寫入記憶體| |MemtoReg|0|沒有從記憶體寫入暫存器| |ALUOp|10|R-type專用| |ALU control|xxxx|根據指令| ## ***2. I-type*** - ### load word ![](https://i.imgur.com/AwQ0ELJ.png) | flag | 值 | 註解 | | -- | -- | -- | |RegDst |0 | 無rd | |RegWrite | 1 | 有寫入暫存器| |ALUSrc|1 |有經過有號運算| |PCsrc |0 |沒有跳躍| |MemRead |1 |有讀取記憶體 | |MemWrite |0|有寫入記憶體| |MemtoReg|1|有從記憶體寫入暫存器| |ALUOp|00|I-type專用| |ALU control|0010|I-type專用| - ### store word ![](https://i.imgur.com/K5QRYhQ.png) | flag | 值 | 註解 | | -- | -- | -- | |RegDst|x|無rd| |RegWrite|0|沒有寫入暫存器| |ALUSrc|1|有經過有號擴充| |PCsrc|0|沒有跳躍| |MemRead|0|沒有讀取記憶體| |MemWrite|1|有寫入記憶體| |MemtoReg|x|沒有從記憶體寫入暫存器| |ALUOp|00|I-type專用| |ALU control|0010|I-type專用| - ### branch on equal ![](https://i.imgur.com/WPMQ76y.png) | flag | 值 | 註解 | | -- | -- | -- | RegDst|x|無rd| RegWrite|0|沒有寫入暫存器| ALUSrc|0|有經過有號擴充| PCsrc|1|if Zero=1, then 有跳躍| MemRead|0|沒有讀取記憶體| MemWrite|0|沒有寫入記憶體| MemtoReg|x|沒有從記憶體寫入暫存器| ALUOp|01|I-type專用| ALU control|0010|I-type專用| ## ***3. J-type*** ![](https://i.imgur.com/aJcNKOf.png) ## MIPS Pipeline stages ### 為何需要Pipeline - Clock Cycle Time又稱為時脈週期,代表電腦裡面計時器一個Cycle的時間。在上一回的內容中,我們將CPU組裝起來,這時候所有的零件連接在一起,代表要做完所有步驟才會輪到下一個指令,所以一個Cycle的時間就要訂成最長的指令時間,也就是說假設每個指令需要的時間為: |指令類型 | 時間 | | -------- | -------- | | R-Type | 400ps | |Load word| 600ps| |Store word |550ps| |Branch| 350ps| |Jump |200ps| - 這樣我們就必需以最長的600ps為一個cycle,也就是每600ps才能完成一個指令?太慢了! ![](https://i.imgur.com/U8UMZuT.png) - 假設現在有四個人要洗衣服,步驟有洗衣服 30min、烘衣服 40min、摺衣服 20min,如果大家輪流做,並且全部做完才輪到下一個人,那麼就會發生: ![](https://i.imgur.com/dKCIWHs.png) - 不僅時間會拖很久,中間洗衣機及烘衣機都會有很大的時間處於閒置狀態,如果我們能夠讓機器在閒置的時候就交給下一個人使用,那麼時間軸就會變成: ![](https://i.imgur.com/4qPoR4n.png) - 如此一來就可以大幅減少時間,這就是Pipeline的觀念,將過程拆成多個Stage來執行,前一個Stage結束後就交給下一個指令進行該Stage。 ### MIPS的Pipeline Stages 對於MIPS我們拆成5個Stage,分別為 | Stage縮寫 | 全名 | 作用 | | -| - | - | | IF |Instruction Fetch |取得指令 | |ID |Instruction Decode & Register Read | 指令解碼和讀取Register| |EX |Execution or Address Calculation| 執行或位址運算| |MEM |Data Memory Access |記憶體讀取| |WB |Write Back |寫回Register| ## performance issue ### 公式:$$ ( Instruction\ count + ( Pipeline\ stage -1 ) ) \cdot colck\ cycle\ time $$ 若IC有無限個,和無管線化比較快了( Pipeline stage )倍。 ## Hazards ### Structure Hazard 硬體資源不足(只有一個memory),導致兩個指令同時對同一個記憶體進行存取。 解決方式: stall,導致管線出現bubble。 ### Data Hazard 某一指令需要用到前面指令尚未產生的結果。 解決方式: #### 1.Forwarding(bypassing):不等到第一個指令將結果寫回,直接在第一個指令完成 Execution 時將結果傳送給第二個指令的 Execution Input 。 #### 2.Code Scheduling to Avoid Stalls:重排指令順序以避免stall。 若遇到load-use則不能使用Forwarding。 ### Control Hazard 分支指令尚未決定是要否要跳躍至其他指令時,後面的指令已經進入管線。 解決方式:需提早決定是否要跳躍(在ID stage增加硬體)。