通常在設計中我們采用多級流水線對組合邏輯進行分割,流水線的設計不僅使系統擁有更好的timing 并且當流水線級數較多時還可以有效的壓縮bubble。 這裡簡單介紹一種基于ready/valid握手信号的pipeline的設計方法。一個三級流水線的結構如下圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jNxIjM1kzM3EDOwgDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
對于如圖所示的pipeline 有 ready0=~(valid0&!ready1); ready1=~(valid1&!ready2); ready2=~(valid2&!ready_out);即對于每個fliflop 當資料準備好但與後一級握手失敗時才會将ready信号拉低。 [email protected](posedge clk) begin if(valid(x-1)&readyx)
data x<=data x-1;
end
always @(posedge clk) begin if(readyx) validx<=validx-1;
end
可以看到當輸出的ready_out拉低時 流水線不會馬上停住,仍然會讓每一個fliflop中吃滿資料時再停止工作。當pipeline處于停滞狀态時,當ready_out拉高後流水線可以馬上開始工作。是以采用流水線設計可以有效的壓縮bubble。且由于多級流水線将組合邏輯切斷,可以使系統擁有更大的吞吐率