# 2017q1 Homework4 (microarch)
contributed by <`illusion030`>
---
## 複習計組
* 資料
* [計算機組織](https://hackmd.io/s/H1sZHv4R#)
* 計組課本
* 修完計組之後都忘的差不多了趕緊複習
---
## 作業要求

* 主要是針對 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
```
:::