解決布線擁塞問題
1.問題①的解決方法
14.2節(jié)提到的問題①,即設(shè)計(jì)中有很大的扇出,對(duì)于如何獲知該扇出信號(hào)有多種途徑。常見的途徑是通過FPGAEditor(Xilinx)或者Fitter里Resource Section中的Control Signals 或者 Non Global Hign Fan-out Signal(Altera)查看扇出信號(hào)的大小排序。以Altera為例(下面的例子只是一個(gè)示范,并非說該例子是扇出過大導(dǎo)致布線問題),編譯完成后,查看Fitter報(bào)告即可查看扇出,如圖14-2所示。
可以看到,rst這個(gè)復(fù)位信號(hào)的扇出有33個(gè),ena_dly有8個(gè)。該設(shè)計(jì)對(duì)應(yīng)的RTL代碼如下:
從代碼中可以看到,控制信號(hào)enadly有效時(shí)才對(duì)輸入信號(hào)inl和in2的寄存信號(hào)進(jìn)行或操作,因此該控制信號(hào)直接控制著輸出寄存器ut[7:0]的翻轉(zhuǎn),該控制信號(hào)的扇出量為8個(gè)寄存器。所以,通過對(duì)編譯結(jié)果的查詢可以知道扇出信號(hào)較大的為哪些,結(jié)合代碼對(duì)其進(jìn)行修改即可。注意,本段RTL代碼只是舉例說明如何查找和定位扇出信號(hào),并不表明扇出信號(hào)為8就會(huì)導(dǎo)致時(shí)序問題。實(shí)際上非全局信號(hào)的扇出多少才是合理的要看具體的布線情況,且要視FPGA器件而定。在編寫代碼階段要養(yǎng)成時(shí)刻警惕扇出過大的問題,一般而言,如果一個(gè)信號(hào)扇出到幾百個(gè)寄存器或者邏輯單元,則
最好對(duì)該信號(hào)做邏輯復(fù)制。知道如何定位控制信號(hào)的扇出后,我們就要著手于如何修改。對(duì)于此類修改,一般有兩種方法:第一種是讓工具自己做扇出復(fù)制;第二種是設(shè)計(jì)者在代碼中手動(dòng)修改,讓工具自己做扇出復(fù)制。以Altera為例,在settings中,單擊Fitter Settings,然后單擊More Settings,彈出如圖 14-3的界面。
對(duì)圖14-3 中 Auto Register Duplication 和 Logic Cell Insertion -Logic Duplication中的Auto全部改為On,則工具會(huì)對(duì)由扇出引起的布線時(shí)序問題做邏輯復(fù)制。而在手動(dòng)做扇出寄存器/信號(hào)復(fù)制的情況下,則對(duì)該信號(hào)做復(fù)制。以上面的RTL為例子,假設(shè)要把enable信號(hào)的扇出控制到4,那么只須做如下調(diào)整:
可以看到,對(duì)ena_dly做了寄存器復(fù)制,多了一個(gè)ena_dly_dup,這樣ena_dly的信號(hào)扇出就減少了一半,另外一半由ena_dly_dup代替。注意,聲明該寄存器時(shí)有“/*synthesispreserve*/;"語句,這是為了告訴編譯器不要對(duì)該信號(hào)做優(yōu)化,因?yàn)樵谕ǔG闆r下,編譯器會(huì)對(duì)多余或者等效的寄存器做優(yōu)化,只保留一個(gè)。從圖14-4可以看出,ena_dly的扇出減少了一半。
2.問題②的解決方法
關(guān)于第二個(gè)問題,即復(fù)位信號(hào)造成的布局布線問題,一般有如下解決方法:
對(duì)于復(fù)位信號(hào),如果是異步復(fù)位、同步釋放,那么將會(huì)對(duì)removal路徑做時(shí)序分析,該路徑要求所有的復(fù)位信號(hào)在同一個(gè)節(jié)拍內(nèi)撤離且滿足removal的時(shí)序要求。對(duì)于這種情況,如果能夠確定設(shè)計(jì)里所有的寄存器在復(fù)位不在同一個(gè)節(jié)拍內(nèi)無效的情況下也能正常工作,那么可以對(duì)該路徑做falsepath處理,即在時(shí)序約束里對(duì)復(fù)位信號(hào)到所有相關(guān)寄存器的路徑做不分析處理。
另外一個(gè)方式是降低復(fù)位信號(hào)的扇出,沒有必要對(duì)所有的寄存器都加上復(fù)位信號(hào),作者推薦數(shù)據(jù)路徑上的流水線寄存器可以不加復(fù)位信號(hào),只對(duì)控制路徑上的寄存器(如計(jì)數(shù)器、數(shù)據(jù)使能信號(hào))等加上復(fù)位信號(hào),從而大幅度降低復(fù)位信號(hào)的扇出。另外,在Xilinx器件中,不推薦對(duì)BIockRAM、DSP48中的流水線寄存器等加入復(fù)位信號(hào)。
3.問題③解決方法
關(guān)于第三個(gè)問題的解決思路,一般來說設(shè)計(jì)者應(yīng)該極力避免使用FPGA的BlockRAM IP來生成大容量的BlockRAM。比如說,用Block Memory Generator生成一個(gè)位寬為16,深度為1M的BIockRAM。因?yàn)樵谶@種情況下,IP生成工具是把很多Block RAM單元(以AlteraCycloneIV為例,其BlockRAM基本單元為 M9K,即一個(gè)BlockRAM的存儲(chǔ)容量為9kbit,其最大讀寫位寬和深度是確定的)拼接在一起形成-個(gè)大的BIocKRAM。這種情況下,IP生成工具生成的BlockRAM由于多片拼接在起,有可能造成各個(gè)BlockRAM基本單元間的距離過大,進(jìn)而造成走線過長(zhǎng),從而產(chǎn)生擁塞和布線困難問題,如圖14-5所示。
如圖14-5所示,FPGA中每個(gè)BlockRAM單元(以M9K為例)在基底中都是列狀分布,如果生成的BIocKRAM容量太大,那么將會(huì)使用一列甚至是兩列M9K來拼接。而對(duì)于外部信號(hào)來說,就只有ADDR總線、DATA總線、WR信號(hào)等對(duì)其操作,這就要求ADDR、DATA、WR等信號(hào)的輸出寄存器到各個(gè)M9K的時(shí)序路徑都要滿足而如果M9K過多,那么基本上這是不可能達(dá)到的,如此即會(huì)造成布線擁塞。
正確的解決方法是把一個(gè)大的BlockRAM手動(dòng)拼接,假設(shè)要生成一個(gè)位寬為16bit、深度為1M的Block RAM,那么可以把其拆分成10個(gè)位寬為16bit、深度為100K的Block RAM,然后再由這些較小的BlockRAM來組成一個(gè)大的BIockRAM。讀者可能會(huì)問,這跟上面的有何區(qū)別?區(qū)別就是設(shè)計(jì)者可以對(duì)ADDR、DATA、WR等信號(hào)進(jìn)行邏輯復(fù)制,即一共有10個(gè)相同的ADDR,DATA,WR分別操作這10個(gè)BlockRAM,然后根據(jù)操
作結(jié)果進(jìn)行選擇輸出,從而降低了ADDR、DATA、WR等信號(hào)到達(dá)各個(gè)M9K的扇出提高布線成功率,如圖14-6所示。如圖14-6所示,原來一個(gè)大的BIockRAM被拆分成了N個(gè),每個(gè)都由一套等效的ADDR、DATA和WR進(jìn)行控制,從而降低了ADDR、DATA和WR在操作大的BlockRAM時(shí)的扇出,增加了可布線和時(shí)序收斂性。另外,在各個(gè)BIockRAM的輸出MUX里要多打幾級(jí)pipeline,有助于時(shí)序收斂。同理,對(duì)于DSP硬CORE使用過多造成的布線時(shí)序問題,作者推薦對(duì)DSP硬CORE的輸入輸出進(jìn)行多級(jí)pipeline。
4.問題④的解決方法
對(duì)于設(shè)計(jì)中的電路交叉線過多引起的布局布線問題的解決,有可能需要對(duì)電路/邏輯結(jié)構(gòu)進(jìn)行優(yōu)化或者再設(shè)計(jì)。這跟PCB布局布線是一個(gè)道理,如果一個(gè)設(shè)計(jì)在PCB布線時(shí)發(fā)現(xiàn),原理圖設(shè)計(jì)者對(duì)IC之間引腳的連線比較隨意,造成交叉線過多,比如說MCU的通用I/O跟外部芯片的連接,那么這時(shí)候可以選擇調(diào)換MCU通用I/O引腳來降低連線之間的交叉,進(jìn)而降低布局布線難度。比如說,一個(gè)邏輯設(shè)計(jì)的結(jié)構(gòu)如圖14-7所示。
這種結(jié)構(gòu)的數(shù)據(jù)流很容易造成布線擁塞或者布線困難,因?yàn)檩斎霐?shù)據(jù)流之間是交
叉的,而輸出又有反饋環(huán)節(jié)。如果輸入輸出的位寬很大,那么將會(huì)導(dǎo)致布線困難的問題。對(duì)于此類問題,一般來說由于是邏輯電路架構(gòu)/功能所導(dǎo)致,修改需要花費(fèi)很大的力氣。一般來說,在不修改整體架構(gòu)的情況下,在數(shù)據(jù)的輸入輸出之間最好做多級(jí)流水線寄存器,目的并不是減少組合邏輯的層數(shù),而是減少寄存器到寄存器之間的走線。圖14-7的硬件結(jié)構(gòu)存在大量交叉,因此很多內(nèi)部互連需要繞很遠(yuǎn),從而大大增加了走線延時(shí)。這樣就只能增加寄存器的流水級(jí)數(shù),降低寄存器到寄存器之間的走線延時(shí)。
5.問題⑤的解決方法
還有一種情況是FPGA引腳分配不合理導(dǎo)致數(shù)據(jù)流出現(xiàn)大量交叉進(jìn)而導(dǎo)致時(shí)序收斂困難或者布線失敗。在FPGA的基底里面,引腳的排布跟外面封裝的引腳排布是不一樣的,FPGA基底里面的引腳排布大部分位于芯片的左邊、右邊、上邊和下邊,如圖14-8所示。
對(duì)于很多BGA封裝的FPGA,盡管從其封裝圖上看,引腳分布在芯片內(nèi)部,如圖14-9所示,但是實(shí)際上在芯片內(nèi)部,引腳的排布卻是跟圖14-8類似。因此,當(dāng)引腳分配不合理時(shí),在FPGA內(nèi)部的數(shù)據(jù)流有可能造成交叉,或者輸入輸出混在一起,如圖14-10所示。
如果引腳分配不合理,輸入和輸出的I/O在FPGA的基底引腳中的距離都放得很近的話,那么當(dāng)數(shù)據(jù)很多且內(nèi)部邏輯處理占用資源較多時(shí),將會(huì)帶來很大的布線問題因此可酌情對(duì)引腳進(jìn)行調(diào)整,力爭(zhēng)做到數(shù)據(jù)流是順著的,如圖14-11所示。
其實(shí)這一步應(yīng)該在FPGA原理圖設(shè)計(jì)階段的FPGAPinLocation時(shí)就要考慮到寧可在前期的方案設(shè)計(jì)方面多花一點(diǎn)功夫,也不要匆匆上馬,欠缺考慮,只有在前期做足準(zhǔn)備,到后面才會(huì)事半功倍。
小 結(jié)
本章講述了常見的導(dǎo)致FPGA布局布線失敗的典型情況,并給出了解決問題的思路和例子。隨著設(shè)計(jì)規(guī)模越來越大,FPGA時(shí)序收斂的問題日益凸現(xiàn)。因此,在遇到此類問題時(shí)要心中有數(shù),最好在方案規(guī)劃和編碼階段就對(duì)此有準(zhǔn)備和考慮,降低此類問題發(fā)生的概率。
審核編輯:劉清
-
FPGA
+關(guān)注
關(guān)注
1643文章
21925瀏覽量
612627 -
寄存器
+關(guān)注
關(guān)注
31文章
5403瀏覽量
122937 -
RTL
+關(guān)注
關(guān)注
1文章
388瀏覽量
60545 -
PCB布線
+關(guān)注
關(guān)注
21文章
466瀏覽量
42446
原文標(biāo)題:FPGA布局布線失敗怎么辦(三)
文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
FPGA去耦電容如何布局布線
如何應(yīng)對(duì)FPGA的擁塞問題
如何解決高速信號(hào)的手工布線和自動(dòng)布線之間的矛盾
FPGA設(shè)計(jì)的塑封式布局和布線介紹

FPGA的布局布線

MCM布局布線的軟件實(shí)現(xiàn)
FPGA布線為什么會(huì)擁塞呢?如何解決呢
FPGA布線擁塞主要原因及解決方法

PCB布局布線技巧104問
如何解決高速信號(hào)的手工布線和自動(dòng)布線之間的矛盾?
fpga布局布線算法加速
FPGA布局布線的可行性 FPGA布局布線失敗怎么辦

評(píng)論