# 2017q1 Homework4 (microarch) contributed by <`rayleigh0407`> ## 預期目標 - 複習 MIPS 內部設計 - 回顧計算機組織結構 - 不只是小考,繼續「誠實面對自己」 ## 作業內容 <br> 考慮以下 MIPS 實作,其 data path 如下: ![](https://i.imgur.com/Y80lxhP.png) 上圖紅色的 `1`, `2`, `3` 對 MIPS 做了對應的修改,請考慮以下狀況,分別解釋對應的程式碼是否能運作: ### <font color="red">1. 做了 `1: Stuck at 0 left of cut` 的修改,`sw $s1, 0($s2)` 能否運作?這樣的修改會使得哪些程式無法運作,請列出至少兩項組合語言列表</font> 先看看這條信號的功能 這是為了檢測是否將資料寫入 register 的信號 (不論是從 Mem 來或是計算結果)。因此若將這條線保持輸出為 0, 資料就無法由計算或是記憶體存入 register , 因此以下組合語言**在存入資料至 Register 時**會失效 (計算功能仍有效): - R-type instructions : add, sub, sll; - I type instructions : **lw (move memory data into register)**, addi, andi, slti. ### <font color="red">2. 做了 `2` 的修改後,以下程式能否運作?解釋並提出可運作的版本</font> ``` add $s1, $s1, $s1 add $s1, $t0, $t1 ``` 切掉這條線, 代表**上一個指令計算出來的值, 無法以 Data forwarding 的方式取值 (但他只切了一條, 代表指令中 $Rs 或 $Rt 其中一個仍然可以 Forwarding )**, 但是在題目的指令中, 並不會發生 Data Hazard, 因此此程式仍然能運作。 ### <font color="red">3. 做了 `3` 的修改後,以下程式能否運作?</font> ``` addi $s2, $zero, 2 addi $s1, $zero, 2 beq $s2, $s1, exit ``` 切掉這條, 代表某些 conditional branch 失效了, 像是 beq, bne。 <br> ![](http://i.imgur.com/nPUZAZR.png) <br> 如上圖所示, beq 及 bne 在比較兩個暫存器時, 若符合要求, 會將 PC 之值轉為 PC + 4 + imm, 砍掉這條即代表這兩個指令永遠只會跳到下一個指令, 無法跳躍到其他地方。 參考上圖可能以為 PC 的來源只有兩個, 其實還有 **jal, j, jr** 等可以決定 PC 的值. <br> ![](http://i.imgur.com/aM3fFCR.png) conditional branch 不能用, 那就自己做一個 ``` ... Branch: subu $t0, $s2, $s1 sltiu $t1, $zero, $t0 xor $t1, $t1, $t1 sll $t2, $t1, 2 add $ra, $ra, $t2 jr $ra addi $s2, $zero, 2 addi $s1, $zero, 2 jal Branch j exit ... ``` subu: 兩數相減 ( unsigned ) sltiu: 比較兩數 若 $t0 > 0 則 $t1 = 1 ( unsigned ) 若相等, 則 $t1 = 0, 右移兩位後與 $ra 相加, $ra 值不變, return 後就會執行` j exit ` 若不相等, 則 $t1 = 1, 右移兩位後與 $ra 相加, $ra = $ra + 4, return 後會跳過 `j exit` 指令 ### 參考資料 [MIPS Instruction Reference](http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html) 大二計算機組織講義