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#)