FPGA設(shè)計(jì)太復(fù)雜?四大設(shè)計(jì)要點(diǎn)總結(jié)助你快速上手!
1
FPGA簡(jiǎn)單介紹
FPGA的用處比我們平時(shí)想象的用處更廣泛,原因在于其中集成的模塊種類更多,而不僅僅是原來(lái)的簡(jiǎn)單邏輯單元(LE)。
現(xiàn)在的FPGA不僅包含以前的LE,RAM也更大更快更靈活,管教IOB也更加的復(fù)雜,支持的IO類型也更多,而且內(nèi)部還集成了一些特殊功能單元,包括以下部分:
DSP:實(shí)際上就是乘加器,F(xiàn)PGA內(nèi)部可以集成多個(gè)乘加器,而一般的DSP芯片往往每個(gè)core只有一個(gè)。換言之,F(xiàn)PGA可以更容易實(shí)現(xiàn)多個(gè)DSP core功能。在某些需要大量乘加計(jì)算的場(chǎng)合,往往多個(gè)乘加器并行工作的速度可以遠(yuǎn)遠(yuǎn)超過(guò)一個(gè)高速乘加器。
SERDES:高速串行接口。將來(lái)PCI-E、XAUI、HT、S-ATA等高速串行接口會(huì)越來(lái)越多。有了SERDES模塊,F(xiàn)PGA可以很容易將這些高速串行接口集成進(jìn)來(lái),無(wú)需再購(gòu)買專門的接口芯片。
CPU?core:分為2種,軟core和硬core.軟core是用邏輯代碼寫(xiě)的CPU模塊,可以在任何資源足夠的FPGA中實(shí)現(xiàn),使用非常靈活。而且在大容量的FPGA中還可以集成多個(gè)軟core,實(shí)現(xiàn)多核并行處理。硬core是在特定的FPGA內(nèi)部做好的CPU core,優(yōu)點(diǎn)是速度快、性能好,缺點(diǎn)是不夠靈活。
不過(guò),F(xiàn)PGA還是有缺點(diǎn)。對(duì)于某些高主頻的應(yīng)用,F(xiàn)PGA就無(wú)能為力了?,F(xiàn)在雖然理論上FPGA可以支持的500MHz,但在實(shí)際設(shè)計(jì)中,往往200MHz以上工作頻率就很難實(shí)現(xiàn)了。好了,下面步入正題:FPGA的設(shè)計(jì)要點(diǎn)。
2
FPGA發(fā)展史
FPGA的發(fā)展歷史如下圖所示。相對(duì)于PROM、PAL/GAL、CPLD而言,F(xiàn)PGA規(guī)模更大性能更高。
圖1 FPGA發(fā)展史
FPGA芯片主流生產(chǎn)廠家包括Xilinx、Altera、Lattice、Microsemi,其中前兩家的市場(chǎng)份額合計(jì)達(dá)到88%。目前FPGA主流廠商全部為美國(guó)廠商。國(guó)產(chǎn)FPGA由于研發(fā)起步較美國(guó)晚至少20年,目前還處于成長(zhǎng)期,僅限于低端,在通信市場(chǎng)還沒(méi)有成熟應(yīng)用。
2015年12月,Intel公司斥資167億美元收購(gòu)了Altera公司。Altera被收購(gòu)后不久即制定了英特爾處理器與FPGA集成的產(chǎn)品路線圖。這兩種產(chǎn)品集成的好處是可以提供創(chuàng)新的異構(gòu)多核架構(gòu),適應(yīng)例如人工智能等新市場(chǎng)的需求,同時(shí)能大幅縮減功耗。
圖2 FPGA在電信領(lǐng)域的應(yīng)用歷史
FPGA在航天、軍工、電信領(lǐng)域有非常成熟和廣泛的應(yīng)用。以電信領(lǐng)域?yàn)槔陔娦旁O(shè)備一體機(jī)階段,F(xiàn)PGA由于其編程的靈活性以及高性能被應(yīng)用網(wǎng)絡(luò)協(xié)議解析以及接口轉(zhuǎn)換。
在NFV(NetworkFunction Virtualization階段,F(xiàn)PGA基于通用服務(wù)器和Hypervisor實(shí)現(xiàn)網(wǎng)元數(shù)據(jù)面5倍的性能提升,同時(shí)能夠被通用Openstack框架管理編排。
在云時(shí)代,F(xiàn)PGA已經(jīng)被作為基本IaaS資源在公有云提供開(kāi)發(fā)服務(wù)和加速服務(wù),AWS、華為、BAT均有類似通用服務(wù)提供。
截至目前,Intel的Stratix 10器件已被成功應(yīng)用于微軟實(shí)時(shí)人工智能云平臺(tái)Brainwave項(xiàng)目。
3
FPGA整體結(jié)構(gòu)
FPGA架構(gòu)主要包括可配置邏輯塊CLB(Configurable Logic Block)、輸入輸出塊IOB(Input Output Block)、內(nèi)部連線(Interconnect)和其它內(nèi)嵌單元四個(gè)部分。
CLB是FPGA的基本邏輯單元。實(shí)際數(shù)量和特性會(huì)依器件的不同而改變,但是每個(gè)CLB都包含一個(gè)由4或6個(gè)輸入、若干選擇電路(多路復(fù)用器等)和觸發(fā)器組成的可配置開(kāi)關(guān)矩陣。開(kāi)關(guān)矩陣具有高度的靈活性,經(jīng)配置可以處理組合型邏輯、移位寄存器或 RAM。
FPGA可支持許多種I/O標(biāo)準(zhǔn),因而可以為系統(tǒng)設(shè)計(jì)提供理想的接口橋接。FPGA 內(nèi)的I/O按bank分組,每個(gè)bank能獨(dú)立支持不同的I/O標(biāo)準(zhǔn)。目前最先進(jìn)的FPGA提供了十多個(gè)I/O bank,能夠提供靈活的I/O支持。
CLB 提供了邏輯性能,靈活的互連布線則負(fù)責(zé)在CLB和I/O之間傳遞信號(hào)。布線有幾種類型,從設(shè)計(jì)用于專門實(shí)現(xiàn) CLB 互連(短線資源)、到器件內(nèi)的高速水平和垂直長(zhǎng)線(長(zhǎng)線資源)、再到時(shí)鐘與其它全局信號(hào)的全局低skew布線(全局性專用布線資源)。一般,各廠家設(shè)計(jì)軟件會(huì)將互連布線任務(wù)隱藏起來(lái),用戶根本看不到,從而大幅降低了設(shè)計(jì)復(fù)雜性。
內(nèi)嵌硬核單元包括RAM、DSP、DCM(數(shù)字時(shí)鐘管理模塊)及其它特定接口硬核等,F(xiàn)PGA器件內(nèi)部結(jié)構(gòu)如下示意圖。
圖3 FPGA器件內(nèi)部結(jié)構(gòu)圖
一般來(lái)說(shuō),器件型號(hào)數(shù)字越大,表示器件能提供的邏輯資源規(guī)模越大。在FPGA器件選型時(shí),用戶需要對(duì)照此表格,根據(jù)業(yè)務(wù)對(duì)邏輯資源(CLB)、內(nèi)部BlockRAM、接口(高速Serdes對(duì)數(shù))、數(shù)字信號(hào)處理(DSP硬核數(shù))以及今后擴(kuò)展等多方面的需求,綜合考慮項(xiàng)目最合適的邏輯器件。
4
FPGA開(kāi)發(fā)流程
FPGA的設(shè)計(jì)流程就是利用EDA開(kāi)發(fā)軟件和編程工具對(duì)FPGA芯片進(jìn)行開(kāi)發(fā)的過(guò)程。FPGA的開(kāi)發(fā)流程一般如下圖所示,包括功能定義/器件選型、設(shè)計(jì)輸入、功能仿真、邏輯綜合、布局布線與實(shí)現(xiàn)、編程調(diào)試等主要步驟。
1、功能定義/器件選型:在FPGA設(shè)計(jì)項(xiàng)目開(kāi)始之前,必須有系統(tǒng)功能的定義和模塊的劃分,另外就是要根據(jù)任務(wù)要求,如系統(tǒng)的功能和復(fù)雜度,對(duì)工作速度和器件本身的資源、成本、以及連線的可布性等方面進(jìn)行權(quán)衡,選擇合適的設(shè)計(jì)方案和合適的器件類型。
?
2、 設(shè)計(jì)輸入:設(shè)計(jì)輸入指使用硬件描述語(yǔ)言將所設(shè)計(jì)的系統(tǒng)或電路用代碼表述出來(lái)。最常用的硬件描述語(yǔ)言是Verilog HDL。
?
3、 功能仿真:功能仿真指在邏輯綜合之前對(duì)用戶所設(shè)計(jì)的電路進(jìn)行邏輯功能驗(yàn)證。仿真前,需要搭建好測(cè)試平臺(tái)并準(zhǔn)備好測(cè)試激勵(lì),仿真結(jié)果將會(huì)生成報(bào)告文件和輸出信號(hào)波形,從中便可以觀察各個(gè)節(jié)點(diǎn)信號(hào)的變化。如果發(fā)現(xiàn)錯(cuò)誤,則返回設(shè)計(jì)修改邏輯設(shè)計(jì)。常用仿真工具有Model Tech公司的ModelSim、Sysnopsys公司的VCS等軟件。
?
4、 邏輯綜合:所謂綜合就是將較高級(jí)抽象層次的描述轉(zhuǎn)化成較低層次的描述。綜合優(yōu)化根據(jù)目標(biāo)與要求優(yōu)化所生成的邏輯連接,使層次設(shè)計(jì)平面化,供FPGA布局布線軟件進(jìn)行實(shí)現(xiàn)。就目前的層次來(lái)看,綜合優(yōu)化是指將設(shè)計(jì)輸入編譯成由與門、或門、非門、RAM、觸發(fā)器等基本邏輯單元組成的邏輯連接網(wǎng)表,而并非真實(shí)的門級(jí)電路。
真實(shí)具體的門級(jí)電路需要利用FPGA制造商的布局布線功能,根據(jù)綜合后生成的標(biāo)準(zhǔn)門級(jí)結(jié)構(gòu)網(wǎng)表來(lái)產(chǎn)生。為了能轉(zhuǎn)換成標(biāo)準(zhǔn)的門級(jí)結(jié)構(gòu)網(wǎng)表,HDL程序的編寫(xiě)必須符合特定綜合器所要求的風(fēng)格。常用的綜合工具有Synplicity公司的Synplify/Synplify Pro軟件以及各個(gè)FPGA廠家自己推出的綜合開(kāi)發(fā)工具。
?
5、布局布線與實(shí)現(xiàn):布局布線可理解為利用實(shí)現(xiàn)工具把邏輯映射到目標(biāo)器件結(jié)構(gòu)的資源中,決定邏輯的最佳布局,選擇邏輯與輸入輸出功能鏈接的布線通道進(jìn)行連線,并產(chǎn)生相應(yīng)文件(如配置文件與相關(guān)報(bào)告);實(shí)現(xiàn)是將綜合生成的邏輯網(wǎng)表配置到具體的FPGA芯片上。由于只有FPGA芯片生產(chǎn)商對(duì)芯片結(jié)構(gòu)最為了解,所以布局布線必須選擇芯片開(kāi)發(fā)商提供的工具。
?
6、編程調(diào)試:設(shè)計(jì)的最后一步就是編程調(diào)試。芯片編程是指產(chǎn)生使用的數(shù)據(jù)文件(位數(shù)據(jù)流文件,Bitstream Generaon),將編程數(shù)據(jù)加載到FPGA芯片中;之后便可進(jìn)行上板測(cè)試。最后將FPGA文件(如.bit文件)從電腦下載到單板上的FPGA芯片中。
5
如何使用FPGA
FPGA開(kāi)發(fā)完畢,最終得到驗(yàn)證好的加載文件。輸出加載文件后,即可開(kāi)始正常業(yè)務(wù)處理和驗(yàn)證(以軟件加載方式為例,描述整個(gè)過(guò)程)
1、邏輯加載;
2、單板軟件加載邏輯后,需要復(fù)位邏輯;
3、復(fù)位完成后,軟件需等待等待一段時(shí)間至邏輯鎖相環(huán)工作穩(wěn)定;
4、軟件啟動(dòng)對(duì)邏輯的外部RAM、內(nèi)部Block RAM、DDRC等的自檢操作;
5、軟件完成自檢以后,對(duì)邏輯所有可寫(xiě)RAM空間及寄存器進(jìn)行初始化操作;
6、初始化完畢,軟件參考邏輯芯片手冊(cè)配置表項(xiàng)及寄存器;
7、邏輯準(zhǔn)備好,可以開(kāi)始處理業(yè)務(wù)。
?
6
FPGA適用場(chǎng)景
FPGA適合非規(guī)則性多并發(fā)、密集計(jì)算及協(xié)議解析處理場(chǎng)景,例如人工智能、基因測(cè)序、視頻編碼、數(shù)據(jù)壓縮、圖片處理、網(wǎng)絡(luò)處理等各領(lǐng)域的加速。
7
FPGA設(shè)計(jì)要點(diǎn)之一:時(shí)鐘樹(shù)
對(duì)于FPGA來(lái)說(shuō),要盡可能避免異步設(shè)計(jì),盡可能采用同步設(shè)計(jì)。
同步設(shè)計(jì)的第一個(gè)關(guān)鍵,也是關(guān)鍵中的關(guān)鍵,就是時(shí)鐘樹(shù)。
一個(gè)糟糕的時(shí)鐘樹(shù),對(duì)FPGA設(shè)計(jì)來(lái)說(shuō),是一場(chǎng)無(wú)法彌補(bǔ)的災(zāi)難,是一個(gè)沒(méi)有打好地基的大樓,崩潰是必然的。
具體一些的設(shè)計(jì)細(xì)則:
1)盡可能采用單一時(shí)鐘;
2)如果有多個(gè)時(shí)鐘域,一定要仔細(xì)劃分,千萬(wàn)小心;
3)跨時(shí)鐘域的信號(hào)一定要做同步處理。對(duì)于控制信號(hào),可以采用雙采樣;對(duì)于數(shù)據(jù)信號(hào),可以采用異步fifo.需要注意的是,異步fifo不是萬(wàn)能的,一個(gè)異步fifo也只能解決一定范圍內(nèi)的頻差問(wèn)題。
4)盡可能將FPGA內(nèi)部的PLL、DLL利用起來(lái),這會(huì)給你的設(shè)計(jì)帶來(lái)大量的好處。
5)對(duì)于特殊的IO接口,需要仔細(xì)計(jì)算Tsu、Tco、Th,并利用PLL、DLL、DDIO、管腳可設(shè)置的delay等多種工具來(lái)實(shí)現(xiàn)。簡(jiǎn)單對(duì)管腳進(jìn)行Tsu、Tco、Th的約束往往是不行的。
可能說(shuō)的不是很確切。這里的時(shí)鐘樹(shù)實(shí)際上泛指時(shí)鐘方案,主要是時(shí)鐘域和PLL等的規(guī)劃,一般情況下不牽扯到走線時(shí)延的詳細(xì)計(jì)算(一般都走全局時(shí)鐘網(wǎng)絡(luò)和局部時(shí)鐘網(wǎng)絡(luò),時(shí)延固定),和ASIC中的時(shí)鐘樹(shù)不一樣。對(duì)于ASIC,就必須對(duì)時(shí)鐘網(wǎng)絡(luò)的設(shè)計(jì)、布線、時(shí)延計(jì)算進(jìn)行仔細(xì)的分析計(jì)算才行。
8
FPGA設(shè)計(jì)要點(diǎn)之二:FSM
FSM:有限狀態(tài)機(jī)。這個(gè)可以說(shuō)時(shí)邏輯設(shè)計(jì)的基礎(chǔ)。幾乎稍微大一點(diǎn)的邏輯設(shè)計(jì),幾乎都能看得到FSM.
FSM分為moore型和merly型,moore型的狀態(tài)遷移和變量無(wú)關(guān),merly型則有關(guān)。實(shí)際使用中大部分都采用merly型。
FSM通常有2種寫(xiě)法:?jiǎn)芜M(jìn)程、雙進(jìn)程。
初學(xué)者往往喜歡單進(jìn)程寫(xiě)法,格式如下:
簡(jiǎn)單的說(shuō),單進(jìn)程FSM就是把所有的同步、異步處理都放入一個(gè)always中。
優(yōu)點(diǎn):
1)看起來(lái)比較簡(jiǎn)單明了,寫(xiě)起來(lái)也不用在每個(gè)case分支或者if分支中寫(xiě)全對(duì)各個(gè)信號(hào)和狀態(tài)信號(hào)的處理。也可以簡(jiǎn)單在其中加入一些計(jì)數(shù)器進(jìn)行計(jì)數(shù)處理。
2)所有的輸出信號(hào)都已經(jīng)是經(jīng)過(guò)D觸發(fā)器鎖存了。
缺點(diǎn):
1)優(yōu)化效果不佳。由于同步、異步放在一起,編譯器一般對(duì)異步邏輯的優(yōu)化效果最好。單進(jìn)程FSM把同步、異步混雜在一起的結(jié)果就是導(dǎo)致編譯器優(yōu)化效果差,往往導(dǎo)致邏輯速度慢、資源消耗多。
2)某些時(shí)候需要更快的信號(hào)輸出,不必經(jīng)過(guò)D觸發(fā)器鎖存,這時(shí)單進(jìn)程FSM的處理就比較麻煩了。
雙進(jìn)程FSM,格式如下:
從上面可以看到,同步處理和異步處理分別放到2個(gè)always中。其中FSM狀態(tài)變量也采用2個(gè)來(lái)進(jìn)行控制。雙進(jìn)程FSM的原理我這里就不多說(shuō)了,在很多邏輯設(shè)計(jì)書(shū)中都有介紹,大家可以去看看。
優(yōu)點(diǎn):
1)編譯器優(yōu)化效果明顯,可以得到很理想的速度和資源占用率。
2)所有的輸出信號(hào)(除了FSM_status_current)都是組合輸出的,比單進(jìn)程FSM快。
缺點(diǎn):
1)所有的輸出信號(hào)(除了FSM_status_current)都是組合輸出的,在某些場(chǎng)合需要額外寫(xiě)代碼來(lái)進(jìn)行鎖存。
2)在異步處理的always中,所有的if、case分支必須把所有的輸出信號(hào)都賦值,而且不能出現(xiàn)在FSM中的輸出信號(hào)回送賦值給本FSM中的其他信號(hào)的情況,否則會(huì)出現(xiàn) latch。
latch會(huì)導(dǎo)致如下問(wèn)題:
1)功能仿真結(jié)果和后仿不符;
2)出現(xiàn)無(wú)法測(cè)試的邏輯;
3)邏輯工作不穩(wěn)定,特別是latch部分對(duì)毛刺異常敏感;
4)某些及其特殊的情況下,如果出現(xiàn)正反饋,可能會(huì)導(dǎo)致災(zāi)難性的后果。
這不是恐嚇也不是開(kāi)玩笑,我就親眼見(jiàn)過(guò)一個(gè)小伙把他做的邏輯加載上去后,整個(gè)FPGA給炸飛了。后來(lái)懷疑可能是出現(xiàn)正反饋導(dǎo)致高頻振蕩,最后導(dǎo)致芯片過(guò)熱炸掉(這個(gè)FPGA芯片沒(méi)有安裝散熱片)。
9
FPGA設(shè)計(jì)要點(diǎn)之三:latch
首先解釋一下:
1)stateCAD沒(méi)有用過(guò),不過(guò)我感覺(jué)用這個(gè)東東在構(gòu)建大的系統(tǒng)的時(shí)候似乎不是很方便。也許用systemC或者system?Verilog更好一些。
2)同步、異步的叫法是我所在公司的習(xí)慣叫法,不太對(duì),不過(guò)已經(jīng)習(xí)慣了,呵呵。
再講一下latch:
前面講到了latch的危害,再講一下如何避免。我總結(jié)了以下幾點(diǎn)
1)在組合邏輯進(jìn)程中,if語(yǔ)句一定要有else!并且所有的信號(hào)都要在if的所有分支中被賦值。
另外需要注意,下面也會(huì)產(chǎn)生latch.也就是說(shuō)在組合邏輯進(jìn)程中不能出現(xiàn)自己賦值給自己或者間接出現(xiàn)自己賦值給自己的情況。
但如果是時(shí)序邏輯進(jìn)程,則不存在該問(wèn)題。
2)case語(yǔ)句的default一定不能少!原因和if語(yǔ)句相同,這里不再多說(shuō)了。
需要提醒的是,在時(shí)序邏輯進(jìn)程中,default語(yǔ)句也一定要加上,這是一個(gè)很好的習(xí)慣。
3)組合邏輯進(jìn)程敏感變量不能少也不能多。這個(gè)問(wèn)題倒不是太大,verilog2001語(yǔ)法中可以直接用 * 搞定了。
最后總結(jié)下,latch有弊就一定有利。在FPGA的LE中,總存在一個(gè)latch和一個(gè)D觸發(fā)器,在支持DDR的IOE(IOB)中也存在著一個(gè)latch來(lái)實(shí)現(xiàn)DDIO.不過(guò)在我們平時(shí)的設(shè)計(jì)中,對(duì)latch還是要盡可能的敬而遠(yuǎn)之。
10
FPGA設(shè)計(jì)要點(diǎn)之四:邏輯仿真
仿真是FPGA設(shè)計(jì)中必不可少的一步。沒(méi)有仿真,就沒(méi)有一切。
仿真是一個(gè)單調(diào)而繁瑣的工作,很容易讓人產(chǎn)生放棄或者偷工減料的念頭。這時(shí)一定要挺??!
仿真分為單元仿真、集成仿真、系統(tǒng)仿真。
單元仿真:針對(duì)每一個(gè)最小基本模塊的仿真。單元仿真要求代碼行覆蓋率、條件分支覆蓋率、表達(dá)式覆蓋率必須達(dá)到100%!這三種覆蓋率都可以通過(guò)MODELSIM來(lái)查看,不過(guò)需要在編譯該模塊時(shí)要在Compile option中設(shè)置好。
集成仿真:將多個(gè)大模塊合在一起進(jìn)行仿真。覆蓋率要求盡量高。
系統(tǒng)仿真:將整個(gè)硬件系統(tǒng)合在一起進(jìn)行仿真。此時(shí)整個(gè)仿真平臺(tái)包含了邏輯周邊芯片接口的仿真模型,以及BFM、Testbench等。系統(tǒng)仿真需要根據(jù)被仿真邏輯的功能、性能需求仔細(xì)設(shè)計(jì)仿真測(cè)試?yán)头抡鏈y(cè)試平臺(tái)。系統(tǒng)仿真是邏輯設(shè)計(jì)的一個(gè)大分支,是一門需要專門學(xué)習(xí)的學(xué)科。