<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 將片外調(diào)試的優(yōu)點融入FPGA片上調(diào)試之中

          將片外調(diào)試的優(yōu)點融入FPGA片上調(diào)試之中

          作者: 時間:2017-06-06 來源:網(wǎng)絡 收藏
          片上調(diào)試已出現(xiàn)了很多年,成為傳統(tǒng)復雜設計調(diào)試方法的一種常用替代方式,將虛擬測試夾具放于設計任何地方而不是采用昂貴的通用I/O引腳是可編程邏輯器件才有的性能。但片上調(diào)試也有一些不足之處,本文將討論片上調(diào)試的局限,并介紹如何把片上調(diào)試與片外深采樣存儲特性結(jié)合起來。

          隨著FPGA密度不斷增加,工程師們需要經(jīng)常使用新方法對FPGA實現(xiàn)的設計進行測試和驗證。設計人員傳統(tǒng)上使用邏輯分析儀、示波器和總線分析儀通過測試夾具來探查信號,這些測試夾具和連接器與FPGA上用戶定義的I/O引腳相連,部分引腳(最常見的是64個)被分配給調(diào)試和驗證,因此對于引腳分配,設計人員不得不在全面調(diào)試與設計實現(xiàn)之間進行協(xié)調(diào)。工程師經(jīng)常還要安排時間給引腳加上片上邏輯以便選擇信號或信號組,驅(qū)動I/O和后面的連接部分以供調(diào)試。盡管該方案可減少分配給調(diào)試的I/O引腳數(shù)量,但這項工作單調(diào)乏味,而且通常不能提供正確調(diào)試設計所需的可見性,此外測試夾具和連接器占用了寶貴的電路板空間,并會引入信號完整性和時鐘問題(特別是在高速電路板設計上),同時成本也很高。

          測試復雜FPGA設計的另一個方法是把部分FPGA邏輯資源專用于“邏輯分析”內(nèi)核,這些內(nèi)核的功能類似于傳統(tǒng)的邏輯分析儀,包括觸發(fā)、數(shù)據(jù)采集和采樣存儲,但卻位于FPGA中,可直接接觸到設計的信號和節(jié)點。邏輯分析內(nèi)核的數(shù)據(jù)存儲在FPGA本地存儲器中,經(jīng)由JTAG端口可以讀出,這樣就不必占用寶貴的通用I/O引腳。由于邏輯分析內(nèi)核位于FPGA內(nèi)部,可利用高速互連總線、快速存儲器和系統(tǒng)時鐘,而無須把這些信號引出芯片,因此可提供傳統(tǒng)調(diào)試和驗證方法中沒有的可見度和精確性。

          領先的FPGA供應商能提供方便的工具,把邏輯分析和總線分析內(nèi)核直接插入到FPGA設計中,并帶有先進的接口,支持測試和測量供應商主流邏輯分析儀的多種特性和功能。

          片上調(diào)試的局限

          這種片上調(diào)試的主要局限在于邏輯內(nèi)核本身使用了FPGA資源,更重要的是還用到了采樣存儲器。實現(xiàn)邏輯或總線分析內(nèi)核所需的邏輯非常少(一般少于FPGA邏輯單元的3%),因為這些內(nèi)核很小,所以它們可以放在被測邏輯附近不用的邏輯里。但與之相反,片上采樣存儲會占用大量片上存儲資源。片上邏輯與總線分析內(nèi)核使用FPGA內(nèi)部RAM,根據(jù)用戶定義的觸發(fā)條件存儲采集到的樣品數(shù)據(jù),僅僅32K采樣數(shù)據(jù)就需要用到FPGA的全部RAM單元。

          除此以外,時間也是調(diào)試多個系統(tǒng)問題的關鍵因素之一,長時間采樣需要更多片上存儲器。解決這個問題的一個常用方法是一旦完成調(diào)試和驗證就把邏輯分析內(nèi)核去除,盡管這釋放了FPGA設計的邏輯和存儲器資源,但也意味著邏輯分析內(nèi)核不能用在以后的設計中。

          采樣存儲器的數(shù)量由FPGA里的RAM數(shù)量決定,在某些情況下,它限制了對發(fā)生在較長時間里的復雜事件進行調(diào)試。片上調(diào)試解決方案希望通過提供先進的支持,允許用戶定義復雜觸發(fā)情況來克服這個局限,基于多事件的觸發(fā)條件讓用戶只能捕捉與特定事件相關的數(shù)據(jù),從而節(jié)約片上存儲器資源。雖然該方法可以更好地利用有限的片上存儲器,但它需要知道錯誤發(fā)生在邏輯中的什么地方,而這常常是一個不斷演進的迭代過程,要仔細研究引起錯誤的具體設計問題。因此盡管該方法可以用于調(diào)試,但它太費時,且需要大量思考和對設計的深入認識,從而大大影響了驗證能力,而且通常無法把設計“分解”成多個小部分塞入受限片上資源進行驗證。

          傳統(tǒng)測試和測量設備制造商圍繞這個問題,提供了帶有很深采樣存儲和復雜觸發(fā)能力的測試設備。當設計出現(xiàn)問題時,用戶要盡量多采集數(shù)據(jù),經(jīng)常要好幾秒,然后利用提供的工具查看數(shù)據(jù),發(fā)現(xiàn)設計中的問題,這樣能確保工程師抓到事件,但在查看數(shù)據(jù)發(fā)現(xiàn)問題時需要有耐心。

          將兩者優(yōu)點結(jié)合起來

          理想的解決方案是把傳統(tǒng)片外調(diào)試設備的擴展采樣存儲器與片上調(diào)試的優(yōu)點結(jié)合在一起。這種方法能使用戶把虛擬測試夾具放在FPGA設計任意位置,接觸內(nèi)部信號和節(jié)點,并使用傳統(tǒng)邏輯和總線分析儀設備的片外深采樣存儲器。它沒有使用片上存儲資源,相反,存儲器都在片外。

          該解決方案帶來了很多好處。用戶可以調(diào)試現(xiàn)在很多FPGA設計中常見的復雜數(shù)據(jù)交換事件,調(diào)試復雜的控制邏輯、存儲器和I/O接口、處理器系統(tǒng)以及詳細的狀態(tài)機等,這些都要求在較長時間內(nèi)捕捉樣品數(shù)據(jù)。復雜數(shù)據(jù)交換事件需要用戶捕捉所有活動以全面分析事件,當采樣存儲限制取消后,還可以再加上時間標記。

          這種新方法最有用的地方在于實現(xiàn)了片上驗證。完全調(diào)試一個FPGA設計既費時又需要大量的計算,新的組合式方案可讓用戶利用現(xiàn)實世界幾乎無窮的測試向量在片上調(diào)試FPGA。在軟件仿真環(huán)境里即使仿真10秒的功能也要用多達100天的時間,而在現(xiàn)實條件下仿真設計功能還能揭示軟件仿真環(huán)境下無法看到的異步和信號完整性等異樣情況。

          片上邏輯和總線分析內(nèi)核通常把采樣數(shù)據(jù)寫入片上存儲單元,也可對這些內(nèi)核進行修改而把數(shù)據(jù)寫到片外,但需要一個新接口。現(xiàn)在多數(shù)片上調(diào)試工具利用JTAG接口與安置在FPGA里的邏輯和總線分析內(nèi)核進行通信,這是一個相對較慢的串行連接(10MHz),但對確定邏輯和總線分析內(nèi)核參數(shù)如觸發(fā)條件來說正好,甚至對存儲在片上存儲器里的空載采樣也足夠,但是它不能支持結(jié)合片內(nèi)、片外解決方案所需要的快速片外數(shù)據(jù)傳輸率,需要一個專用高速端口,就是說要為調(diào)試分配I/O引腳,這樣就抵消了片上調(diào)試方法的一個重要優(yōu)點。有一個方法是利用諸如時分復用技術把數(shù)據(jù)壓縮到少量I/O引腳中,然后在片外將數(shù)據(jù)傳給外部采樣存儲器。分析表明,這樣只要分配20個I/O引腳就可以捕捉高達79個數(shù)據(jù)信道,并以與片上方法相當?shù)乃俾试谄鈧鬏敗?

          本文結(jié)論

          片上調(diào)試作為調(diào)試復雜FPGA設計的一個可行方法而出現(xiàn),目前正在開發(fā)的新技術以及現(xiàn)在已出現(xiàn)的技術則通過融合片外邏輯分析設備存儲單元對該方案進行改進。這樣不僅發(fā)揮了片上調(diào)試的作用,如片上實時驗證,而且提供了一種經(jīng)濟的方法可以取代目前昂貴的邏輯和數(shù)據(jù)分析設備。


          關鍵詞: FPGA

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();