流水線暫停機制的設計

2021-10-12 18:00:27 字數 1835 閱讀 7724

這是未新增流水線暫停的系統機構框圖,電腦繪圖的話有時候新增輸入輸出就要進行大改動,我就手畫了

在openmips流水線cpu設計中,乘累加、乘類減指令在流水線的執行階段占用多個時鐘週期,因此需要暫停流水線,等待這些多週期指令執行完成。

實現流水線的暫停:只需要保持取指令位址pc的值不變。同一時候保持流水線各個階段的暫存器(也就是if/id、id/ex、ex/mem、mem/wb模組的輸出)不變。

openmips採用的改進方法:假如位於流水線第n階段的指令需要多個時鐘週期,進而請求流水線暫停,那麼需要保持取指令位址pc的值不變。同一時候保持流水線第n階段、第n階段之前的各個階段的暫存器不變,而第n階段後面的指令繼續執行。

比如,流水線執行階段的指令請求流水線暫停,那麼保持pc值不變,同一時候保持取指、解碼、執行階段的暫存器不變。可是能夠同意訪存、回寫階段的指令繼續進行。

為此,設計加入ctrl模組。其作用是接收各個階段傳遞過來的流水線暫停請求訊號,從而控制流水線各個階段的執行。為了實現流水線暫停機制,對原有的系統結構框圖做了些修改。

新增流水線暫停的結構框圖

輸出stall是6位的訊號,各位含義如下:

stall[1]:表示流水線取值階段是否暫停,為1表示暫停

stall[2]:表示流水線解碼階段是否暫停,為1表示暫停

stall[3]:表示流水線執行階段是否暫停,為1表示暫停

stall[4]:表示流水線訪存階段是否暫停,為1表示暫停

stall[5]:表示流水下回寫階段是否暫停,為1表示暫停

`define	stop			1'b1

`define nostop 1'b0

module ctrl (

output reg [5:

0] stall,

// 暫停流水線的控制訊號

input wire rst,

input wire stallreq_from_id,

// 來自解碼階段的暫停請求

input wire stallseq_from_ex // 來自執行階段的暫停請求);

always @ (

*) begin

if(rst == `rstenable) begin

stall <=

6'b 00_0000;

end else

if(stallreq_from_ex == `stop) begin

stall <=

6'b 00_1111;

end else

if(stallseq_from_id == `stop) begin

stall <=

6'b 00_0111;

end else begin

stall <=

6'b 00_0000;

endendmodule

新增對應的輸入輸出訊號;

pc模組,增加pc賦值的選擇情況分支;

id模組:在實現載入、儲存指令的時候給stallreq訊號賦值;

ex模組:在實現乘累加、乘類減、除法指令的時候給stallreq訊號賦值;

修改頂層模組openmips對應介面;

流水線設計

流水線使用儲存器件將時鐘週期內關鍵路徑 最大組合延遲的路徑 分割開來,減少了關鍵路徑上各階段延遲並使迪娜路能以更高頻率工作。優點 提高了時鐘頻率,增加了各階段時鐘的計算能力 缺點 所有共享一條流水線的指令的階段和階段次序必須相同,例如 add 指令在儲存器階段什麼也不做 所有中間值必須在各週期鎖存 ...

流水線設計

在這裡記錄一下自己插流水的心得。最近是做了乙個補邊的模組,補完給卷積核做卷積運算。因為只用了乙個fifo還是怎麼樣,時序緊張了,就是大的行快取fifo的輸出接回去fifo的輸入,另一路接到另乙個輸出fifo上。因此插了一級暫存器,插的過程中發現兩個可能會矛盾的點。再加上之前梯度計算部分也涉及到了許多...

流水線設計思想

在硬體電路設計中,流水線設計思想是一種很重要的設計思想,這種思想是一種用面積換速度的思想,用更多的資源來實現高速。面積就是需要的硬體數量,如觸發器的數量 顧名思義,流水線思想,就像工廠中的流水線一樣。假設是乙個手機組裝的流水線,乙個三個步驟 a,將電池裝入手機起來 b,將螢幕組裝起來 c,將外殼組裝...