一、最原始的指令處理理解
31~26 25~21 20~16 15~11 ---?
?二、流水線
?
三、冒險(xiǎn)問(wèn)題
1.解決數(shù)據(jù)冒險(xiǎn)
(從流水線寄存器通過(guò)旁路傳回?cái)?shù)據(jù)?也叫作?轉(zhuǎn)發(fā))
若產(chǎn)生冒險(xiǎn),則更前面的指令中?需要寫入的目的寄存器剛好是?當(dāng)前指令需要讀取的源寄存器,此時(shí)對(duì)于當(dāng)前源寄存器而言,這個(gè)寄存器內(nèi)部的數(shù)據(jù)并不是準(zhǔn)確的,因?yàn)樗枰玫角耙粋€(gè)指令產(chǎn)生的結(jié)果。此時(shí)可以用到旁路,解決這個(gè)問(wèn)題。
觀察指令可知:
????????R型指令,需要用到rs,rt源寄存器,寫入rd目的寄存器
????????beq指令,需要用到rs,rt源寄存器,不需要寫入
????????sw指令,需要用到rs,rt源寄存器,不需要寫入
????????lw指令,需要用到rs源寄存器,寫入rt目的寄存器
可知,beq和sw指令?不會(huì)對(duì)后面指令產(chǎn)生影響,因?yàn)樗鼈儍H僅使用該寄存器值,并不修改該寄存器值,后面指令訪問(wèn)該源寄存器的值依然是準(zhǔn)確的。
會(huì)產(chǎn)生冒險(xiǎn)的只有R型-X?或 lw-X。
旁路能解決的是 R型-X? 或者 Lw-X(X不用到lw的目的寄存器)-R型?
不能直接通過(guò)旁路而需要流水線阻塞的是?取數(shù)-使用型數(shù)據(jù)冒險(xiǎn)
兩種旁路,第一種答案可從EX/MEM中取得,第二種答案可從MEM/WB中取得。
情況:
一個(gè)指令的兩個(gè)源寄存器分別是上兩個(gè)指令的目的寄存器。如:
add $s0,$t0,$t1
add $t1,$t2,$t0
add $s1,$s0,$t1
這時(shí),當(dāng)?shù)谌龡ladd到ALU輸入時(shí),第二條已經(jīng)ALU運(yùn)算完了,結(jié)果在EX/MEM里可以取出,第一條已經(jīng)到MEM/WB里,可以取出
一個(gè)指令的一個(gè)源寄存器是上兩個(gè)指令的目的寄存器。如:
add $t1,$t0,$t1
add $t1,$t2,$t0
add $s1,$s0,$t1
這時(shí)第二條已經(jīng)ALU運(yùn)算完了,結(jié)果在EX/MEM里可以取出,第一條已經(jīng)到MEM/WB里,可以取出,但是第三條需要的t1是最新的t1也就是第二條指令里面的t1,所以它需要從最新的EX/MEM中取出。阻斷MEM/WB的。
一個(gè)指令的一個(gè)源寄存器是上一個(gè)指令的目的寄存器或者是上上一個(gè)指令的目的寄存器。
旁路解決:在ALU輸入處加選擇門的選擇端(多選器)
必須為寫入指令才會(huì)影響下面的指令才需要旁路,所以RegWrite=1
①EX/MEM轉(zhuǎn)發(fā)條件:(即應(yīng)當(dāng)從EX/MEM流水線寄存器通過(guò)旁路得到結(jié)果)
(1)當(dāng)上一條指令為寫入時(shí),寫指令應(yīng)當(dāng)為1
EX/MEM.RegWrite=?1
(2)當(dāng)上一條指令的目的寄存器與當(dāng)前源寄存器相同時(shí)
ID/EX.RS(RT)=EX/MEM.Rd (這里的Rd一定為15~11的目的寄存器,因?yàn)閷?duì)于lw指令的rt目的寄存器是沒(méi)辦法在這里進(jìn)行旁路的,在這里進(jìn)行旁路是無(wú)效的,如果這里的下一條指令的RS為lw的Rt時(shí),實(shí)際上已經(jīng)產(chǎn)生了阻塞(這在后面我們會(huì)知道),加入了空指令,也就是說(shuō)這時(shí)的EX/MEM.Rd為空,也就是在EX/MEM階段不可能要取的是lw的rt,如果要取那么產(chǎn)生阻塞,也是在MEM/WB中取,當(dāng)且僅當(dāng)這個(gè)EX/MEM.Rd是15~11的R型目的寄存器才有效,所以無(wú)論如何不會(huì)出現(xiàn)ID/EX.RS=lw.Rt?然后取出ALU運(yùn)算后的的地址的問(wèn)題。)
(3)當(dāng)上一條指令的目的寄存器不是zero寄存器時(shí)
EX/MEM.Rd≠$zero(為什么上一條指令的目的寄存器不能為$zero?其實(shí)并不是$zero的值被修改了,實(shí)際上沒(méi)被修改。上一條指令的ALU的計(jì)算結(jié)果放在了EX/MEM流水線寄存器組里面,這個(gè)時(shí)候的結(jié)果并沒(méi)有傳給$zero,而此時(shí)目的寄存器實(shí)實(shí)在在確實(shí)是$zero,也就是說(shuō),它會(huì)誤認(rèn)為現(xiàn)在EX/MEM流水線寄存器組里面的值?就是需要的結(jié)果值,也就是ID/EX.RS=EX/MEM.Rd成立,所以會(huì)把結(jié)果值拿出來(lái),但實(shí)際上$zero還是那個(gè)zero。它只判斷?目的寄存器是否為源寄存器,然后把流水線的值轉(zhuǎn)發(fā)給ALU,這個(gè)流水線的值?實(shí)際上并不是目的寄存器的現(xiàn)有值。)
②MEM/WB轉(zhuǎn)發(fā)條件:
(1)MEM/WB.RegWrite=1
(2)ID/EX.RS(RT)=MEM/WB.Rd(Rt)
(3)MEM/WB.Rd≠$zero
?
?
2.取數(shù)-使用型數(shù)據(jù)冒險(xiǎn)
?
流水線阻塞:lw指令的目的寄存器rt,只有當(dāng)它經(jīng)過(guò)?數(shù)據(jù)存儲(chǔ)器取出數(shù)據(jù)之后,才是正確的,也就是說(shuō),對(duì)于lw型指令,它如果能用到旁路,正確的數(shù)據(jù)也僅僅會(huì)在MEM/WB流水線寄存器組里面。如果有一條指令如下:
lw $t0,200($s0)
add $t1,$t0,$s1
lw指令的目的寄存器,剛好就是下一條指令的源寄存器,根據(jù)流水線的實(shí)現(xiàn)原理可知,當(dāng)lw執(zhí)行到取出數(shù)據(jù)存儲(chǔ)器的值?放入MEX/WB流水線寄存器組中時(shí),add指令不得不執(zhí)行到EX/MEM了,也就是它已經(jīng)算完了,這顯然不正確。換個(gè)思路,當(dāng)add指令到需要輸入ALU計(jì)算時(shí),lw才執(zhí)行到MEM階段,還未取出值,這顯然是不行的。
所以此時(shí)不得不產(chǎn)生流水線阻塞。
產(chǎn)生氣泡:由于指令在ID階段譯碼成功,則在ID/EX流水線寄存器里就已經(jīng)知道了,該條指令是什么指令,如果此時(shí)是一條lw指令,并且前一條在IF/ID指令的源寄存器用到了lw指令中的rt那么必然會(huì)阻塞,所以可以在這里判斷。
判斷什么?
IF(ID/EX.MemRead=1 and? ? ?//唯一的寄存器寫入操作?lw
(ID/EX.Rt=IF/ID.Rs or ID/EX.Rt=IF/ID.Rt)? ?//rt?與?后一條的源寄存器重合文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-469926.html
PS:這里仍然會(huì)有一點(diǎn)不必要的氣泡,但是不必要的氣泡一定是沒(méi)錯(cuò)的,只是并不必要而已,比如?若連續(xù)出現(xiàn)了lw指令,且后一個(gè)lw不用到前一個(gè)lw寫入的目的寄存器,且同時(shí)寫入同一個(gè)寄存器,這樣也會(huì)插入一個(gè)氣泡,因?yàn)榍昂髍t相同,但顯然并不需要?dú)馀荨_€有一個(gè)就是jump指令,jump指令的rs和rt無(wú)效,所以并不需要?dú)馀?。(不考慮)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-469926.html
到了這里,關(guān)于處理器(計(jì)組課程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!