Try   HackMD

2017q1 Homework4 (microarch)

contributed by <illusion030>


複習計組

  • 資料
  • 修完計組之後都忘的差不多了趕緊複習

作業要求

  • 主要是針對 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 裡所以不受影響

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

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 就沒辦法做了

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