網(wǎng)站建設(shè)開發(fā)網(wǎng)站案例項(xiàng)目費(fèi)用合肥網(wǎng)絡(luò)優(yōu)化公司有幾家
萌新的RiscV學(xué)習(xí)之流水線控制-9
我們按照在之前的單周期設(shè)計(jì)加入控制單元 那么我們能夠在后續(xù)的設(shè)計(jì)中提供方便 我們也在流水線中加入一個control單元
我們先按照書上的指令op碼值介紹一遍基本功能
接下來我們講述control 的 控制效果 關(guān)于這些串口判別的使用
由于控制線從 EX 階段開始,我們可以在指令譯碼階段為之后的階段創(chuàng)建控制信號。傳遞這些控制信號最簡單的方式就是擴(kuò)展流水線寄存器以包含這些控制信息。
最后三個階段的七條控制線。需要注意的是,在 EX 階段使用了七條控制線中的兩條,剩下的五條被傳遞到擴(kuò)展的 EX/MEM 流水線寄存器中以保持控制線;在MEM 階段中使用了三條控制線,最后兩條傳遞到 MEM/WB 寄存器用于WB 階段
我們在上面講述的更多的是關(guān)于理論方面的講解 我們接下來講述關(guān)于具體指令的實(shí)際應(yīng)用
sub x2 ,x1,x3
and x12 , x2 , x5
or x13 , x6 , x2
add x14, x2,x2
sd x15 , 100(x2)
我們會發(fā)現(xiàn)所有的后四條指令都采用了第一條指令中的x2值 所以我們在指令的確切使用中要注意選取合適的數(shù)據(jù)
在第五個時(shí)鐘周期之前,對寄存器 x2 的讀操作并不能返回 sub 指令的結(jié)果。因此,圖中的 add sd 指令可以得到正確結(jié)果-20, 但是 and or 指令卻會得到錯誤的結(jié)果 10 。在這種類型的圖中,每當(dāng)相關(guān)線在時(shí)間線上表示為后退時(shí)(箭頭指向左上方),這個問題就會變得很明顯。
在第三個時(shí)鐘周期也就是 sub 指令的 EX 指令階段結(jié)束時(shí)就可以得到想要的結(jié)果。那么在 and or 指令中是什么時(shí)候才真正需要這個數(shù)據(jù)呢?答案是and or 指令的 EX 階段開始的時(shí)候,分別對應(yīng)第四和第五個時(shí)鐘周期。因此,只要可以一得到相應(yīng)的數(shù)據(jù)就將其前遞給等待該數(shù)據(jù)的單元,而不是等待其可以從寄存器堆中讀取出來,就可以不需要停頓地執(zhí)行這段指令了。
它這邊的說法是我們看似是從這個寄存器內(nèi)部取到數(shù)據(jù)但是 我想要寄存器編號
但是我們真正想要的是數(shù)據(jù) 我們可以在上一部分的EX階段直接取到得到后的數(shù)據(jù)
命名流水線寄存器字段是一種更精確的表示相關(guān)關(guān)系的方法。例如, ID/EX. Register Rs I 表示一個寄存器的編號,它的值在流水線寄存器 ID.EX 中,也就是這個寄存器堆中第一個讀端口的值。該名稱的第一部分,也就是點(diǎn)號的左邊,是流水線寄存器的名稱;第二部分是寄存器中字段的名稱。使用這種表示方法,可以得到兩對冒險(xiǎn)的條件:la. EX/MEM.Re gisterRd = ID/EX.Re gisterRsl 1 b. EX/MEM.Re gisterRd = ID/EX.Re gisterRs2 2a. MEM/WB.Re gisterRd = ID/EX.Re gisterRsl 2b. MEM/WB.Re gisterRd = ID/EX. Re gisterRs2 在本節(jié)開頭的代碼中,指令序列中的第一個冒險(xiǎn)發(fā)生在寄存器 x2 上,位于 sub 指令sub x2, x l, x3 的結(jié)果和 and 指令 and xl2, x2, x5 的第一個讀操作數(shù)之間。這個冒險(xiǎn)可以在 and 指令位于 EX 階段、 sub 指令位于 MEM 階段時(shí)被檢測到,因此這種冒險(xiǎn)屬la 類型:EX/MEM.Re gisterRd = ID/EX.Re gister Rs 1 = x2
這種一勞永逸的方法是錯誤的,并不是所有的指令都會寫回寄存器,所以這個策略是不正確的,它有時(shí)會在不應(yīng)該前遞的時(shí)候也將數(shù)據(jù)前遞出去。一種簡單的解決方案是檢查 Re Writ 信號是否是有效的:檢查流水線寄存器在 EX MEM 階段的 WB 控制字段以確定 Re Write 信號是否有效。
因此,只要流水線寄存器保存了將要被前遞的數(shù)據(jù),后續(xù)的指令就可以得到所需的數(shù)據(jù)。
各流水線寄存器之間的相關(guān)關(guān)系會隨著時(shí)間向前移動,因此可以通過前遞在流水線寄存器中找到的結(jié)果,以提供 and 指令或 or 指令所需的 ALU 的輸入。流水線寄存器中的值表示所需的值在被寫入寄存器堆之前就是可用的。我們假設(shè)寄存器堆可以前遞在同一時(shí)鐘周期內(nèi)要被讀寫的數(shù)據(jù),這樣 add 指令就不需要停頓了,不過這些值來自流水線寄存器而不是寄存器堆。寄存器堆前遞,即讀操作獲得的值是本時(shí)鐘周期內(nèi)寫操作的結(jié)果,這就是為什么第五個時(shí)鐘周期中顯示寄存器 x2 在前半個周期內(nèi)的值為 10 而在周期結(jié)束時(shí)的值為-20
如果我們可以從任何流水線寄存器而不僅僅是 ID/EX 中得到 ALU 的輸入,那就可以前遞正確的數(shù)據(jù)。通過在 ALU 的輸入上添加多選器再輔以適當(dāng)?shù)目刂?#xff0c;就可以在存在數(shù)據(jù)冒險(xiǎn)的情況下全速運(yùn)行流水線。
現(xiàn)在,假設(shè)需要前遞的指令只有這四種形式: add sub and or 指令。下圖是ALU 和流水線寄存器在添加前遞之前和之后的“特寫。還有一個是 ALU 多選器的控制線的值,它選擇寄存器堆的值或是被前遞的值中的一個。
這個前遞控制將發(fā)生在 EX 階段,因?yàn)?ALU 前遞多選器在 EX 階段。因此,我們必須ID 階段通過 ID/EX 流水線寄存器將操作數(shù)寄存器編號傳遞出去,以決定是否需要前遞值。在加入前遞機(jī)制之前, ID/EX 流水線寄存器無須保存 rs 字段和 rs2 字段,但是因?yàn)榍斑f機(jī)制的需要,現(xiàn)在要將保存 rsl rs2 所需的空間添加到 ID/EX 流水線寄存器中。