作為ASIC領(lǐng)域中一種半定制電路,FPGA的發(fā)展不但解決了定制電路不足,并且能夠克服可編程器件門電路數(shù)有限的特點(diǎn)。再加上FPGA自身具有的設(shè)計(jì)周期短、開發(fā)成本低和設(shè)計(jì)靈活等特點(diǎn),基于FPGA的開發(fā)越來(lái)越流行。為了幫助大家解決FPGA開發(fā)中碰到的相關(guān)問(wèn)題,電子發(fā)燒友網(wǎng)和FPGA資深工程師吳厚航(網(wǎng)名“特權(quán)同學(xué)”)進(jìn)行了深入的交談,希望能為工程師群體在電子設(shè)計(jì)道路上提供參考。
大家知道在FPGA設(shè)計(jì)中,時(shí)序設(shè)計(jì)是至關(guān)重要的,通過(guò)時(shí)序設(shè)計(jì)去滿足每一個(gè)觸發(fā)器的建立和保持時(shí)間的要求,是FPGA設(shè)計(jì)中的重點(diǎn)。大家雖然知道這是很重要的,但對(duì)于時(shí)序設(shè)計(jì)為什么在FPGA設(shè)計(jì)中如此重要,或許知其然而不知其所以然。
電子發(fā)燒友網(wǎng)就此事咨詢了特權(quán)同學(xué)。特權(quán)同學(xué)認(rèn)為,如果想了解一個(gè)人的FPGA設(shè)計(jì)開發(fā)水平,只需要看他們所作的FPGA設(shè)計(jì)中是否進(jìn)行了時(shí)序約束、如何約束及其相關(guān)的細(xì)節(jié)便可八九不離十的得出結(jié)論。由此可見,時(shí)序設(shè)計(jì)在整個(gè)FPGA開發(fā)過(guò)程中的重要性不言而喻。特權(quán)同學(xué)從FPGA的設(shè)計(jì)出發(fā),給我們闡述了時(shí)序設(shè)計(jì)的重要性。
如圖所示,這是一個(gè)典型的FPGA開發(fā)流程圖,當(dāng)然并不是一個(gè)非常全面完整的流程圖,但是至少我們可以從這些箭頭關(guān)系得知FPGA設(shè)計(jì)一個(gè)特有的迭代性。這和大多數(shù)以往我們所接觸過(guò)的純軟件或純硬件開發(fā)都不一樣。FPGA開發(fā)的迭代性,意味著設(shè)計(jì)過(guò)程中的每一個(gè)環(huán)節(jié)出現(xiàn)差錯(cuò),都可能導(dǎo)致整個(gè)系統(tǒng)推倒重來(lái),回到起點(diǎn)。
就拿當(dāng)前我們所討論的時(shí)序設(shè)計(jì)來(lái)說(shuō),在時(shí)序約束階段,如果我們得到的時(shí)序報(bào)告中很多時(shí)序路徑違規(guī),無(wú)法達(dá)到既定要求,那么我們會(huì)一步一步往回找問(wèn)題的解決辦法,先是確認(rèn)時(shí)序約束本身的合理性(尤其不要有過(guò)約束);接著在實(shí)現(xiàn)階段和綜合階段找辦法,主要是通過(guò)工具選項(xiàng)進(jìn)行一些特定的優(yōu)化設(shè)置;再搞不定就要修改代碼,從根本上進(jìn)行設(shè)計(jì)邏輯和路徑的優(yōu)化;有人關(guān)心還是搞不定怎么辦,只能告訴你需求分析不到位,你的器件選型恐怕有待商榷了。這么看下來(lái),F(xiàn)PGA設(shè)計(jì)還真是環(huán)環(huán)相扣,每個(gè)步驟都來(lái)不得一點(diǎn)馬虎。
特權(quán)同學(xué)通過(guò)FPGA設(shè)計(jì)入手,給我們初步解析了為什么時(shí)序設(shè)計(jì)會(huì)是這么重要。但作為工程師的我們,既然已經(jīng)更明白到其重要性,那就要去深入了解其中的問(wèn)題,為我們?nèi)蘸蟮拈_發(fā)提供需要注意的參考。
根據(jù)特權(quán)同學(xué)的看法,時(shí)序設(shè)計(jì)通??梢源笾碌姆譃闀r(shí)序分析、時(shí)序約束、時(shí)序報(bào)告、時(shí)序收斂(這在筆者所著的《愛(ài)上FPGA開發(fā)——特權(quán)和你一起學(xué)NIOS II》一書第4章有詳細(xì)介紹)四個(gè)階段。每個(gè)階段都很關(guān)鍵,都不能夠隨意敷衍了事。
尤其是時(shí)序分析階段,雖然對(duì)于基礎(chǔ)理論知識(shí),我們可能都能夠理解和領(lǐng)會(huì),但工程實(shí)踐中遇到的各種情況恐怕要比理想公式的關(guān)系復(fù)雜得多。因此,在掌握了理想時(shí)序分析模型的理論知識(shí)之后,要能夠活學(xué)活用,遇到各種復(fù)雜的情況要能夠靈活變通,特別是FPGA和外部芯片接口的時(shí)序設(shè)計(jì)上,不同的外部芯片給出的時(shí)序信息良莠不齊,就很考驗(yàn)我們的分析能力。
當(dāng)然了,話說(shuō)回來(lái),實(shí)際情況雖然不同,但是我們將這些復(fù)雜情況提煉出來(lái)的基本模型都是“萬(wàn)變不離其宗”的,最終考驗(yàn)的還是我們“化繁為簡(jiǎn)”的能力。所以,每位做時(shí)序分析的工程師,都需要特別注意鍛煉自己在這一方面的功力。
我們之前有提過(guò),如何從實(shí)際出發(fā)了解時(shí)序分析的問(wèn)題。接下來(lái)特權(quán)同學(xué)會(huì)給我們介紹他在FPGA時(shí)序設(shè)計(jì)中碰到的問(wèn)題。
特權(quán)同學(xué)說(shuō)到在剛剛開始做FPGA的項(xiàng)目時(shí),由于經(jīng)驗(yàn)所限,很多陷阱和彎路都走了個(gè)遍。這里舉一個(gè)跨時(shí)鐘域的時(shí)序問(wèn)題:
這是一個(gè)FPGA內(nèi)嵌硬核CPU的系統(tǒng),它的軟件代碼在每次上電時(shí)從一顆外部的FLASH中加載。CPU本身只有一組總線接口,這個(gè)總線接口的邏輯都是自己設(shè)計(jì)的,F(xiàn)LASH運(yùn)行軟件的代碼是直接使用了官方給出的源代碼。因此,一開始只是想當(dāng)然的將FLASH和CPU按照實(shí)例“對(duì)接”上了。卻忽視了例化中供給二者的時(shí)鐘不同,CPU跑得頻率是FLASH頻率的3倍多。
說(shuō)不清道不明的“幽靈”現(xiàn)象
于是在實(shí)際調(diào)試中,出現(xiàn)了很多說(shuō)不清道不明的“幽靈”現(xiàn)象。通常斷電較長(zhǎng)時(shí)間后若給芯片供電,第一次沒(méi)反應(yīng),第二次通常就起來(lái)了,然后不停的上下電,一般也都能夠起來(lái),我們笑稱“是不是這個(gè)芯片要充電啊”。但是從始至終居然有那么一個(gè)樣機(jī)(一共有四套)非常堅(jiān)挺的從來(lái)不出這個(gè)癥狀。開始我們一直懷疑是芯片廠商提供的所謂“工程樣片”有貓膩,但是隨著調(diào)試不斷的深入,工程代碼改進(jìn)后不斷產(chǎn)生新的編譯結(jié)果,有些工程的邏輯編譯居然無(wú)論如何都無(wú)法讓工程跑起來(lái),對(duì)比前后能跑和不能跑的工程,改動(dòng)的地方確認(rèn)是一些無(wú)關(guān)緊要的邏輯。
和FAE談到這些比較怪異的癥狀,并且我們也聊到了軟件是從FLASH加載的,聊到了它們的時(shí)鐘頻率,F(xiàn)AE給了我一些啟發(fā)和靈感。于是深入的去解析那份“舶來(lái)品”,發(fā)現(xiàn)了CPU讀寫代碼接口中的等待信號(hào)非常可能就是罪魁禍?zhǔn)住?/p>
我們做了一個(gè)假設(shè),比如CPU以100MHz在跑,F(xiàn)LASH操作是20MHz。CPU需要每若干個(gè)時(shí)鐘周期執(zhí)行一次軟件代碼讀操作,F(xiàn)LASH要響應(yīng)這樣一次操作要慢很多,因此FLASH就是通過(guò)wait信號(hào)來(lái)拖長(zhǎng)CPU的操作時(shí)間,以保證完成這樣的一次讀操作。那么wait信號(hào)是由FLASH的時(shí)鐘產(chǎn)生的,它會(huì)比CPU的時(shí)鐘慢很多。
存在那么一種情況,當(dāng)CPU執(zhí)行第一個(gè)讀操作時(shí),好不容易等到了FLASH模塊的wait信號(hào),然后發(fā)出第二次的讀操作,而此時(shí)由于這個(gè)wait信號(hào)保持的時(shí)間還未結(jié)束,那么CPU誤以為是給它的wait信號(hào)了,所以接著往下走了。如此一來(lái),軟件就大亂了。
這般推測(cè)后,特權(quán)同學(xué)適時(shí)的對(duì)這個(gè)wait信號(hào)的產(chǎn)生邏輯做了一些處理,同時(shí)也明確的對(duì)此處的時(shí)鐘進(jìn)行了約束,此后經(jīng)過(guò)恩天的驗(yàn)證果然不再有芯片在上電后無(wú)法運(yùn)行的情況了。
我們?cè)谂龅絾?wèn)題的時(shí)候,最主要的是要了解全面的分析方法,在FPGA設(shè)計(jì)方面,這些分析方法尤其重要。特權(quán)同學(xué)認(rèn)為,在FPGA開發(fā)過(guò)程中,不遇到問(wèn)題是不可能的,時(shí)序問(wèn)題的分析定位往往也是難上加難。很
多時(shí)候在調(diào)試后期,特別是板級(jí)調(diào)試階段,一個(gè)bug的出現(xiàn),可能涉及FPGA內(nèi)部的邏輯功能性錯(cuò)誤或時(shí)序錯(cuò)誤,也可能涉及到FPGA的硬件板級(jí)電路,如供電電路、外部芯片等的錯(cuò)誤,這些錯(cuò)綜復(fù)雜的情況往往讓調(diào)試者暈頭轉(zhuǎn)向。
而在應(yīng)對(duì)這些問(wèn)題時(shí),以筆者的經(jīng)驗(yàn),首先要定位好問(wèn)題所在,就要采取排除法,獨(dú)立各個(gè)模塊,先縮小問(wèn)題的范圍。接著有針對(duì)性的進(jìn)行具體問(wèn)題的排查,直到找著問(wèn)題的根本原因。當(dāng)然了,有時(shí)候某些問(wèn)題可能不是單一故障引發(fā)的,或許有多種因素,這時(shí)候就要多從理論進(jìn)行分析,多做試驗(yàn)進(jìn)一步排查了??傊@是一項(xiàng)很鍛煉人的工作,很多工作也是建立在過(guò)往經(jīng)驗(yàn)的基礎(chǔ)上進(jìn)行的。
所以,作為一個(gè)工程師,筆者非常推崇大家從一開始就養(yǎng)成較真的習(xí)慣,遇到問(wèn)題就一定要弄明白,并且將所遇到的問(wèn)題落實(shí)到筆頭,以報(bào)告的形式記錄下來(lái),當(dāng)然不只是拿這樣的報(bào)告去邀功請(qǐng)賞而已,更多的是借助報(bào)告撰寫的過(guò)程提高自身的知識(shí)儲(chǔ)備,畢竟每一個(gè)論點(diǎn)和論據(jù)的支撐都需要涉及大量的理論知識(shí)。
到現(xiàn)在,現(xiàn)在大家對(duì)特權(quán)同學(xué)的這種FPGA思維和經(jīng)驗(yàn)很敬仰吧。但誰(shuí)也不是一蹴而就的,下面我們就讓特權(quán)同學(xué)這個(gè)先行者給我們這些后來(lái)者分享相關(guān)經(jīng)驗(yàn)。
他認(rèn)為電子技術(shù)的發(fā)展日新月異,若想成為一個(gè)稱職的FPGA工程師,保持一顆謙卑的心態(tài)非常重要。
筆者記憶中對(duì)一位小學(xué)老師的畢業(yè)留言印象深刻,那便是“學(xué)習(xí)學(xué)習(xí)再學(xué)習(xí)”這句讓人終身受用的良言。筆者在電子發(fā)燒友的FPGA在線講座中曾引述過(guò)一位業(yè)內(nèi)前輩對(duì)FPGA發(fā)展的三個(gè)階段劃分,即入門階段、進(jìn)階階段和從業(yè)階段。每個(gè)階段都是一個(gè)學(xué)習(xí)的過(guò)程,甚至在從業(yè)階段更是如此,面對(duì)紛繁復(fù)雜的設(shè)計(jì)和調(diào)試局面,如果沒(méi)有很強(qiáng)的再學(xué)習(xí)欲望和能力,有時(shí)真的很難招架應(yīng)對(duì)。
在入門階段和進(jìn)階階段,掌握了FPGA設(shè)計(jì)的各種基本技能,在工程實(shí)踐中便應(yīng)該盡可能的遵循規(guī)范的開發(fā)流程,不要投機(jī)取巧甚至“偷工減料”,只有嚴(yán)謹(jǐn)認(rèn)真的面對(duì)每一個(gè)設(shè)計(jì)項(xiàng)目,才可能高效、出色的完成任務(wù)。而這種嚴(yán)謹(jǐn)認(rèn)真的態(tài)度,從一開始就應(yīng)該養(yǎng)成。俗話說(shuō)“習(xí)慣決定性格,性格決定命運(yùn)”,筆者想說(shuō)的其實(shí)也是這樣一個(gè)淺顯的道理。
不知道大家對(duì)這期的技術(shù)文章了解如何,作為小編的我,可從吳老師身上學(xué)到了很多。希望能夠給電子工程師提供設(shè)計(jì)參考價(jià)值。
評(píng)論
查看更多