FPGA之流水線演算法

2021-12-30 03:07:40 字數 2987 閱讀 1694

pc 世界永恆不變的信條就是提高效能,其中乙個方法就是提高系統的時鐘頻率。

在另外一篇 blog?靜態時序分析 sta?中已經總結過了,限制系統最大工作頻率的因素有很多,設計者能夠控制的是 dff 之間的組合邏輯的時延 tcomb,降低最大時延路徑(關鍵路徑,critical path)的時延 tcomb,就可以提高系統的工作頻率。

如何降低呢?方法就是流水線(pipeline)。

所謂流水線(pipeline)設計,應該是從****中的 流水生產線 借鑑過來的說法吧。

在汽車生產的時候,假設分為 5 個階段,每個階段都需要 1 個工人花費 1 小時完成,因為後續的階段必須等前面階段完成後才能進行,所以總共需要 5 個小時才能完成一輛汽車。但是採用流水線方式,在進行後續階段時,前面的階段可以進行新的工作,那麼每個小時都可以生產出一輛汽車了,生產效率提高了 5 倍。

可以看到,流水線之所以可以大大提高效率的原因在於:傳統的方式,某個階段進行時,其他階段是空閒等待的,浪費時間;而流水方式中,在處理後續階段時,前面的階段可以進行新的加工,每時每刻,每個工人都是在工作的,這就是流水線能提高生產效率的原因。

和汽車生產類似,組合邏輯路徑可以看作是一條生產線,路徑上的每個邏輯單元都可以看作是乙個階段,都會產生時延。

如果不採用流水設計,前後級組合邏輯依次工作,那麼這條路徑的模型就是原始的生產線

如果採用流水設計,那麼前後級組合邏輯可以同時工作,就像新的生產線一樣

採用流水設計的方法就是:在較長的組合邏輯路徑中插入 dff,將其分割為幾個小的組合邏輯,新的 tcomb 顯然小於原來的 tcomb,所以系統的時鐘頻率就可以提高了。

舉例來說明:設計乙個電路完成 i = (a + b + c + d) + (e + f + g + h) 運算。

下面是沒有流水的設計:

可以計算出第一級 dff 到第二級 dff 之間資料路徑的時延為

tff = tco + tcomb

= tco + 3*tadder

下面是插入兩級流水的設計:

現在相鄰的兩級 dff 之間的組合邏輯只有 1 級加法器,而不是原來的 3 級,這時資料路徑的時延為

tff = tco + tcomb

= tco + tadder

顯然,採用流水後 tff 更小,系統能夠達到的工作時鐘頻率也就更高。

下面更加詳細地分析一下流水帶來的速度效能的提公升。

首先說明,可以使用系統的流量 throughout 和系統的時滯 latency 來衡量速度效能。

throughout: 每個時鐘週期處理的資料量,單位一般是 bps

latency: 資料輸入到資料輸出之間的時間,一般用 時鐘週期的個數 來表示

如下圖所示,兩個 dff 之間存在著大規模的組合邏輯:

組合邏輯的時延決定了系統的最大工作頻率(也即時鐘週期 t 的最小值),此時

latency = tcomb + treg + tclk -- eq1

tbefore = latency = tcomb + treg + tclk -- eq2

其中 treg 表示 dff 帶來的時延,tclk 表示時鐘的 skew 和 jitter 帶來的時延。

在使用流水之後,如下圖所示:

此時,每個 stage 的週期為

tstage = (tcomb)stage + treg + tclk而時延最大的那個 stage 決定了系統的最大工作頻率(也即時鐘週期 tclk 的最小值),此時

tpipe = max + treg + tclk

latency = n * tpipe

在理想狀況下,各 stage 的時延應該相等,從而達到最小的 latency。即

tcombi = tcomb / n所以,最小的流水週期 tpipe 為

(tpipe)min = tcomb / n + treg + tclk代入 latency 的表示式,有

latency = n * (tpipe)min

= tcomb + n(treg + tclk) -- eq3

tafter = tpipe = tcomb / n + treg + tclk -- eq4

首先比較系統的工作頻率,或者 throughout(eq2 和 eq4):

fafter / fbefore = tbefore / tafter

= (tcomb + treg + tclk) / (tcomb/n + treg + tclk)

顯然這個數 > 1,即

conclusion: 系統的工作頻率和 throughout 得到了提公升。

如果定義 k = (treg + tclk) / (tcomb + treg + tclk),為 reg 和 clk 佔的總週期的比例,則

fafter / fbefore = 1 / [(1-k/n) + k]其次,比較 latency(eq1 和 eq3):

lafter / lbefore = [tcomb + n(treg + tclk)] / (tcomb + treg + tclk)顯然這個數 > 1,即

conclusion: 系統的 latency 增加了(增加的很小,近似可以忽略)。

最後比較面積:

conclusion: 使用流水比不使用流水多使用了 n * m 個 dff,還使用了更多的連線資源。

綜上,可以看到,雖然流水可以提高系統的工作頻率和吞吐率,但是它付出的代價是面積和功耗的增加,這也是速度和面積之間相互轉化的體現。

FPGA中流水線的詳細解析

流水線技術幾乎是最常用的提供系統工作速率的強有力手段。它是面積換取速度思想的又一種具體體現。考慮乙個電路每個時鐘週期執行n個操作,工作頻率為f。我們可以認為吞吐量為 n f ops sec。pipeline本質上是通過增加f來提高吞吐量,達到latency和area的tradeoff。什麼決定了最高...

流水線排程

n個作業要在由2臺機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為a i 和b i 你可以安排每個作業的執行順序,使得從第乙個作業在機器m1上開始加工,到最後乙個作業在機器m2上加工完成所需的時間最少。求這個最少的時間...

流水線冒險

流水線冒險 回顧一下常用五階段流水線 f 取指 d 解碼 e 執行 m 訪存 w 寫回 注意 對暫存器檔案的寫只有在時鐘上公升的時候才會更新!資料冒險的原因 對暫存器檔案的讀寫是在不同階段進行的 1.用暫停來避免資料冒險 暫停時,處理器會停止流水線中一條或多條指令,直到冒險條件不再滿足。在本該正常處...