以下文章來源于瓜大三哥 ,作者米果不回來
數字IC設計中我們經常會遇到這種場景,工作在不同時鐘域的兩個模塊,它們之間需要進行數據傳遞,為了避免數據丟失,我們會使用到FIFO。當讀數據的速率小于寫數據的速率時,我們就不得不將那些還沒有被讀走的數據緩存下來,那么我們需要開多大的空間去緩存這些數據呢?緩存開大了會浪費資源,開小了會丟失數據,如何去計算最小FIFO深度是我們討論的重點。
數據突發長度(burst length)
在講解如何去計算FIFO深度之前,我們來理解一個術語burst length,如果你已經了解了可以跳過。要理解數據的突發長度,首先我們來考慮一種場景,假如模塊A不間斷的往FIFO中寫數據,模塊B同樣不間斷的從FIFO中讀數據,不同的是模塊A寫數據的時鐘頻率要大于模塊B讀數據的時鐘頻率,那么在一段時間內總是有一些數據沒來得及被讀走,如果系統一直在工作,那么那些沒有被讀走的數據會越累積越多,那么FIFO的深度需要是無窮大的,因此只有在突發數據傳輸過程中討論FIFO深度才是有意義的。也就是說我們一次傳遞一包數據完成后再去傳遞下一包數據,我們把一段時間內傳遞的數據個數稱為burst length。在維基百科中,burst transmission是這樣解釋的:In telecommunication, a burst transmission or data burst is the broadcast of a relatively high-bandwidth transmission over a short period。我們知道burst length過后,通過上述討論我們大概就知道FIFO的最小深度與burst rate, burst size, read and write frequency等因素有關。要確定FIFO的深度,關鍵在于計算出在突發讀寫這段時間內有多少個數據沒有被讀走。也就是說FIFO的最小深度就等于沒有被讀走的數據個數。其實在一些ASIC論壇中,很多前輩就給出過FIFO深度計算公式,但是當時看到公式時不是太理解它是怎么來的,為了讓大家更好的理解FIFO size的計算過程,這里在不套用計算公式的前提下來逐步計算不同場景FIFO深度,當然在本文的最后會給出FIFO深度的計算公式,只想套用公式的同志可以直接移步到本文末尾。在討論之前我們假定模塊A向FIFO寫數據的時鐘頻率為fa,模塊B從FIFO讀數據的時鐘頻率為fb。
場景1:fa>fb with no idle cycles in both write and read
假設:
那么:
場景2:fa>fb with two clock cycle delay between two successive read and write
場景2在場景1的基礎上增加了一個假設,即讀比寫慢兩拍。這種假設是真正存在的,在異步FIFO設計中,我們需要去判斷FIFO的空滿來保證邏輯的正確性,判斷空滿標志需要去比較讀寫指針,而讀指針與寫指針處在不同的時鐘域中,我們需要采用格雷碼和兩級同步寄存器去降低亞穩態的概率,而兩級同步必然會導致空滿標志位的判斷至少延遲2個cycle。對于空標志位來說,將寫指針同步到讀時鐘域至少需要花費2個時鐘,而在同步這段時間內有可能還會寫入新的數據,因此同步后的寫指針一定小于或等于(當且僅有同步時間內沒有新數據寫入的情況下才會等于)當前的寫指針,所以此時判斷不一定是真空;同理,對于滿標志位來說,將讀指針同步到讀時鐘域至少需要花費2個時鐘,而在同步這段時間內有可能還會讀出新的數據,因此同步后的讀指針一定小于或等于當前讀指針,所以此時判斷并不一定是真滿。通過上述討論可以知道場景2的FIFO最小深度應該比場景1的FIFO最小深度45略大。場景3:fa > fb with idle cycles in both write and read
假設:
- 寫數據時鐘頻率fa=80MHz?讀數據時鐘頻率fb=50MHz?突發長度= number of data to be transferred = 120?每隔1個cycle寫一次?每隔3個cycle讀一次
- 每隔1個cycle寫一次,意味著2個cycle才寫一個數據?每隔3個cycle讀一次,意味著4個cycle才讀一個數據?寫一個數據所需要的時間 = 2*1/80MHz = 25ns?突發傳輸中,寫完所有數據所需要的時間 = 120*25ns = 3000ns?讀一個數據所需要的時間 = 4*1/50MHz = 80ns?所以寫完所有的突發傳輸數據需要花費3000ns?在3000ns內能夠讀走的數據個數 = 3000ns/80ns = 37.5?所以在3000ns內還沒有被讀走的數據個數 = 120-37.5 = 82.5?因此FIFO的最小深度為83
場景4:fa > fb with duty cycles given for wr_enb and rd_enb.
假設:
- 寫數據時鐘頻率fa=80MHz?讀數據時鐘頻率fb=50MHz?突發長度= number of data to be transferred = 120?寫使能信號占整個burst時間比重為1/2?讀使能信號占整個burst時間比重為1/4
那么:
場景5:fa < fb with no idle cycles in both write and read
假設:
- 寫數據時鐘頻率fa=40MHz?讀數據時鐘頻率fb=50MHz?突發長度= number of data to be transferred = 120?在突發傳輸過程中,數據都是連續讀寫的
那么:
- 由于讀數據比寫數據要快,因此FIFO只起到過時鐘域的作用,FIFO的最小深度為1即可
場景6:fa < fb with idle cycles in both write and read
假設:
- 寫數據時鐘頻率fa=40MHz?讀數據時鐘頻率fb=50MHz?突發長度= number of data to be transferred = 120?每隔1個cycle寫一次?每隔3個cycle讀一次
那么:
- 每隔1個cycle寫一次,意味著2個cycle才寫一個數據?每隔3個cycle讀一次,意味著4個cycle才讀一個數據?寫一個數據所需要的時間 = 2*1/40MHz = 50ns?突發傳輸中,寫完所有數據所需要的時間 = 120*50ns = 6000ns?讀一個數據所需要的時間 = 4*1/50MHz = 80ns?所以寫完所有的突發傳輸數據需要花費6000ns?在6000ns內能夠讀走的數據個數 = 6000ns/80ns = 75?所以在6000ns內還沒有被讀走的數據個數 = 120-75 = 45?因此FIFO的最小深度為45
場景7:fa = fb with no idle cycles in both write and read
假設:
- 寫數據時鐘頻率fa=50MHz?讀數據時鐘頻率fb=50MHz?突發長度= number of data to be transferred = 120
那么:
- 如果讀寫時鐘同源并且無相位差,那么可以不需要FIFO;否則FIFO的最小深度為1
場景8:fa = fb with idle cycles in both write and read
假設:
- 寫數據時鐘頻率fa=50MHz?讀數據時鐘頻率fb=50MHz?突發長度= number of data to be transferred = 120?每隔1個cycle寫一次?每隔3個cycle讀一次
那么:
- 每隔1個cycle寫一次,意味著2個cycle才寫一個數據?每隔3個cycle讀一次,意味著4個cycle才讀一個數據?寫一個數據所需要的時間 = 2*1/50MHz = 40ns?突發傳輸中,寫完所有數據所需要的時間 = 120*40ns = 4800ns?讀一個數據所需要的時間 = 4*1/50MHz = 80ns?所以寫完所有的突發傳輸數據需要花費4800ns?在4800ns內能夠讀走的數據個數 = 4800ns/80ns = 60?所以在4800ns內還沒有被讀走的數據個數 = 120-60 = 60?因此FIFO的最小深度為60
場景9:Data rates are given,read and write random(important!!!)
在前面幾種場景中,我們給的條件都是每隔幾個時鐘讀寫一次,這種周期性讀寫在實際中很常見。但是在工程設計中還存在這樣一種情形,只給出數據在一段時間內的讀寫速率,怎么讀寫完全隨機,這種情況我們需要考慮最壞的一種情況避免數據丟失。在最壞的情形中,讀寫的速率應該相差最大,也就是說需要找出最大的寫速率和最小的讀速率。

?注意:這里需要驗證一下是否有解,即寫入burst數據時間必須大于等于讀出burst數據時間,不然數據就會越累積越多,使得FIFO的深度必須為無窮大。首先寫入80個數據需要的時間 = 1/80MHz*(80*100/40)=2500ns,讀出80個數據需要的時間 = 1/50MHz*(80*10/8)=2000ns,由于寫入burst數據時間大于對出burst數據時間,因此有解。?下面來計算FIFO最小深度,連續寫入80個數據最快所需要時間 = 1/80MHz * 80 = 1000ns?從FIFO中讀出一個數據至少所需時間 = (1/50MHz) * (10/8) = 25ns?那么在1000ns內能夠讀出的數據 = 1000ns/25ns = 40?在1000ns內沒有讀出的數據 = 80 - 40 = 40?因此FIFO的最小深度為40
總結
從上面分析來看,求FIFO的最小深度主要有以下要點:
作者:星雨夜澈
出處:http://www.cnblogs.com/dxs959229640/
聲明:歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。