# 2017q1 Homework4 (microarch) contributed by <`illusion030`> --- ## 複習計組 * 資料 * [計算機組織](https://hackmd.io/s/H1sZHv4R#) * 計組課本 * 修完計組之後都忘的差不多了趕緊複習 --- ## 作業要求 ![](https://i.imgur.com/vvhG3vW.png) * 主要是針對 pipelining 和 forwarding 的 datapath 做的修改 ### 第一個修改 * 做了 1: Stuck at 0 left of cut 的修改,`sw $s1, 0($s2)` 能否運作?這樣的修改會使得哪些程式無法運作,請列出至少兩項組合語言列表 * 1 是 pipeline 的 Write-back stage control line 中的 Reg-Write,cut 掉這條線影響到的有 R-type 的 instruction 跟 lw 因為他們兩個在 Reg-Write 要是 1 才會把資料寫回 Register,而 sw 是寫到 Memory 裡所以不受影響 ::: success Answer : `sw $s1, 0($s2)` 不受影響 R-type 例如 `add $0, $1, $2` 和 lw 例如 `lw $1, 0($2)` 會無法運作 ::: --- ### 第二個修改 * 做了 2 的修改後,以下程式能否運作?解釋並提出可運作的版本 ``` add $s1, $s1, $s1 add $s1, $t0, $t1 ``` * 2 是發生 read after write 時 forwarding 需要用到的,他在上一個指令 write 之前把值傳到 ALU 給下一個 Rs 用,像是下面的程式要在第一行指令寫入 `$s2` 前把 `$0, $1` 加起來的值傳給下一行的 `$s2` 使用 ``` add $s2, $s0, $s1 add $s4, $s2, $t3 ``` :::success Answer : ``` add $s1, $s1, $s1 add $s1, $t0, $t1 ``` 可以運作,因為第二個指令的 Rs 跟第一個指令的 Rd 不一樣,所以 cut 掉第 2 條線沒有影響 ::: --- ### 第三個修改 * 做了 3 的修改後,以下程式能否運作? ``` addi $s2, $zero, 2 addi $s1, $zero, 2 beq $s2, $s1, exit ``` * 3 是解決 Branch Hazard 的做法,提早在 cycle 2 就判斷需不需要 branch,當把它 cut 掉後 condition branch 就沒辦法做了 :::success Answer : 無法運作 修改後版本 : ``` 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 ``` :::