以前很少用到仿真,這次在仿真的過程中,遇到了某個(gè)警告,于是轉(zhuǎn)過頭又去研究了FIFO中的Safety Circuit的作用。
FIFO在FPGA中用的很多,常用于做少量數(shù)據(jù)的緩存和同步數(shù)據(jù)時(shí)鐘域, 本文將介紹Memory Collision Error on RAMB36E1錯(cuò)誤及相應(yīng)的解決方案,其中涉及到Vivodo FIFO IP核的Safety Circuit設(shè)置。
事情是這樣的,在某個(gè)設(shè)計(jì)中,我需要用異步FIFO同步數(shù)據(jù)的時(shí)鐘域,在這個(gè)工程中,讀寫會(huì)持續(xù)進(jìn)行,雖然讀時(shí)鐘速率是寫時(shí)鐘速率的N倍,但是讀使能N個(gè)讀時(shí)鐘周期才會(huì)拉高一次,所以兩邊速率可以說是一致;在寫入一半的數(shù)據(jù)后,讀過程也開始了,兩邊一讀一寫,F(xiàn)IFO內(nèi)部的數(shù)據(jù)量不增不減。
在仿真的過程中,我遇到了下圖的仿真警告提示。
之所以說不是錯(cuò)誤而是警告,是因?yàn)檫@個(gè)提示并沒有影響最終的結(jié)果。仿真依舊在運(yùn)行,直到結(jié)束。
隨后搜集了一番資料,在參考資料1(AR34859)中,解決方案是對(duì)FIFO內(nèi)部的Block RAM,在雙端口模式下,使用WRITE_FIRST或NO_CHANGE模式;
在資料2(Xilinx Memeory Resource pdf)的17頁,介紹了Block RAM寫模式,幾種模式中,區(qū)別主要在
- WRITE_FIRST: 寫入的數(shù)據(jù)會(huì)馬上出現(xiàn)在數(shù)據(jù)輸出端口
- READ_FIRST: 寫入數(shù)據(jù)的同時(shí),數(shù)據(jù)輸出端口的數(shù)據(jù)還是該地址保存的前一個(gè)數(shù)據(jù)
- NO_CHANGE: 在寫入數(shù)據(jù)的時(shí)候,數(shù)據(jù)輸出端口的數(shù)據(jù)會(huì)一直保持前一次讀出的數(shù)據(jù)不變。
最后,官方給出了避免Conflict的建議。雖然,F(xiàn)IFO內(nèi)部確實(shí)使用了Block RAM,但Xilinx對(duì)其加密了,無法看到內(nèi)部的實(shí)現(xiàn)細(xì)節(jié);官方應(yīng)該不至于在FIFO Block RAM的設(shè)置上有這種錯(cuò)誤,感覺問題并不是出現(xiàn)在這。
把FIFO單獨(dú)拿出來做仿真測(cè)試時(shí),卻怎么也無法復(fù)原這個(gè)BUG。于是找到參考資料3(FIFO IP核手冊(cè)),在Reset相關(guān)章節(jié)發(fā)現(xiàn)了一點(diǎn)玄機(jī)。
FIFO Asynchronous Reset Timing Without Safety Circuit
在異步FIFO里,只能選擇異步復(fù)位,而FIFO內(nèi)部會(huì)把輸入的異步復(fù)位信號(hào)同步到各自的時(shí)鐘域;根據(jù)上圖,復(fù)位信號(hào)拉低后,還是有一段時(shí)間不能對(duì)FIFO有讀寫操作,那么怎么知道是哪段時(shí)間呢。IP核的設(shè)置里面,可以設(shè)置在復(fù)位狀態(tài)下,F(xiàn)ULL的輸出狀態(tài),設(shè)置為1,這樣就可以根據(jù)FULL防止寫入,復(fù)位后EMPTY為1,也可以防止讀取。
而在我對(duì)FIFO的操作中,我好心的把異步復(fù)位信號(hào)同步到RD時(shí)鐘域下,然后輸入到FIFO的RST端口,但是卻沒有注意到這個(gè)地方。
我取消了異步復(fù)位信號(hào)的同步,直接輸入到FIFO的RST,復(fù)位與寫使能之間的時(shí)間隔得足夠長(zhǎng),警告果然消失了。
這里,再介紹另一種方法,選中上圖的Enable Safety Circuit,在Safety Circuit啟用下,時(shí)序圖又變成這樣:
FIFO Asynchronous Reset Timing With Safety Circuit
在復(fù)位后,需要等待WR_RST_BUSY從1到0后,才能進(jìn)行其他的操作(包括復(fù)位和寫);同理,讀取數(shù)據(jù)也需要等待RD_RST_BUSY從1到0。
此外,Enable Safety Circuit會(huì)同步FIFO內(nèi)部的BRAM輸入信號(hào)和輸出信號(hào),具體可以看看參考資料4(AR42571);文檔也提到了,復(fù)位信號(hào)最好保持MAX(3, C_SYNCHRONIZER_STAGE)個(gè)慢時(shí)鐘周期,兩次復(fù)位中間要間隔6個(gè)慢時(shí)鐘周期。
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26452 -
RAM
+關(guān)注
關(guān)注
8文章
1352瀏覽量
114386 -
FIFO存儲(chǔ)
+關(guān)注
關(guān)注
0文章
103瀏覽量
5953 -
RST
+關(guān)注
關(guān)注
0文章
31瀏覽量
7373 -
BRAM
+關(guān)注
關(guān)注
0文章
41瀏覽量
10931
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論