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