姚文達(dá)
(中興通訊股份有限公司,天津 300000)
好的編碼風(fēng)格和習(xí)慣不但可以增加代碼的可讀性,減少fpga的邏輯資源,更能對(duì)時(shí)序起到非常顯著的作用,好的編碼風(fēng)格有很多,我們?cè)谶@里只舉一個(gè)小例子——在使用RAM和FIFO的時(shí)候,在RAM和FIFO內(nèi)部都推薦采用對(duì)輸入信號(hào)和輸出信號(hào)都各打一拍的方法來進(jìn)行處理,如果在資源效率等條件允許的情況下,還推薦在外部增加一級(jí)寄存處理,這樣一共加入了三拍處理,輸入一拍,輸出兩拍,這樣可以提高整個(gè)代碼的魯棒性,即便進(jìn)行器件移植也不容易導(dǎo)致時(shí)序變差。
復(fù)位也是容易引起時(shí)序問題的一個(gè)方面,對(duì)于不同廠家的FPGA器件而言,它們所支持的復(fù)位策略是不同的,有的器件內(nèi)部的邏輯資源支持低電平復(fù)位和高電平復(fù)位兩種策略,而Xilinx器件的7系列器件的邏輯資源只支持高電平復(fù)位策略。
如果之前采用的是低電平復(fù)位方法,即檢測(cè)復(fù)位信號(hào)為低時(shí)便進(jìn)行復(fù)位,外部輸入的低電平復(fù)位信號(hào)在經(jīng)過同步化處理之后進(jìn)入BUFG,然后從BUFG出來的低電平復(fù)位信號(hào)直接就輸出至各個(gè)邏輯。這樣就可以使復(fù)位路徑延時(shí)很小。但由于Xilinx器件只能支持高電平復(fù)位策略,即只能通過檢測(cè)復(fù)位信號(hào)為高時(shí)才能進(jìn)行復(fù)位,所以當(dāng)代碼未經(jīng)修改直接移植至Xilinx器件時(shí),低電平復(fù)位信號(hào)在經(jīng)過BUFG輸出之后,需要進(jìn)入反向器處理為高電平復(fù)位信號(hào)之后才能輸出至各個(gè)邏輯,這樣會(huì)導(dǎo)致時(shí)序變差。將所有邏輯的復(fù)位策略均修改為高電平有效復(fù)位,將外部輸入的低電平復(fù)位信號(hào)修改在進(jìn)行同步化至本地處理的時(shí)候同步為高電平有效信號(hào),這樣輸入BUFG的復(fù)位信號(hào)為高電平有效。這樣就可以使走線延時(shí)大大減小,從而滿足設(shè)計(jì)要求。所以在代碼移植過程中,需要考慮器件的特性,改善復(fù)位路徑上的時(shí)序。
由于BRAM的位置在器件內(nèi)部相對(duì)固定,當(dāng)FF扇出驅(qū)動(dòng)多個(gè)BRAM時(shí),軟件會(huì)擺放相關(guān)的多個(gè)BRAM,未必會(huì)將此多個(gè)BRAM放置在集中的區(qū)域,尤其是在BRAM資源占有率很高的時(shí)候,這些BRAM的位置會(huì)放置比較分散,這樣就有可能出現(xiàn)某些BRAM放置的位置離此FF的位置比較遠(yuǎn),如圖所示,這樣在這條路徑上就容易出現(xiàn)時(shí)序不滿足的情況。
在出現(xiàn)此類問題時(shí)候,可以通過減少FF驅(qū)動(dòng)的BRAM數(shù)目來解決,即采用復(fù)制寄存器的方法將前端的FF進(jìn)行復(fù)制,減少其后端驅(qū)動(dòng)的BRAM數(shù)目,如所示。對(duì)于某些時(shí)鐘頻率比較高的不容易滿足時(shí)序的關(guān)鍵路徑,推薦一個(gè)FF只扇出至一個(gè)BRAM的方法,這樣可以極大避免出現(xiàn)時(shí)序告警的可能性。
除了本文提供的時(shí)需優(yōu)化技巧外,時(shí)序的優(yōu)化需要根據(jù)代碼的不同情況,在組合邏輯中插入時(shí)序以減少時(shí)延,從而提高時(shí)序余量,加上本文的例子希望剛接觸時(shí)序的開發(fā)者有所幫助。