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