要知道,要把一件事情做好,不管是做哪們技術(shù)還是辦什么手續(xù),明白這個事情的流程非常關(guān)鍵,它決定了這件事情的順利進(jìn)行與否。同樣,我們學(xué)習(xí)FPGA開發(fā)數(shù)字系統(tǒng)這個技術(shù),先撇開使用這個技術(shù)的基礎(chǔ)編程語言的具體語法、使用工具和使用技巧不談,咱先來弄清楚FPGA的開發(fā)流程是什么。 ?
FPGA的開發(fā)流程是遵循著ASIC的開發(fā)流程發(fā)展的,發(fā)展到目前為止,F(xiàn)PGA的開發(fā)流程總體按照圖1進(jìn)行,有些步驟可能由于其在當(dāng)前項目中的條件的寬度的允許,可以免去,比如靜態(tài)仿真過程,這樣來達(dá)到項目時間上的優(yōu)勢。但是,大部分的流程步驟還是需要我們循規(guī)蹈矩的去做,因為這些步驟的輸入是上一個步驟的結(jié)果,輸出是下一個步驟的輸入的關(guān)系,這樣的步驟就必不可少了。 ?
有人看到這個流程圖的時候,第一個發(fā)自內(nèi)心的感嘆是“啊,怎么這么麻煩啊,特別是之前從事軟件開發(fā)轉(zhuǎn)過來的。對于他們來講,很少有接觸到一種技術(shù)有如此多的環(huán)節(jié)來實現(xiàn)。但是這并不能說明FPGA開發(fā)的具體難度,與軟件開發(fā)有輸入、編譯、鏈接、執(zhí)行步驟對應(yīng)的就是設(shè)計輸入、綜合、布局布線、下載燒寫,F(xiàn)PGA開發(fā)只是為了確保這核心實現(xiàn)主干路每一個環(huán)節(jié)的成功性加了其他的修飾(約束)和驗證而已。下面,我們將以核心主干路為路線,一一介紹每個環(huán)節(jié)的物理含義和實現(xiàn)目標(biāo)。 ?
1
設(shè)計輸入
1.設(shè)計輸入方式 ? 從圖1 FPGA開發(fā)流程中的主干線上分離出第一步設(shè)計輸入橫向環(huán)節(jié),并做了進(jìn)一步的細(xì)節(jié)的處理,如圖2,從圖上看到,設(shè)計輸入方式有三種形式,有IP核、原理圖、HDL,由此展開設(shè)計輸入方式的探討。 ?
原理圖輸入
原始的數(shù)字系統(tǒng)電路的設(shè)計可能大家還不可能想象,是用筆紙一個個邏輯門電路甚至晶體管搭建起來的,這樣的方式我們稱作原理圖的輸入方式。那個時候,硬件工程師們會圍繞的坐在一塊,拿著圖紙來討論電路。幸虧那時候的數(shù)字電路的還不是很復(fù)雜,要是放到今天,稍微大一點的系統(tǒng),也算得上是浩大工程,稍微有點電路要修改的話,這個時候你要是一個沒耐心或是一個急性子的人可能就就會喪失對這個領(lǐng)域的興趣。話說回來,那個年代出來的老工程師們,電路基礎(chǔ)功夫確實很扎實。
? 事情總是朝著好的方向發(fā)展的,后來出現(xiàn)了大型計算機(jī),工程師們開始將最原始的打孔的編程方式運用到數(shù)字電路設(shè)計當(dāng)中,來記錄我們手工繪畫的電路設(shè)計,后來存儲設(shè)備也開始用上了,從卡片過度到了存儲文本文件了,那個時候網(wǎng)表文件大致是起于那個時候。 ? 需要注意的問題是原理圖和網(wǎng)表文件的關(guān)系,原理圖是我們最開始方便我們設(shè)計的一個輸入方式,而網(wǎng)表文件是計算機(jī)傳遞原理圖信息給下一道流程或是給仿真平臺進(jìn)行原理圖描述仿真用的。設(shè)計輸入方式不一樣,但是對于功能仿真來講,最終進(jìn)度到仿真核心的應(yīng)該是同一個文件,那么這個文件就是網(wǎng)表文件了。
? 有了計算機(jī)的輔助,數(shù)字電路設(shè)計起來可以說進(jìn)步了一大截,但是如果依然全部是基于邏輯門晶體管的話,還是比較繁瑣。于是后來出現(xiàn)了符號庫,庫里包含一些常用的具有通行的器件,比如D觸發(fā)器類的等等,并隨著需求的發(fā)展,這些符號庫不斷的在豐富。與在原理圖里利用這些符號庫構(gòu)建電路對應(yīng)的是,由原理圖得到的這個網(wǎng)表文件的描述方式也相應(yīng)的得到擴(kuò)展,那么這里網(wǎng)表文件里對電路符號的描述就是最開始的原語了。
? 作為最原始的數(shù)字電路ASIC設(shè)計輸入的方式,并從ASIC設(shè)計流程延續(xù)到FPGA的設(shè)計流程,有著它與生俱來的優(yōu)點,就是直觀性、簡潔性,以致目前依然還在使用。但是需要注意的是,這也是相對的,具體討論見下一小節(jié)。 ?
HDL輸入
HDL全稱是硬件描述語言Hardware Description Language,這種輸入方式要追溯的話得到20世紀(jì)90年代初了。當(dāng)時的數(shù)字電路的規(guī)模已足以讓按照當(dāng)時的輸入方式進(jìn)行門級抽象設(shè)計顧左顧不了右了,一不小心很容易出錯,而且得進(jìn)行多層次的原理圖切割,最為關(guān)鍵的是如何能做到在更抽象的層次上描述數(shù)字電路。 ? 于是一些EDA開始提供一種文本形式的,非常嚴(yán)謹(jǐn),不易出錯的HDL輸入方式開始提供了。特別是在1980年的時候,美國軍方發(fā)起來甚高速集成電路(Very-High-Speed Integrated Circuit)計劃,就是為了在部隊中裝備中大規(guī)模需求的數(shù)字電路的設(shè)計開發(fā)效率,那么這個VHSIC硬件描述語言就是我們現(xiàn)在的VHDL語言,它也是最早成為硬件描述語言的標(biāo)準(zhǔn)的。與之相對的是晚些時間民間發(fā)起的Verilog, 后來到1995年的時候,它的第一個版本的IEEE標(biāo)準(zhǔn)才出臺,但是沿用至今。 ? 前面提到HDL語言具有不同層次上的抽象,這些抽象層有開關(guān)級、邏輯門級、RTL級、行為級和系統(tǒng)級,如圖3。其中開關(guān)級、邏輯門級又叫結(jié)構(gòu)級,直接反映的是結(jié)構(gòu)上的特性,大量的使用原語調(diào)用,很類似最開始原理圖轉(zhuǎn)成門級網(wǎng)表。RTL級又可稱為功能級。 ?
HDL語言除了前面提到的兩種外,歷史上也出現(xiàn)了其他的HDL語言,有ABEL、AHDL、硬件C語言(System C語言、Handle-C)、System verilog等。其中ABEL和AHDL算是早期的語言,因為相比前面兩種語言來講,或多或少都有些致命的缺陷而在小范圍內(nèi)使用或者直接淘汰掉了。而因為VHDL和Verilog在仿真方面具有仿真時間長的缺陷,System verilog和硬件C語言產(chǎn)生了,從圖3看,System Verilog是在系統(tǒng)級和行為級上為Verilog做補(bǔ)充,同時硬件C語言產(chǎn)生的原因還有就是有種想把軟件和硬件設(shè)計整合到一個平臺下的思想。 ?
IP(Intellectual Property)核
? 什么是IP核?任何實現(xiàn)一定功能的模塊叫做IP(Intellectual Property)。這里把IP核作為一種輸入方式單獨列出來,主要考慮到完全用IP核確實是可以形成一個項目。它的產(chǎn)生可以說是這樣的一個逆過程。 ? 在隨著數(shù)字電路的規(guī)模不斷擴(kuò)大的時候,面對一個超級大的工程,工程師們可能是達(dá)到一種共識,將這規(guī)模巨大而且復(fù)雜的設(shè)計經(jīng)常用到的具有一定通用性的功能給獨立出來,可以用來其他設(shè)計。當(dāng)下一次設(shè)計的時候,發(fā)現(xiàn)這些組裝好的具有一定功能的模塊確實挺好用的,于是越來越多的這種具有一定功能的模塊被提取出來,甚至工程師之間用來交換,慢慢大家注意到它的知識產(chǎn)權(quán),于是一種叫做IP知識產(chǎn)權(quán)的東西出來了,于是集成電路一個全新領(lǐng)域(IP設(shè)計)產(chǎn)生了。 ?
IP按照來源的不同可以分為三類,第一種是來自前一個設(shè)計的內(nèi)部創(chuàng)建模塊,第二種是FPGA廠家,第三種就是來自IP廠商;后面兩種是我們關(guān)注的,這是我們進(jìn)行零開發(fā)時考慮的現(xiàn)有資源問題,先撇開成本問題,IP方式的開發(fā)對項目周期非常有益的,這也是在FPGA應(yīng)用領(lǐng)域章節(jié)陳列相關(guān)FPGA廠家IP資源的原因。
? FPGA廠家和IP廠商可以在FPGA開發(fā)的不同時期提供給我們的IP。我們暫且知道他們分別是未加密的RTL級IP、加密的RTL級IP、未經(jīng)布局布線的網(wǎng)表級IP、布局布線后的網(wǎng)表級IP。他們的含義在后面陸續(xù)介紹FPGA的開發(fā)步驟的時候,相信大家能夠恍然大悟。需要說明的是,越是FPGA靠前端步驟的時候提供的IP,他的二次開發(fā)性就越好,但是它的性能可能是個反的過程,同時也越貴,畢竟任何一個提供者也不想將自己的源碼程序提供給他者,但是為了不讓客戶走向其他商家,只能提高價賣了,同時加上一些法律上的協(xié)議保護(hù)。那么越朝FPGA開發(fā)步驟的后端,情況就相反了,越是后端,IP核就會進(jìn)一步做優(yōu)化,性能就越好,但是一些客戶不要的功能就不好去了。 ?
FPGA廠商提供一般常用的IP核,畢竟為了讓大家用他們家的芯片,但是一些特殊需要的IP核還是需要付費的。當(dāng)然這里需要說明的是FPGA廠商的IP是很少可以交叉用的,這一點很容易想,對廠家來講不會做這種給競爭者提供服務(wù)事情的。IP廠商一般會高價的提供未加密的RTL級源碼,有時FPGA廠商為了擴(kuò)大芯片市場占有率,會購買第三方的IP做進(jìn)一步的處理后免費提給該FPGA芯片使用者的。
? 2. 輸入方式使用探討
? 在上面我們介紹了三種輸入方式,有些地方會講到第四種輸入方式,就是門級網(wǎng)表文件輸入的形式,我們這里并沒有把它歸為一種輸入方式,原因在于,本身這些門級網(wǎng)表文件的產(chǎn)生還是源于介紹的三種輸入方式中的一種或是幾種混合的方式。所以這里沒有把它歸為一類。 ? 好了,在上面三種輸入方式介紹的基礎(chǔ)上,我們來探討一下這令人眼花繚亂的輸入方式,探討的目的就是為了讓我們更好的使用他們。 ?
首先,來總結(jié)一下三者的優(yōu)缺點,其實是兩種,因為IP核不管是哪個層次,或者在原理圖中被以符號的形式被例化,或者在HDL中被模塊例化。所以這里集中探討的是原理圖和HDL的優(yōu)缺點。原理圖的優(yōu)點就是結(jié)構(gòu)直觀性,HDL的優(yōu)點是嚴(yán)密性、支持甚寬的抽象描述層次、易于移植、方便仿真調(diào)試等等,缺點就是不具備對方的優(yōu)點。當(dāng)時出現(xiàn)HDL的時候,人們確實是想著原理圖該退出歷史舞臺了,但是到現(xiàn)在它還依然存在著。存在即是有道理的,存在就得用它,但是又得使用HDL,于是存在一種混合編程的形式。除了頂層模塊用原理圖之外,其他的內(nèi)部子模塊全部使用HDL來描述,HDL描述的模塊可以通過工具轉(zhuǎn)換成符號,然后在頂層模塊中引用這些符號,這就完成混合編程。 ?
在接觸的很多FPGA的初學(xué)者很容易被原理圖的輸入方式給迷惑,甚至愛的深沉,加上本身其他輸入方式的繁瑣的輸入的厭惡,更是愛的無法自拔。當(dāng)開始強(qiáng)制性要求開始時養(yǎng)成多用HDL輸入的習(xí)慣的時候,有些甚至有著痛心疾首般的痛苦,但是隨著學(xué)習(xí)的深入,做的東西越來越大,嘗到HDL輸入方式帶來的甜頭的時候,就會覺得那個苦沒有白吃。
? 我覺得原理圖輸入方式從現(xiàn)在的一些線索看來,在今后的某一天將會服役終結(jié)。首先是找到了原理圖自身帶有優(yōu)勢的替代品,那就是主流FPGA集成環(huán)境中的綜合器和第三方綜合器都具有RTL視圖生成功能,這個視圖完全展示了項目的結(jié)構(gòu)組成,可以上下分層,最大的好處就是可以檢查核實寫的RTL級代碼的綜合后電路情況。還有一條線索是,大家用的仿真軟件Modelsim并沒有提供原理圖輸入的支持,是原理圖的設(shè)計必須在集成環(huán)境成轉(zhuǎn)換成RTL級代碼或是綜合成網(wǎng)表形式來做仿真,也是一件繁瑣的事。原理圖的離開只是時間問題。 ? 至于目前HDL選擇哪一種比較好,這個問題放到開始將HDL基礎(chǔ)語法知識的地方進(jìn)行探討。這里要說明的是,并不是我們這里講Verilog使用就否定其他的HDL語言。各種HDL的爭端從未停止過,現(xiàn)在還是依然存在四種開發(fā)人,第一種是使用Verilog/System Verilog的人,第二種是使用VHDL的人,第三種就是使用System C的人,第四種是混合型的人,到底哪種好,也有也許是時間問題吧,時間證明一切。 ?
2
綜合
不管你是采用單一的輸入方式,還是采用的是混合編程(這種在很多跨公司合作項目中會碰見,也許A公司用的是VHDL,B公司用的是Verilog,那這個項目中很大可能采用混合型),我們統(tǒng)稱得到設(shè)計輸入后,都得把設(shè)計輸入得到一個可以和FPGA硬件資源相匹配的一個描述。假設(shè)FPGA是基于LUT結(jié)構(gòu)的,那么我們就得到一個基于LUT結(jié)構(gòu)門級網(wǎng)表。在這個過程中,又可以分為如圖兩個步驟。 ?
需要說明的是在Altera的開發(fā)流程中,將編譯、映射過程按照我們敘述的合稱綜合,而在Xilinx開發(fā)流程中,由設(shè)計輸入得到門級網(wǎng)表的過程叫做綜合,而映射過程歸結(jié)到其叫做實現(xiàn)的某一子步驟中。但是整體的流程還是遵循這個順序的,只是叫法一些外表性的不一樣而已。 ?
1.編譯
? 原理圖、HDL、IP核這些都將通過編譯后生成門級的網(wǎng)表,這里生成門級網(wǎng)表的過程其實是早起ASIC的步驟,直接生成門電路網(wǎng)表。這個時候的網(wǎng)表文件和具體的器件無關(guān),也就是說,生成的門電路網(wǎng)表也是一種平臺移植的媒質(zhì)。 ?
2.映射
我們通過編譯得到一張門級網(wǎng)表之后,與早先ASIC開發(fā)流程中在這個門級網(wǎng)表布線后去做掩膜不同,接下來就得考慮如何與我們選擇的硬件平臺結(jié)合起來,畢竟我們使用的硬件平臺是由一個一個的LUT(假設(shè)這類FPGA)組成的。那么這個結(jié)合的過程就是映射過程。 ? 這個過程其實很復(fù)雜,首先需要把形成的網(wǎng)表邏輯門給規(guī)劃成一些小的組合,然后再去映射到LUT中,這個過程中規(guī)劃按照一定的算法和章程進(jìn)行。不同的算法和章程就會得到不同的映射,不同的映射就會為后面的過程提供不同的選擇,最終生成性能不一樣的電路了。 ? 我們把講基于SRAM技術(shù)的FPGA的二選一多路器拿出來舉個例子,如圖6,可以按照紅色線將二選一多路器完全劈成兩邊,原來的一個表就可以規(guī)劃到其他兩個表或表內(nèi)容中,因為被劈成的兩部分可單獨成表,也可以被規(guī)劃到其他電路形成的表里。 ?
映射的工程比較復(fù)雜,運算量也很大,也是為什么FPGA開發(fā)過程中,一直存在的一個問題,形成最終的可配置二進(jìn)制文件的時間非常長,特別是一些大一點的項目,時間消耗比較長的一個點就是映射了,至于具體的映射算法就超出了書的范圍了。再強(qiáng)調(diào)的是,映射是和器件有關(guān)的,即使是同一個系列,不同型號的FPGA內(nèi)部就夠也是有區(qū)別的,好比從外觀看都是一個單元樓內(nèi)的單元房,但是每個單元房內(nèi)裝修、家具擺設(shè)等都是不一樣的。 ?
3
布局布線
1.布局 ? 講到這一塊,正好有這么一個例子來講解這個概念。近來報道朝鮮希望在俄羅斯遠(yuǎn)東地區(qū)租用數(shù)十萬公頃的土地用來培育農(nóng)產(chǎn)品。咱先撇開今后的購買的成功與否,假設(shè)成功了,并且有了這個詳細(xì)的希望培育的農(nóng)作物的品種及數(shù)量,有各式各樣的蔬菜、主糧、禽類畜養(yǎng)場、果樹等等。我們前面做的那些流程得到的LUT門級網(wǎng)表就好比這樣的清單。 ? 得到這樣的清單之后,我們再假設(shè)在這十萬公頃的土地上,陽光、水資源、溫差都有一定的分布。大家知道農(nóng)作物的的成長和高量產(chǎn)或者與陽關(guān)有關(guān),或者與水資源有關(guān),或者與溫差有關(guān),并且禽類的畜養(yǎng)材料與農(nóng)作物的副產(chǎn)有關(guān)。所以接下來要做的事情就是根據(jù)現(xiàn)有的自然條件和農(nóng)產(chǎn)品的所需環(huán)境特點合理布局,哪些地適合做什么。
? 緊接著我們回到FPGA開發(fā)中來,我們通過前面的步驟得到的清單就是LUT門級網(wǎng)表。網(wǎng)表里提供的僅僅是從邏輯關(guān)系上一些LUT結(jié)構(gòu)的連接。我們需要將這些LUT結(jié)構(gòu)配置到FPGA具體的哪個位置。需要說明的是,F(xiàn)PGA里任何硬件結(jié)構(gòu)都是按照橫縱坐標(biāo)進(jìn)行標(biāo)定的,圖中選中的是一個SLICE,SLICE里面存放著表和其他結(jié)構(gòu),它的位置在X50Y112上。不同的資源的坐標(biāo)不一樣,但是坐標(biāo)的零點是公用的。 ?
在FPGA里布局需要考慮的問題是,如何將這些已有的邏輯上連接的LUT及其它元素合理的放到現(xiàn)有的FPGA里,達(dá)到功能要求的時候保證質(zhì)量。具體點就比如,乘法器這樣的電路適合放在RAM附近,當(dāng)然,硬件乘法器的硬件布局一般也是在存儲器附近,有利于縮短乘法的延時時間,什么樣的電路需要配置高速等等。 ? 十萬公頃的地布局規(guī)劃好了,農(nóng)產(chǎn)品就會有很好的豐收,同樣FPGA開發(fā)布局布好了,由FPGA搭建起來的電路就會更加穩(wěn)定和擴(kuò)展性。 ? 2.布線 ? 上小節(jié)中,我們把十萬公頃的地給安排好了,哪些地該種什么。具體實施之前還有一些是必須做的,比如農(nóng)作物的澆灌,沒有一個很好的灌溉系統(tǒng)是一個問題;再比如豐收了得采摘吧,這個時候,能夠讓大卡車到達(dá)每一塊農(nóng)地的公路樞紐也是需要解決的問題。將每一塊或者相關(guān)的田地連接的灌水系統(tǒng)和公路的建設(shè),就好比我們這個布線的過程。 ? 我們在FPGA內(nèi)通過布局,知道那些LUT具體分布到哪個SLICE,但是一方面如何讓這些SLICE連接起來,二方面如何讓輸入的信號到達(dá)相應(yīng)的開始處理點和如何讓輸出到達(dá)輸出IO上,并且連接的電路整體性能好,這就是布線這個環(huán)節(jié)需要完成的內(nèi)容。要達(dá)到布線最優(yōu)話,當(dāng)然這里面設(shè)計到布線算法和很多細(xì)節(jié)問題,比如涉及到布線資源、PLL資源分布。但是這些對我們理解布線這個概念沒有很多益處,暫且不深入,本質(zhì)上就是一個線路求最優(yōu)的問題。 ?
4
約束
約束,在圖1上看到,在綜合和布局布線這兩個流程環(huán)節(jié)里都出現(xiàn)了,我們暫且規(guī)定其為約束一和約束二,或者說綜合約束和布局布線約束,布局布線約束又可以分為位置約束、時序約束。約束,就是對這些環(huán)節(jié)操作定制規(guī)則。一般開發(fā)環(huán)境會對這些約束有個默認(rèn),這些默認(rèn)的設(shè)置對大部分情況下還是適用的,但是通常布局布線約束中的I/O約束是我們每一個工程都必須給定的。同時開發(fā)工具開放其他約束接口,允許我們設(shè)置這些規(guī)則,具體的有哪些約束怎么去做在后面介紹工具使用的時候進(jìn)行討論,這里先明白這些約束的基本概念。 ?
綜合約束
? 相信大家已經(jīng)下意識的將綜合約束和綜合過程掛在一起了,沒錯,綜合約束確實是在綜合過程中做的,用來指導(dǎo)綜合過程,包括編譯和映射。我們已經(jīng)知道綜合過程是將RTL級電路描述轉(zhuǎn)換到FPGA上的硬件單元(LUT)中,形成以FPGA存在的硬件單元構(gòu)成的電路。 ? 我們還是拿前面有過的例子來說明,不同的約束將導(dǎo)致生成性能不同的電路。綜合這么一個完成式***能的電路,沒有加資源共享得到的電路如圖8左邊所示的電路,而加了資源共享的約束后,得到的電路結(jié)構(gòu)如圖8右邊的電路。 ?
通過之前的分析,得到左邊的電路結(jié)構(gòu)資源消耗多但是速度快,而右邊的結(jié)構(gòu)消耗資源少,但是速度慢,乘法器需要分時復(fù)用。 ? 當(dāng)然這只是一個例子,但是足以說明,不同的綜合指導(dǎo)原則也就是綜合約束,將會產(chǎn)生不同的電路。當(dāng)?shù)玫降碾娐沸阅懿荒軡M足需求的時候,適當(dāng)考慮綜合約束,來達(dá)到一個速度和面積的轉(zhuǎn)換的效果,實現(xiàn)性能的提升。電路實現(xiàn)的速度和消耗的面積是貫穿在FPGA開發(fā)過程中兩個 矛盾的問題,綜合約束是其中一種小范圍內(nèi)實現(xiàn)速度和面見平衡點移動的方式。
? 位置約束
? 沒錯,你又想對了,位置約束和我們布局有關(guān)系,它就是指布局的策略。根據(jù)所選擇的FPGA平臺現(xiàn)有硬件資源分布來決定我們布局。 ? 其中最典型的位置約束就是I/O約束。一個典型的系統(tǒng)是既有輸入也有輸出的,而不管是輸入還是輸出,都是從I/O上為端點的。輸入從哪個端點進(jìn)來,輸出從哪個端點出去,輸入是需要支持什么樣的電氣特性的端點,輸出又是需要支持什么樣的電氣特定的端點。這些都是I/O約束做的事情。任何一個工程,都必須有這么一個約束。 ? 還有一種典型的位置約束是在增量編譯里涉及的物理界定。增量編譯的出現(xiàn)就是因為在FPGA開發(fā)過程中綜合和布局布線的長耗時性而提出的。思想就是把FPGA切成很多個小塊的FPGA,然后約定具體哪塊小FPGA放置什么模塊,實現(xiàn)什么樣的功能,從物理上進(jìn)行界定。當(dāng)修改工程后,開發(fā)平臺就會檢測哪些小FPGA內(nèi)沒有進(jìn)行修改,哪些進(jìn)行了修改,然后將修改過的部分重新進(jìn)行綜合布局布線步驟。這樣一來,相比原來修改一點,全工程重新經(jīng)過那些過程來講,時間節(jié)省下來了。 ?
時序約束
? 估計沒有多少懸念了,時序約束很大程度上和布線有關(guān)。為什么要做這個約束? ? 由于一方面信號在芯片內(nèi)傳遞是需要消耗時間的,另一方面大量存在的寄存器有反應(yīng)時間,而我們開發(fā)的最開始的時候這些時間都是理想化的。但是考慮到真實情況下,如果跑的速度比較高,達(dá)到了200M這么個速度,當(dāng)然這個高速和具體的芯片有關(guān),高性能的芯片本身跑的速度可以達(dá)到很高,200M相對來說就不是高速,對一些低性能芯片還可能達(dá)不到200M。這個時候,這些時間達(dá)到了同樣一個系統(tǒng)時間數(shù)量級的時候,很可能影響電路的性能了。某一刻,該來的信號沒有來,默認(rèn)的話就會采集錯誤信號了。 ? 為了讓這些硬件本身帶來的延時時間更理想化,我們就要對這些決定時間延時的因素優(yōu)化來減少時間延時。對于寄存器本身的反應(yīng)時間這個因素我們開發(fā)者是無能為力的,我們要做的優(yōu)化就是布線了。是走直線還是走其他,不僅僅決定于自身這條路徑,還和整個系統(tǒng)布線有關(guān),好比水桶原理,系統(tǒng)性能決定于最差路徑延時。 ? 時序約束做的就是這些事情,但是時序約束并不是指具體去連接每一條線,這個工作就像前面那些流程一樣都是由軟件去實現(xiàn)的,先用軟件自己默認(rèn)原則布線,然后對其結(jié)果分析,不滿足時序要求的,我們再對具體的問題路徑做一些指導(dǎo)約束。時序約束的添加,主要包括周期約束、輸入偏移約束和輸出偏移約束。具體的過程在后面章節(jié)介紹工具使用時會有具體動手的指導(dǎo)。 ?
5
FPGA開發(fā)仿真
在經(jīng)過上面從設(shè)計輸入到綜合再到布局布線過程的介紹后,我們來集中探討一下,在這些過程中涉及到的相應(yīng)的仿真。 ? 仿真,字面上講就是模擬真實狀況。我們FPGA設(shè)計里面的仿真,就是模擬真實電路的狀況,查看電路是不是我們需要的電路。如果我們把FPGA開發(fā)形成電路當(dāng)作一個產(chǎn)品的生產(chǎn)過程,那么在FPGA開發(fā)流程中含有的三種仿真(RTL級仿真、靜態(tài)仿真和時序仿真)就好比產(chǎn)品線中的三道檢測站。如圖9,這三道工序任何一道出了問題,修改設(shè)計后都得重新走這三道卡,所以盡量在把問題發(fā)現(xiàn)在源頭。 ?
1.測試平臺
所謂testbench,即測試平臺,詳細(xì)的說就是給待驗證的設(shè)計添加激勵,同時觀察輸出響應(yīng)是否符合設(shè)計要求。測試平臺,測試平臺在做功能仿真、靜態(tài)仿真和時序仿真的時候都需要用到。剛開始的對于一些初學(xué)者,遇到的都是一些簡單的東西,測試平臺相應(yīng)的也很簡單,用一個文件就可以很清晰的呈現(xiàn)測試結(jié)構(gòu)。對于一些復(fù)雜的項目,測試就沒有那么簡單了,由此還專門產(chǎn)生一個行業(yè)——測試行業(yè)。這個時候我們要用到一個概念就是結(jié)構(gòu)化測試。 ? 一個完整的測試平臺如下圖10所示,它是分結(jié)構(gòu)組成的,其中對設(shè)計測試結(jié)果的判斷不僅可以通過觀察對比波形得到,而且可以靈活使用腳本命令將有用的輸出信息打印到終端或者產(chǎn)生文本進(jìn)行觀察,也可以寫一段代碼讓它們自動比較輸出結(jié)果。 ?
測試平臺的設(shè)計是多種多樣,可以使用靈活的Verilog的驗證腳本,但是它也是基于硬件語言但是又服務(wù)于軟件測試的語言,有時并行有時順序,只有掌握這些關(guān)鍵點,才能很好服務(wù)測試。需要說明的一點是,不管大家是已經(jīng)在用Verilog在寫測試平臺還是剛學(xué)習(xí)寫測試平臺,那么建議大家還是能用到System Verilog中相對Verilog新的語法還是嘗試的用,System Verilog是一種趨勢,它本身就是向下兼容的第三代的Verilog。 ?
2.RTL級仿真
? 這里RTL級仿真屬于第一道檢測,有些場合稱作功能仿真,為了突出和后面的靜態(tài)仿真的區(qū)別,以免在后面介紹靜態(tài)仿真的時候大家弄的很頭大,我們還是這樣稱呼。它是對工程在寄存器轉(zhuǎn)送級進(jìn)行的描述時進(jìn)行測試,查看其在RTL級描述的時候?qū)崿F(xiàn)的功能的正確性。 ? 關(guān)于RTL級仿真,如果設(shè)計中設(shè)計到原理圖輸入的話,在一些仿真工具中是不支持的,比如Modelsim,這個時候要進(jìn)行功能上的驗證,可以將原理圖轉(zhuǎn)換成HDL描述,或者直接把整個工程轉(zhuǎn)換成LUT門級網(wǎng)表后進(jìn)行后面要講到的靜態(tài)仿真完成。 ? 所有邏輯功能的驗證都希望在RTL級做,盡可能的將問題發(fā)現(xiàn)在RTL級仿真過程中,減少后面發(fā)現(xiàn)問題帶來的反復(fù)。
? 3.靜態(tài)仿真
? 靜態(tài)仿真,有些地方給的外號叫門級仿真,確切的說應(yīng)該是綜合后的LUT門級網(wǎng)表。是在綜合過程后做的仿真。有些開發(fā)平臺下將靜態(tài)仿真具體又分為編譯仿真和映射仿真,比如ISE就是這樣做的,但是個人覺得應(yīng)該很少場合做這個編譯仿真。靜態(tài)仿真的目的就是驗證當(dāng)工程到了用LUT門級網(wǎng)表描述的時候,從功能上檢查驗證工程的正確性。 ? 不管是Altera還是Xilinx的開發(fā)平臺,都直接支持靜態(tài)仿真,但是由于各自廠家的仿真器專業(yè)性不強(qiáng),我們還是用第三方仿真工具比較多。這時候在第三方工具下的輸入必須是經(jīng)過綜合工具綜合出來的涵蓋工程所有信息的LUT門級網(wǎng)表文件了。一般專業(yè)一點的第三方綜合工具是不具備綜合功能的,至少我們在使用Modelsim的時候,并沒有要求我們添加工程用到的具體的哪一款型號FPGA的信息。這也是靜態(tài)仿真的外號門級仿真指的是LUT門級網(wǎng)表仿真的依據(jù)。
? 4.時序仿真
時序仿真是在布局布線之后做的,在前面介紹時序約束的時候講到,布線延時問題影響到了電路的性能的時候可以做時序約束。那么這個延時問題的獲得就可以通過時序仿真獲得,當(dāng)然還有一種獲得延時出現(xiàn)超載情況,這個屬于下面小節(jié)介紹的靜態(tài)時序分析了。 ? 一般情況下,電路進(jìn)行完布線過程后,會生成一個延時信息文件,我們簡稱SDF(standrad dealy format)文件,Quartus平臺下是以.sdo文件形式存在的。里面含有三種延時信息,分別為最小值、典型值、最大值,存在的形式是最小值:典型值:最大值,一般縮寫minmax。這里也體現(xiàn)了,在FPGA里的延時信息是不能夠精確獲得的,只能是逼近,因為本身同一器件中,不同的區(qū)域的邏輯門也很有可能和其他的區(qū)域內(nèi)同種的邏輯門的延時不一樣。我們這里舉一個例子來說明一下這三種值的含義。 ?
如上圖,這是一個描述一段延時線的延時信息,給的延時信息從in端點到out端點,輸入發(fā)生跳變后,分別以最小值、典型值和最大值將信號跳變傳遞到out端點。我們這里只是一段延時線,在延時信息文件里還有一類延時信息,就是一些具有邏輯功能的cell延時,這個時候信號跳變又分為由高變低和有低變高,因為這兩種跳變在這些器件里的三種延時值是不一樣的,得分別探討,具體分別以某一種情況類推。 ? 在做后仿真的時候,只需要在做完靜態(tài)仿真后的基礎(chǔ)上添加布線的延時信息后,再分析邏輯功能是否滿足要求。后方針的平臺 使用情況和前面一樣,一般采用第三方仿真工具,典型的是Modlesim,具體操作過程見軟件相關(guān)操作章節(jié)。 ?
6
靜態(tài)時序分析
靜態(tài)時序分析,簡稱STA(Static Timing Analysis),這個過程做的話一把是在是做后仿真前做的。在布局布線后,會生成時序分析報告,該報告是分析工具利用從布線的路勁上提取出寄生參數(shù)后精確計算出來的。該報告中會提示出一些關(guān)鍵路徑,所謂關(guān)鍵路勁就是指延時信息比較突出的信號節(jié)點流,通過分析可以得到不滿足時序要求的路徑,這個過程就是STA過程。 ? 靜態(tài)時序分析的特點就是不需要輸入向量就能窮盡所有的路徑,且運行速度很快、占用內(nèi)存較少,不僅可以對芯片設(shè)計進(jìn)行全面的時序功能檢查,而且還可利用時序分析的結(jié)果來優(yōu)化設(shè)計。很多設(shè)計都可以在功能驗證的成功的基礎(chǔ)上,加上一個很好的靜態(tài)時序分析,就可以替代耗時非常長的后仿真了,這是一種很有保障性的化簡流程方式。后仿真相對靜態(tài)時序分析來說還具有邏輯驗證,在加上延時信息的基礎(chǔ)上分析邏輯。 ?
7
在線調(diào)試
在線調(diào)試也稱作板級調(diào)試,它是將工程下載到FPGA芯片上后分析代碼運行的情況。有人會以為,我們不是已經(jīng)做了仿真了,甚至是時序仿真都通過了,還會存在問題么?在實際中,存在這么些情況我們需要用到在線調(diào)試: ?
仿真不全面而沒有發(fā)現(xiàn)的FPGA設(shè)計錯誤。很多情況下,由于太復(fù)雜,無法做到100%的代碼覆蓋率; ? 在板級交互中,存在異步事件,很難做仿真,或者仿真起來時間很長,無法運行; ? 除了本身FPGA外,還可能存在板上互連可靠性問題、電源問題和IC之間的信號干擾問題,都可能導(dǎo)致系統(tǒng)運行出錯; ? 其他潛在問題。 ? 在線調(diào)試的方式主要有兩種,一種是利用外部測試設(shè)備,把內(nèi)部信號傳送到FPGA針腳上,然后用示波器或者邏輯分析儀觀察信號;另一種就是利用嵌入式邏輯分析儀,在設(shè)計中插入邏輯分析儀,利用JTAG邊緣數(shù)據(jù)掃描和開發(fā)工具完成數(shù)據(jù)交互。 ?
嵌入式邏輯分析儀的原理相當(dāng)與在FPGA中開辟一個環(huán)形存儲器,存儲器的大小決定了能夠查看的數(shù)據(jù)的深度,是可以人為設(shè)定的,但是不得超出資源。在FPGA內(nèi)部,根據(jù)設(shè)置的需要查看的信號節(jié)點信息和驅(qū)動的采樣時鐘,對信息進(jìn)行采樣,并放置到設(shè)定的存儲空間里,存儲空間是環(huán)形的,內(nèi)容隨時間更新。然后通過判斷觸發(fā)點來檢查采集數(shù)據(jù),一旦滿足觸發(fā)條件,這個時候會停止掃描,然后將觸發(fā)點前后的一些數(shù)據(jù)返回給PC端的測試工具進(jìn)行波形顯示,供開發(fā)者進(jìn)行調(diào)試。 ? 目前的調(diào)試工具都是和本身的FPGA開發(fā)平臺掛鉤的,不同F(xiàn)PGA廠商都會有開發(fā)軟件平臺,嵌入式邏輯分析儀也就不同。Altera 廠家提供的是SignalTapII,而 Xilinx廠家提供的是 ChipScope,這些工具的具體使用在后面工具中詳解。 ? 當(dāng)然這里除了嵌入式邏輯分析儀外,各廠家還提供了一些其他的在線調(diào)試工具,例如SignalProbe等等,但是或多或少的用的人不是很多,有興趣的可以找到該功能使用的說明手冊。 ?
8
配置及固化
好了,到了我們最后一個環(huán)節(jié)就可以完成FPGA的流程了。這一部分我們分四個小節(jié)來講,首先是針對大家很多人不是太清楚的FPGA配置過程安排的,隨后一節(jié)為了更加深理解,舉了altera 的FPGA敘述配置全過程,第三小節(jié)是探討FPGA主要的配置模式,最后一節(jié)就是正對這些配置模式展開的對比選擇探討。 ?
1.FPGA配置過程
? 在FPGA正常工作時,配置數(shù)據(jù)存儲在SRAM中,這個SRAM單元也被稱為配置存儲器(configure RAM)。由于SRAM是易失性存儲器,因此在FPGA上電之后,外部電路需要將配置數(shù)據(jù)重新載入到芯片內(nèi)的配置RAM中。在芯片配置完成之后,內(nèi)部的寄存器以及I/O管腳必須進(jìn)行初始化(initialization),等到初始化完成以后,芯片才會按照用戶設(shè)計的功能正常工作,即進(jìn)入用戶模式。 ? FPGA上電以后首先進(jìn)入配置模式(configuration),在最后一個配置數(shù)據(jù)載入到FPGA以后,進(jìn)入初始化模式(initialization),在初始化完成后進(jìn)入用戶模式(user-mode)。在配置模式和初始化模式下,F(xiàn)PGA的用戶I/O處于高阻態(tài)(或內(nèi)部弱上拉狀態(tài)),當(dāng)進(jìn)入用戶模式下,用戶I/O就按照用戶設(shè)計的功能工作。
? 2.舉例——altera FPGA配置全過程
一個器件完整的配置過程將經(jīng)歷復(fù)位、配置和初始化等3個過程。FPGA正常上電后,當(dāng)其nCONFIG管腳被拉低時,器件處于復(fù)位狀態(tài),這時所有的配置RAM內(nèi)容被清空,并且所有I/O處于高阻態(tài),F(xiàn)PGA的狀態(tài)管腳nSTATUS和CONFIG_DONE管腳也將輸出為低。當(dāng)FPGA的nCONFIG管腳上出現(xiàn)一個從低到高的跳變以后,配置就開始了,同時芯片還會去采樣配置模式(MSEL)管腳的信號狀態(tài),決定接受何種配置模式。隨之,芯片將釋放漏極開路(open-drain)輸出的nSTATUS管腳,使其由片外的上拉電阻拉高,這樣,就表示FPGA可以接收配置數(shù)據(jù)了。在配置之前和配置過程中,F(xiàn)PGA的用戶I/O均處于高阻態(tài)。 ?
在接收配置數(shù)據(jù)的過程中,配置數(shù)據(jù)由DATA管腳送入,而配置時鐘信號由DCLK管腳送入,配置數(shù)據(jù)在DCLK的上升沿被鎖存到FPGA中,當(dāng)配置數(shù)據(jù)被全部載入到FPGA中以后,F(xiàn)PGA上的CONF_DONE信號就會被釋放,而漏極開路輸出的CONF_DONE信號同樣將由外部的上拉電阻拉高。因此,CONF_DONE管腳的從低到高的跳變意味著配置的完成,初始化過程的開始,而并不是芯片開始正常工作。
? INIT_DONE是初始化完成的指示信號,它是FPGA中可選的信號,需要通過Quartus II工具中的設(shè)置決定是否使用該管腳。在初始化過程中,內(nèi)部邏輯、內(nèi)部寄存器和I/O寄存器將被初始化,I/O驅(qū)動器將被使能。當(dāng)初始化完成以后,器件上漏極開始輸出的INIT_DONE管腳被釋放,同時被外部的上拉電阻拉高。這時,F(xiàn)PGA完全進(jìn)入用戶模式,所有的內(nèi)部邏輯以及I/O都按照用戶的設(shè)計運行,這時,那些FPGA配置過程中的I/O弱上拉將不復(fù)存在。不過,還有一些器件在用戶模式下I/O也有可編程的弱上拉電阻。在完成配置以后,DCLK信號和DATA管腳不應(yīng)該被浮空(floating),而應(yīng)該被拉成固定電平,高或低都可以。 ? 如果需要重新配置FPGA,就需要在外部將nCONFIG重新拉低一段時間,然后再拉高。當(dāng)nCONFIG被拉低吼,nSTATUS和CONF_DONE也將隨即被FPGA芯片拉低,配置RAM被清,所有I/O都變成三態(tài)。當(dāng)nCONFIG和nSTATUS都變?yōu)楦邥r,重新配置就開始了。 ?
3.配置模式
? 這一塊分成兩部分,一部分是在線調(diào)試配置,另一塊是固化,即將工程配置到相應(yīng)存儲單元中,上電后,通過存儲在存儲器中的內(nèi)容配置FPGA。 ? 在線配置 ? 第一部分在線調(diào)試配置過程是通過JTAG模式完成的,如圖13所示,在JTAG模式中,PC和FPGA通信的時鐘為JTAG接口的TCLK,數(shù)據(jù)直接從TDI進(jìn)入FPGA,完成相應(yīng)功能的配置。 ?
JTAG接口是一個業(yè)界標(biāo)準(zhǔn)接口,主要用于芯片測試等功能。FPGA基本上都可以支持JTAG命令來配置FPGA的方式,而且JTAG配置方式比其他任何方式優(yōu)先級都高。JTAG接口有4個必需的信號TDI, TDO, TMS和TCK以及1個可選信號TRST構(gòu)成,其中: ? TDI,用于測試數(shù)據(jù)的輸入; TDO,用于測試數(shù)據(jù)的輸出; TMS,模式控制管腳,決定JTAG電路內(nèi)部的TAP狀態(tài)機(jī)的跳變; TCK,測試時鐘,其他信號線都必須與之同步; TRST,可選,如果JTAG電路不用,可以講其連到GND。
? 固化
? 第二部分固化程序到存儲器中的過程可以分為兩種方式,主模式和從模式。主模式下FPGA器件引導(dǎo)配置操作過程,它控制著外部存儲器和初始化過程;從模式下則由外部計算機(jī)或控制器控制配置過程。主、從模式從傳輸數(shù)據(jù)寬度上,又分別可以分為串行和并行。 ?
(1)主串模式
? 主串模式是最簡單的固化模式,如圖14所示,這個模式過程不需要為外部存儲器提供一系列地址。它利用簡單的脈沖信號來表明數(shù)據(jù)讀取的開始,接著由FPGA提供給存儲器時鐘,存儲器在時鐘驅(qū)動下,將數(shù)據(jù)輸入到FPGA Cdata_in端口。 ?
(2)主并模式
? 主并模式其實和主串模式的一樣機(jī)理,只不過是在主串的基礎(chǔ)上,同周期數(shù)內(nèi)傳送的數(shù)據(jù)變成8位,或者更高,如圖15。這樣一來,主并行相比主串行的數(shù)度要優(yōu)先了?,F(xiàn)代有些地方已采用這種方式來配置FPGA的了。 ?
(3)從并模式
? 從上面看到,主模式下的連接還是很簡單的。但是有時候,系統(tǒng)可能用其他微處理器來對FPGA進(jìn)行配置。這里的微處理器可以指FPGA內(nèi)嵌的處理器,比如說Nios。微處理器控制著何時配置FPGA,從哪讀取配置文件。如圖16,這種方式的優(yōu)點是處理器可以靈活隨時變更FPGA配置,同時配置的速度也快。微處理器先從外部存儲設(shè)備里讀取一個字節(jié)的數(shù),然后寫到FPGA里。 ?
(4)從串模式
理解了從并模式,從串模式就不用很多解釋了,它的特點就是節(jié)約FPGA管腳I/O。 ?
(5)多片級聯(lián)
多片模式有兩種,一種是采用菊花鏈的思想,多片F(xiàn)PGA共享一個存儲器,另外一個是可以使用其他存儲器配置不同的FPGA。如果所示是一個共享型的結(jié)構(gòu),顯示啟動了。這里分主FPGA和從FPGA,主FPGA和存儲器是使用串行主模式來配置,而后面那個的配置是通過第一配置好的FPGA上微處理器進(jìn)行協(xié)調(diào)的。 ?
4.模式選擇
FPGA應(yīng)該可以支持上面五種配置模式,是通過3個模式引腳來實現(xiàn)的,具體的映射如下表,在今后模式還是有可能增加的。 ?
在PS模式下,如果你用電纜線配置板上的FPGA芯片,而這個FPGA芯片已經(jīng)有配置芯片在板上,那你就必須隔離纜線與配置芯片的信號。一般平時調(diào)試時不會把配置芯片焊上的,這時候用纜線下載程序。只有在調(diào)試完成以后,才把程序燒在配置芯片中, 然后將芯片焊上.或者配置芯片就是可以方便取下焊上的那種。這樣出了問題還可以方便地調(diào)試。 ? 對FPGA芯片的配置中,可以采用AS模式的方法,如果采用EPCS的芯片,通過一條下載線進(jìn)行燒寫的話,那么開始的"nCONFIG,nSTATUS"應(yīng)該上拉,要是考慮多種配置模式,可以采用跳線設(shè)計。讓配置方式在跳線中切換,上拉電阻的阻值可以采用10K一般在做FPGA實驗板的時候,用AS+JTAG方式,這樣可以用JTAG方式調(diào)試,而最后程序已經(jīng)調(diào)試無誤了后,再用AS模式把程序燒到配置芯片里去。 ?
9
開發(fā)工具總結(jié)
在圍繞圖1把FPGA開發(fā)流程講完后,這里對每個環(huán)節(jié)中設(shè)計的相關(guān)軟件進(jìn)行總結(jié),如下表所示。畢竟充分利用各種工具的特點,進(jìn)行多種EDA工具的協(xié)同設(shè)計,對FPGA的開發(fā)是非常重要的。充分利用了這些EDA工具的優(yōu)點,能夠提高開發(fā)效率和系統(tǒng)性能。 ?
表中列出的每種EDA工具都有自己的特點。一般由FPGA廠商提供的集成開發(fā)環(huán)境,如Altera Quartus II和Xilinx ISE,在邏輯綜合和設(shè)計仿真環(huán)節(jié)都不是非常優(yōu)秀,因此一般都會提供第三方EDA工具的接口,讓用戶更方便地利用其他EDA工具。為了提高設(shè)計效率,優(yōu)化設(shè)計結(jié)果,很多廠家提供了各種專業(yè)軟件,用以配合FPGA芯片廠家提供的工具進(jìn)行更高效的設(shè)計。 ? 比較常見的使用方式是:FPGA廠商提供的集成開發(fā)環(huán)境、專業(yè)邏輯仿真軟件、專業(yè)邏輯綜合軟件一起使用,進(jìn)行多種EDA工具的協(xié)同設(shè)計。比如Quartus II+ModelSim+FPGA Compiler II,ISE+ModelSim+Synplify Pro等等。
編輯:黃飛
?
評論
查看更多