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