FPGA設計的驗證技術及應用原則
隨著FPGA器件體積和復雜性的不斷增加,設計工程師越來越需要有效的驗證方。時序仿真可以是一種能發(fā)現最多問題的驗證方法,但對許多設計來說,它常常是最困難和費時的方法之一。過去,采用標準臺式計算機的時序仿真是以小時或分鐘計算的,但現在對某些項目來說,在要求采用高性能64位服務器的情況下,其測試時間卻要幾天甚至幾周。這樣,這種方法首先消弭了采用FPGA帶來的上市時間和實施成本方面的好處。
FPGA設計和驗證工程師當今面臨的最大挑戰(zhàn)之一是時間和資源制約。隨著FPGA在速度、密度和復雜性方面的增加,為完成一個完整時序驗證,不僅對人力也對計算機處理器和存儲器提出了更多更高的要求。另外,對設計和驗證工程師來說(許多情況可能是同一個人),這為在更短的時限內,以更大信心對當今的FPGA設計在第一次就可實施徹底成功驗證提出了更艱巨的挑戰(zhàn)。
時序仿真的重要性
為確保設計可以工作及能連續(xù)穩(wěn)定工作,當今的FPGA既需要功能又需要時序仿真。FPGA設計的復雜性在增加,而傳統(tǒng)的驗證方法論又不再有效。過去,在FPGA設計流中,模擬并非一個重要階段。但眼下,卻成為最關鍵的步驟之一。當采用類似Xilinx的Virtex-5 FPGA Family等更先進FPGA設計時,時序仿真就變得尤其重要。
傳統(tǒng)的FPGA驗證方法是:
1.功能模擬
在驗證過程中,功能模擬是個非常重要的部分,但不應是唯一部分。當進行功能模擬時,它只對RTL設計的功能性進行測試。它不包括任何時序信息,它也不考慮由實現和優(yōu)化對原初設計造成的改變。
2. 靜態(tài)時序分析/形式驗證
許多工程師認為為校驗設計是否滿足時序要求,只需進行靜態(tài)時序分析。將此作為唯一時序分析方法有很多缺陷。靜態(tài)分析無法發(fā)現當設計動態(tài)運行時,才能發(fā)現的任何問題。靜態(tài)分析僅能顯示該設計作為整體是否可滿足設置和保持要求且一般僅達到施加的時序約束的水平。在實際系統(tǒng)中,動態(tài)因素可造成FPGA的時序違規(guī)。例子之一是塊RAM(Block Ram)沖突。在FPGA器件中,隨著雙端口塊RAM(Dual Port Block Rams)的引入,應留心避免同時讀/寫同一個區(qū)域,否則,讀取的數據會不正確。靜態(tài)分析工具將永遠無法發(fā)現該問題。類似,若有被誤讀的時間規(guī)范(timespec),靜態(tài)時序分析也將難以發(fā)現此問題。
3. 在系統(tǒng)測試
實際上,每位工程師都依賴該方法進行最終測試。若設計能在板上工作且通過了各種測試,則該設計就將被發(fā)布。這肯定是個非常好的測試,但它也許沒能發(fā)現全部問題。有時,在一些邊界情況(corner-case)被發(fā)現前,設計需運行相當長的時間。諸如時序違約等問題并非在所有芯片中都以相同方式顯露出來。當發(fā)現這些問題時,設計通常已交到用戶手中。這意味著為找出此問題所導致的高成本、停工期和挫折感。為能正確完成在系統(tǒng)測試,必須清除全部硬件故障,其中包括與SSO相關的問題、交叉干擾以及其它與板卡關聯(lián)的問題。若在啟動在系統(tǒng)測試前,有需要連接的外部接口,則將延緩產品的上市時間。
從上可知,傳統(tǒng)的驗證方法不足以進行完整的系統(tǒng)驗證。有充足理由進行動態(tài)時序分析。
時序仿真是可在其中進行動態(tài)分析的唯一方法。許多工程師有令人信服的理由拒絕進行時序分析。一些主要擔心問題是:
它很費時;
為執(zhí)行驗證,需要大量存儲器和處理器資源;
為沒有辦法重復使用取自功能模擬的測試基準,必須創(chuàng)制新測試基準;
為因為整個網絡表是展開的,所以設計調試成為一件瑣事,另外,沒辦法及時定位問題所在;
為時序仿真顯示最壞情況的數量,設計本身可能足夠超脫,不至于如此興師動眾;
為并非所有子模塊都是在一個環(huán)境下進行編程的;
為無法將在各個不同場所編程的部分分開,因為這些部分的設計師應是那些為能進行驗證從而對設計有更深刻把握的人。
這些都是正當的關注,這也就是為什么下一節(jié)將討論工程師能做些什么以克服其中某些問題的原因。
在時序仿真中采用Netgen以獲得精準結果
Xilinx提出了一種革命性方法以從Netgen中得到用于動態(tài)分析匹配的靜態(tài)時序分析數和時序數。與-pcf 開關一起運行Netgen并指向一個有效PCF文件將確保得自Trce和Netgen的數將互相匹配。
在時序計算時,所有新Xilinx架構都利用了相對最小數(Relative Minimums)的好處。利用相對最小數意味著在設置計算以及相反的保持計算時,將采用最大時鐘延時和最小數據延時。目前的模擬器不支持使用相同SDF文件中分別取自MIN域和MAX域的數?;谠撓拗?,Xilinx需要兩個不同的模擬-- 一個用于設置,另一個用于保持。
Netgen編寫SDF文件,所以,當運行SDFMAX模擬時,將利用最大時鐘延時和最小數據延時。SDFMAX保證設計能滿足目標器件的設置要求。當運行SDFMIN模擬時,利用最小時鐘延時和最大數據延時。SDFMIN保證設計能滿足目標器件的保持要求。
改進時序仿真體驗
當描述時序仿真時,“總體大于部分的總合”這樣一句常語幾乎可被反過來說成:“部分的總合大于總體?!焙笠痪湓捒偨Y了本節(jié)所要闡釋的內容。為縮短時序仿真所用的時間,我們將不得不依靠“分割后各個擊破”的方法。對一個大的展開網絡表來說,完成任何形式的驗證都將是件費時和枯燥的任務。因此,采取的措施是將網絡表分割為多個小部分。
該方法論并非是數字邏輯領域的一場革命,它是一種漸進的沿革。自從HDL出現后,設計師一直喜歡采用基于部分組件的模擬而非整個大設計。問題是,沒辦法將此手段引入時序仿真。這與在FPGA實現中,在保持層次中所取得的進展不再一樣。其基于的理念很簡單。許多設計創(chuàng)生于若干更小模塊,而驗證在各個子模塊層次進行。
不久前,推出了一種稱為KEEP_HIERARCHY的方法。該方案允許設計在經歷實現時也能保持層次。它在改進時序仿真方案方面前進了一小步,但它有助于解決的實際問題是在調試階段?,F在,設計不再是一個展開網絡表。后標注的HDL文件具有不同的層次部分以匹配原初設計?,F在,當在時序仿真中發(fā)現問題時,能容易地多地對故障源進行定位并進行調試除錯。正如上面提到的,這只是該特性全面能力的一個過度。
KEEP_HIERARCHY的下一步是生成“多層次文件(Multiple Hierarchical Files)”的能力。這一引入到軟件工具中的特性能為層次的各部分編寫獨立的網絡表及相應的SDF(標準延時格式)文件。該特性的引入為與時序仿真一起使用的各種方法敞開了大門。一旦能為層次的各部分編寫,則每個時序模塊看起來與RTL版本一樣。這就支持能再利用在進行功能模擬時使用的測試基準。這在時序仿真中是個長足進步。
現在,工程師不再需要僅為進行時序仿真編寫一個獨立的測試基準。若已為功能模擬編寫了一個測試基準,則幾乎不需任何改動就可將其用于時序仿真。位于頂層的端口名稱將總是相同的,這樣,測試基準就可被再利用。此類設計的主要優(yōu)勢之一是它可容易地定位問題所在。為能充分了解該特性的真實能力,我們將考察一個實際例子。
圖1中,子模塊A首先由工程團隊1生成、子模塊B和C由工程團隊2生成,另外,IP模塊D從第三方買進。這些模塊都在不同時間及/或由不同工程師生成,且為了驗證每個模塊的功能準確性,各模塊都用其自己的測試基準進行了驗證。一旦成功對各個獨立部分進行了驗證,它們就被整合進FPGA以進行實現。RTL模擬通常就是這樣做的?,F在,借助與KEEP_HIERARCHY一起使用MHF(多層級文件)的能力,甚至在進行時序仿真時都可能保持相同策略。
采用該特性能幫助想進行時序仿真的設計師解決他們面臨的兩個最大難題:1)各個模塊重復使用測試基準的能力;2)定位發(fā)生問題的具體模塊的能力??捎卸喾N途徑進行時序仿真。當采用MHF時,因為所有這些模塊的頂層端口都保持一致,所以可容易地重復使用RTL測試基準。
以組塊形態(tài)形成的最終網絡表確實可使用戶為其RTL等價物選取不同的模塊。這樣做,用戶將可加快模擬的運行時間。RTL幾乎永遠比結構化網絡表等快得多,若有種方法在不影響設計功能的前提下可用RTL替換結構碼,則就應嘗試這種方法。幾乎沒一種設計在實現后就盡善盡美。這就是為什么需要進行時序仿真的原因。
采用上述同一個例子,我們可考察如何改進整個設計的速度及可觀察性。為得到最短的運行時間,理想的情況是在一個模塊上一次僅運行時序仿真。此例中,我們可在子模塊A運行時序仿真然后使子模塊B、C和D處在RTL形式。一旦我們進行時序仿真并發(fā)現一切如預期的一樣,就可對任何子模塊進行切換并以相同的方式進行測試。采用該方法論還意味著,若在一個子模塊中發(fā)現了問題,則可容易地定位該問題子模塊并將它拿給該模塊的設計者進行修改。 若發(fā)現多個子模塊存在問題,則該方法帶來的額外好處是,兩(多)個不同工程團隊能同時著手解決發(fā)現的問題。
在傳統(tǒng)流程中,當發(fā)現設計的一個部分存在問題時,只有在該部分的問題被解決后,設計師才可能處理設計的其它部分。在采用MHF設計流后將不再受這種限制。時序仿真用戶的另一個主要抱怨是:若其它工程團隊不在國內,則完成最后的驗證會相當困難且需花很長時間。這是因為,它將浪費許多時間以及當采用傳統(tǒng)時序仿真方法論時的許多相互關聯(lián)和依賴問題。借助MHF方法論,去掉了關聯(lián)因素。利用MHF,不同工程團隊可省去許多空閑時間。這將確保發(fā)揮團隊的最大效率。具有模塊結構的網絡表也能為驗證小組提供幫助。過去,需要由一位驗證工程師完成的工作現可由不同小組的多位驗證工程師完成。開發(fā)小組采用的理念也可同樣用于驗證小組。
除在模擬領域取得持續(xù)進展以外,在施加激勵的方法方面也有重要進步。過去的設計通常非常小,所以以前的設計激勵方法是采用模擬器提示(prompt)的施力文件(force file)或簡單刺激以切換每個信號。隨著設計變得益發(fā)復雜,施加激勵也需要更好的方法。這里,VHDL和Verilog 的能力將有用武之地。隨著HDL編碼語言的引入,測試基準變得更復雜和緊湊。
在該領域,出現了諸如PSL、SystemC和SystemVerilog等技術。這些語言覆蓋的范圍不在本文討論之內。這些編程方式的一個不利方面是它要求將一個模擬的輸出作為另一個模擬的輸入。一些模擬器支持允許用戶準確進行這種操控的Extended Value Change Dump Format 格式。不采用這種方法進行時序仿真的用戶遇到的主要障礙是:因為當將一切都展開后端口名稱將改變,所以沒辦法將輸出作為激勵。采用MHF方法會去掉此問題,因為,現在這里有可施以激勵的獨立模塊,另外,現在一個模塊的輸出可被用作另一個模塊進行RTL以及時序仿真的激勵。
選擇層次
取得層次模擬成功的一個主要部分是選取層次。沒有現成的公式可用于選擇正確的層次。這就是為什么沒有對或錯的層次的原因,雖然在試圖選取層次還是有些原則可資借鑒的。確保滿足如下這些原則永遠是明智之舉。
1)設計應當是完全同步的。
2)所有關鍵路徑應包括在一個邏輯組(可被分別同步的設計的一部分)中。典型情況,每個邏輯組應是在設計頂層例示(instantiated)的Verilog內的一個模塊或VHDL內的一個實體 。
3)全部IOB(輸入/輸出塊)邏輯應在頂層。器件的任一個輸入和輸出應在頂層及I/O緩沖器和I/O三態(tài)門內進行聲明。但,邏輯組內例示的I/O邏輯是可接受的。
4)在每個邏輯組的輸入和/或輸出應放置寄存器。高明的作法是在邏輯組的邊界對所有輸入信號或輸出信號進行寄存處理。它確保邏輯組內的所有關鍵路徑得到保持并免去了當通過邏輯組邊界進行邏輯優(yōu)化時可能導致的問題。在設計中的所有層次組內都應一致遵守該規(guī)則。
5)頂層應只包含例示的模塊或實體、IOB邏輯及時鐘邏輯(DCM、BUFG等)。
6)選擇邏輯組時,應不使任一組過小以至對其單獨進行驗證的價值不大或不太關乎大局,還應不使任一組過大以便當發(fā)生問題時難以模擬和調試。但對此沒有確切的定律,另外,它可根據設計和驗證要求而變。
7)選擇邏輯組時還應注意使設計中最可能在后續(xù)設計流中被改動的部分與設計中更穩(wěn)定的部分獨立開來。這樣,當進行了這種明智選擇后,以后的設計變更對驗證時間產生的影響最小。
只要遵循上述提到的規(guī)則,保持層次就該不會對設計性能產生影響。為從保有的層次中得到最大利益,只應將其應用在設計中的其端口在門級模擬中需要可見性的塊中。一般情況,這些塊是遵循了上述規(guī)則的上層塊。通過對選擇的塊限制其保留層次,綜合和實現工具將具有更多的自由以優(yōu)化設計并改進性能。下圖2顯示的是在一個范例設計中可在哪里保留層次的例子。
應注意的是這里只有指導方針。沒有指定如何選擇或保持層次的確定規(guī)則。它的確因設計而異、因用戶而不同。應由用戶來決定在哪里保持層次對驗證最有價值、以及在哪里應將其解構。
層次驗證進入實戰(zhàn)
為對在時序仿真中采用層次方法的可能好處進行量化,我們將檢查兩個設計:VHDL和Verilog各一個,它們都是以中等規(guī)模Xilinx FPGA為目標器件的,且采用了500微秒的Model Technology ModelSim SE模擬器進行模擬。這些模擬是在帶2GB RDRAM存儲器的雙2.0 GHz Xeon計算機上在Linux環(huán)境下運行的。這是為表現該方法論能顯現的量值差別所進行的一個適當的嘗試,它并不一定代表典型的模擬運行時間或存儲器需求。
VHDL設計在一定程度上代表了典型的以DSP為導向的設計,這里用的是Xilinx的 Virtex-4 SX35 FPGA。我們選擇將設計分為9個子層和一個頂層,在每個期望子層都放置一個KEEP_HIERARCHY。
在該測試中,我們選取代碼最不穩(wěn)定的部分,也即在設計流的這一部分它頻繁改變。執(zhí)行一個相對簡單的模擬,并比較TRL模擬時間與設計的時序仿真時間,我們發(fā)現它對運行時間和存儲器容量要求有顯著增加,見下表1。但,若我們采取僅對設計的改變部分施以時序仿真的方法,我們可相應降低運行時間24倍、減小存儲器容量21倍。即使我們選擇僅采用改變的部分對整個設計進行時序驗證,我們看到,與完全RTL模擬相比,其所需的運行時間和存儲器容量與完全RTL模擬相比也只需增加約一倍。與更傳統(tǒng)的全時序仿真相比,其對上述兩個指標的要求也有大幅降低。
看Verilog設計,它代表了某種更大更復雜數據路徑方式的設計,我們以Xilinx Virtex-4 LX80 FPGA為目標器件。我們將其分為14個子層和一個頂層,采用KEEP_HIERARCHY約束以支持分段時序仿真。我們看到,與VHDL運行相比,所需的時間長了些,但對該設計仍取得類似的改進。僅對改變部分進行的時序仿真與對整個設計進行時序仿真相比,運行時間和模擬存儲器分別節(jié)省了6.3和6.6倍。僅將設計的改變部分代替以時序仿真網絡表然后模擬整個RTL設計,運行時間和存儲器需求仍分別縮短了3.6倍、減小了 5.5倍。
在兩個設計中,被改變模塊的覆蓋范圍完全相當,且因為更快的運行時間以及需分析的設計更小,設計調試變得更容易。也許因為需要更大的存儲器,模擬器用起來也更覺靈便。我們注意到,采用該方法論(擴展了驗證設計的可用資源并允許并行運行以進一步降低總體運行時間),可能用一款較低端的計算機(速度更慢、存儲器更少)執(zhí)行該模擬。
本文小結
本文覆蓋了利用目前可用的一種技術進行高級驗證的方法論。它并非一種革命性的方法論,而是一種大多數設計師并不完全了解或徹底把握的一種方法。這些技術過去一直用于不同類型的模擬和驗證,但可能并沒發(fā)揮出全部效力。采用層次模擬可對需要多長時間及多大努力才能完成一個設計驗證產生巨大影響。令人欣慰的是,借助本文,在未來的FPGA設計中,在降低模擬對硬件需求的同時有可能實現更快和更高效的時序仿真。
fpga相關文章:fpga是什么
存儲器相關文章:存儲器原理
評論