這是未新增流水線暫停的系統機構框圖,電腦繪圖的話有時候新增輸入輸出就要進行大改動,我就手畫了
在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,將外殼組裝...