2017q1 Homework4 (microarch)
===
contributed by <`vtim9907`>
# 前置
- 回顧[計算機組織](https://hackmd.io/s/H1sZHv4R#)
- 觀賞黃婷婷教授的 Computer Architecture [課程錄影](https://www.youtube.com/playlist?list=PLS0SUwlYe8cxMiFW_PiaBu53nOAXl3dxS)
# 問題
考慮以下 MIPS 實作,其 data path 如下:
![](https://i.imgur.com/Nnt55mf.png)
上圖紅色的 `1`, `2`, `3` 對 MIPS 做了對應的修改,請考慮以下狀況,分別解釋對應的程式碼是否能運作:
# Q1
- 做了 `1`: `Stuck at 0 left of cut` 的修改,`sw $s1, 0($s2)` 能否運作?這樣的修改會使得哪些程式無法運作,請列出至少兩項組合語言列表。
## A1
回顧教材時,發現一張很熟悉的圖
> 之前上計組的時候看過也背過,沒想到忘這麼快Orz
- (截自黃婷婷教授的 ppt 教材
![](https://i.imgur.com/rqRHAC3.png)
> 圖中,第一列是 R-type 指令,第二列是 lw ,第三列是 sw ,第四列是 beq。
- 針對題目中被切斷的地方,會影響到的是 `RegWrite`,也就是會影響把值寫回 Register 的指令。
- 然而從上圖很快可以知道,R-type 和 Load 兩類指令會受影響,簡單來說,因為這兩類指令跑完的結果都需要寫回某個 Register,而像 sw 和 beq 就不同,sw 主要是把 register 的值寫回 Memory ,跟 lw 剛好相反 ; 而 beq 也只是單純的比較,沒牽扯到寫值進 Register 的步驟。
- 所以題目中問到 "`sw $s1, 0($s2)`能否運作?",我想答案是可以的,畢竟 sw 不受影響。
# Q2
- 做了 `2` 的修改後,以下程式能否運作?解釋並提出可運作的版本。
```
add $s1, $s1, $s1
add $s1, $t0, $t1
```
## A2
根據題目砍掉的那條,會影響到 Forwarding 的機制,很可能會發生 Data Hazard。
- 再回來看 Q2,第一行做完,由於 Dst 也就是 `$s1` 的結果還沒寫進去,如果下一條指令的 Src1 有用到 `$s1` 那就會拿到錯的值。
- 但是第二道指令沒有 Src 用到 `$s1`,所以說這兩行 code 還是可以正常運作。
### 探討
假設有第三道指令?
- 因為砍掉的這條只會影響下一道指令的 Forwarding 機制,所以如果還有第三道指令,並且用到 `$s1` ,現在第一道指令的`$s1` 結果還是會 Forward 回去的。
- 但是因為不幸的,第二道指令也改動了 `$s1` 的值,所以第三道指令拿到的 `$s1` 依然有可能不是最新的值。
- 為什麼只是有可能不是拿到最新的值呢? 因為圖中砍掉的線只有砍到 Src1 的 Forward 機制,如果說存在第三道指令為 `add $s1, $s0, $s1`,那麼這三行 code 依然可以運作,因為第三道指令的 `$s1` 放在 Src2,所以整個 Forward 機制依然正常。
# Q3
- 做了 `3` 的修改後,以下程式能否運作?
```
addi $s2, $zero, 2
addi $s1, $zero, 2
beq $s2, $s1, exit
```
## A3
砍掉第三條,會影響到 condition branch 的機制
- 根據黃婷婷教授的 ppt 內容,其中一部份寫到
```
Handling Branch Hazard
- Move up branch address calculation to ID
- Check branch equality at ID (using XOR) by comparing the two registers
read during ID
- Branch decision made at ID => one instruction to flush
- Add a control signal, IF.Flush, to zero instruction field of IF/ID
=> making the instruction an NOP
```
- 所以知道,圖中被砍掉的地方,原來是為了希望在 ID 時就可以用 XOR 來確定兩個 registers 的值是否相同,藉以減少 branch 帶來的 delay。
- 那麼根據 Q3 的 code ,因為使用到了 beq,剛好使用到了被砍掉的機制,所以這段 code 沒辦法運作。
### 探討
雖然作業沒寫到,但是小考時有提到該如何做修改,所以我來嘗試看看修改程可以運作的版本。
- 根據本題上面的結論,不能使用的是 condition branch 一類的指令,那麼簡單來說,只要把這類指令換成其他指令的組合,能達到其他功效就 OK! 我的想法是直接照著圖上的路線,用其他指令取代原有的機制。
- 參考 [MIPS Instruction Reference](http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html) ,複習指令集。
- 主要觀念
- 首先 compare 的部份從本題上面的結論也可以知道,用 XOR 來做就好。
- 沒辦法用 beq 判斷結果是否零,那就用 slt 取代,同樣可以確定 XOR 出來的結果是否等於零, 而且得到的結果只有 0 或 1。
- 從題目的結構圖中,可以看到,因為每道指令是 4 bytes,所以有一個 `Shift Left 2` 的 unit ,不過用 sll 也可以模擬。
- 使用 J-type 指令來完成原來 branch 的功能。
code 如下:
```
cmp:
xor $t1, $s2, $s1
slt $t2, $zero, $t1
sll $t2, 2
add $ra, $ra, $t2
jr $ra
------------------------
addi $s2, $zero, 2
addi $s1, $zero, 2
jal cmp
j exit
```
# 小結
計組、計結很重要,實在應該好好理解,背頌的成果很差,很容易忘記... 當然如能實際應用更能加深印象@@
> 黃婷婷教授的 Computer Architecture 開放式課程很讚! 當然,算盤書也是。
# Reference
- [黃婷婷教授的 Computer Architecture 課程錄影](https://www.youtube.com/playlist?list=PLS0SUwlYe8cxMiFW_PiaBu53nOAXl3dxS)
- [計算機組織](https://hackmd.io/s/H1sZHv4R#)
- [MIPS Instruction Reference](http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html)
- [東霖大大的共筆](https://hackmd.io/s/Byl8yvFse#)