作者:ADI公司 Ashok Chandran,Sajeev Thomas,Saj Kapoor 基于驗證方法手冊(VMM)的驗證是非常有效的模塊級驗證環境實現方法。在系統級采用模塊級驗證組件可顯著改善驗證質量,縮短滿足系統級覆蓋率所需的時間。但是,這種方法也給系統級測試平臺帶來了一系列需要應對的挑戰,包括運行時間、隨機化質量、系統存儲器管理、多寄存器訪問接口、時鐘域和隨機穩定性。此外,模塊到系統的重用方法應當簡單、可擴展。 對于具有專有內核和系統接口的片上系統(SoC),通過匯編語言編碼進行各種外圍器件不同模式下的測試并不是一個可擴展的解決方案,也不大適合基于VMM的流程。在VMM流程中,會出現多個仿真線程同時訪問外設的情況。例如,在配置一個外設時,可能有另一個線程正在讀取同一寄存器空間以檢查中斷狀態。在匯編測試中,一個內核只有一個指令流,因此無法模擬這種行為。本文所述方法將內核替換為總線功能模型(BFM),直接驅動系統接口總線。每個模塊測試平臺在不同的線程中處理,并可以訪問相應的外圍組件。采用VMM寄存器抽象層(RAL)可確保由模塊級測試平臺遷移到系統級時,僅發生極小的行為改變。 系統測試平臺需要根據外設要求對系統組件進行編程。例如,通用異步接收機/發射機(UART)模塊在發射之前,需要配置直接存儲器訪問(DMA)引擎并且初始化存儲器。由于系統架構是所有外設的公用資源,因此提供一個統一的平臺和一些實用任務來根據外設要求配置系統會更合理。多層架構能夠確保系統支持每個外圍組件。同時各層實現了隨機化,確保系統和外設覆蓋率最大化。 環境針對性能進行了優化,支持線程管理、條件編譯和模塊級測試平臺的即插即用。因此,這是一種自下而上的方法,模塊級需要遵守一套基本但寬泛的原則,以便簡化集成。 本文將介紹傳統的系統級驗證方法,并說明改進的新方法,進一步闡述分層架構及其優勢。本文還將討論通過適當的線程和存儲器管理來改善運行時間的技術,以及利用分離編譯和多核編譯技術解決編譯時間較長問題的方法。最后,本文將涉及該測試平臺如何利用VMM錄制/回放方法來避免隨機穩定性問題,以及如何支持匯編格式的測試轉儲。 設計詳情 本文考慮的設計是一個復雜的通用SoC,它包含多個內核、一個中斷控制器、大量專有外設模塊、L1/L2/L3存儲器、存儲器控制器、DMA引擎和多個IP(知識產權)模塊。一些模塊可以通過內置的DMA引擎訪問系統存儲器,另一些模塊則使用系統DMA引擎訪問存儲器。雖然沒有明確顯示,但外設與存儲器之間有多個仲裁層。 該芯片還有多個模塊、電源和用于仲裁的系統交叉開關,如圖1的簡化示意圖所示。外部引腳通過多路復用方案由多個外設共用。 圖1 :設計概覽。 系統級驗證挑戰 系統級驗證旨在驗證系統配置與外設模式的不同組合,這會揭示許多有意義的情況,其中包括: 是否經歷了所有可能影響外設的系統配置模式下的外設模式? 1.關于連接是否存在遺漏?一旦處在特定的系統/外設配置下,該連接就可能變得可見。 2.是否所有模塊都已連接到適當的時鐘域? 3.當多個外設為獲得系統資源而競爭時,系統中是否存在帶寬問題? 4.每個DMA/外設都有對整個存儲器空間的讀寫權限嗎? 5.系統內的所有寄存器都可以訪問嗎? 6.是否會產生流量模式,從而驗證系統真正支持使用案例? 7.模塊是否采用了在系統上無效的行為,或者模塊是否看到了它不是為此而設計的行為? 由于涉及到大量組合,對于如此復雜的SoC利用定向測試來驗證上述各種情況是不可行的。 使用模塊級VMM測試平臺可在系統級提供良好的覆蓋率,但是隨著模塊數量的增加,將會帶來一系列全新的挑戰。 1.系統編程應與外設模式相關。例如,針對接收模式下的一個外設,需要在存儲器寫入模式下對DMA進行編程。當模塊級測試平臺在系統級工作時,將系統配置信息封裝在外設交易(transaction)類中,這種分層方法提供一種可在所有模塊上實現的通用方法。 2.大量模塊子環境和線程一起運行必然會拖慢仿真,因此必須對線程進行管理,確保只有活動的測試平臺占用CPU周期。 3.龐大的測試平臺和復雜的設計會導致編譯時間過長,形成嚴重的開發瓶頸,必須利用工具的高級特性來克服這一障礙。 4.寄存器訪問機制必須對所有模塊和系統測試平臺一致。VMM RAL提供了合理的解決方案,消除了寄存器訪問的物理接口在模塊級與系統級之間改變時的所有問題。 5.引起故障的測試案例必須能夠再現,以充分驗證解決辦法有效性。 多層框架 測試平臺組件在不同層工作。圖2所示的分層架構支持模塊到系統重用和系統級的即插即用功能。下面將從下至上描述各個不同的層。 圖2:分層架構。 1. VMM寄存器抽象層 此層處理基于RAL的寄存器讀寫操作。RAL對于測試平臺從模塊到系統的重用起著重要的促進作用。測試平臺獨立于物理總線協議。高級RAL交易轉化為RAL訪問層內的物理層交易。物理層交易描述物理協議(如APB、AHB和AXI等)。物理層利用RAL訪問層提供的交易驅動總線信號。 2. 系統組件層 此層管理所有系統組件,如DMA、存儲器和中斷控制器等。該層與軟件API相似,提供一套任務、對象、協議和原則用于系統管理。例如,請求n個數據項將轉換為適當的DMA編程,利用所需數據初始化存儲器并處理DMA中斷。該層還增加了數據校驗以驗證數據路徑,并向外設層顯示中斷。 3. 外設層 此層管理模塊級子環境(subenv)。它還能同步系統事件,如中斷和利用模塊級子環境進行配置等。 4. 測試層 此層利用VMM方案和多流方案發生器(MSSG)產生隨機交易。通過對外設屬性和系統配置應用限制條件,能夠產生定向隨機方案。 設計方法 本部分闡述如何實現分層結構,同時討論對系統級驗證有價值的其他內容。 內核無關的測試平臺 大部分SoC使用的內核要么是經過充分驗證的,要么僅進行了極少的更改。即使更改較大,其驗證也需要與系統級驗證完全不同的方法。因此,內核驗證應與系統驗證分開進行。測試平臺取代內核,直接驅動到系統中,如圖3所示。這種方法可提供更強大的控制能力和更多的功能,并且無需更改便可支持模塊級VMM測試平臺。由于設計開銷減少,其仿真速度更快。它還支持生成覆蓋率分級的匯編測試,以及在實際內核上運行測試。 圖3 :BFM取代內核。 從模塊級到系統級的基本類變化 基本類從vmm_data轉變為系統級基本類,如圖4所示。用于轉變的基本類是與外設和系統配置關系最密切的基本類,其參數能夠影響系統配置,包括外設方向和所有已使能的中斷等。系統特性現已嵌入此交易類中,換言之,系統層插入發生級;編碼樣式如示例1所示。以下幾個優點值得注意: 圖4 : 基本類變化。 示例1 : 外設基本類的編碼樣式。 1.可以將更多限制條件添加到隨機系統級類上,使外設模式與系統模式相關。因此,無需更改任何代碼,就能將同一組類同時用于模塊和系統測試平臺。 2.使用VMM數據宏確保類層級無縫改變。 3.唯一的peripheral_id識別系統內的外設。 4.系統基本類中的寄存器功能和vmm_opts的使用確保當中斷改變或焊盤引腳位置改變時,無需更改代碼。因此,測試平臺能夠在不同項目之間高效移植,系統中測試平臺的多個實例也能得到有效支持。 集成和管理子環境 在傳統的VMM流程中,所有模塊級子環境都被添加到頂層環境內部,然后從vmm_env調用subenv的配置、啟動和停止等。這種流程會帶來以下問題: 1.大量子環境會導致頂層環境變得異常復雜。 2.所有子環境的初始化任務混在一起導致移植更加困難。 3.子環境與性能下降之間存在相關性。 與傳統流程相同,在新方法中模塊級子環境在頂層VMM環境內分層次實例化,不同之處在于對子環境的管理由一個xactor接手。xactor產生于一個公共系統級類,它構成外設層與系統組件層之間的接口層。 xactor分階段處理子環境,就像它是在模塊級一樣。此外,系統級任務從xactor內部調用,以便配置外設所需的系統組件支持。此xactor內接收的系統中斷通知經由通知或函數/任務調用傳遞到模塊測試平臺。這種方法的優勢在于: 1.頂層無需執行子環境初始化任務。 2.使用VMM xactor迭代器可以實現即插即用功能。一旦一個xactor實例化,連接和共識(consensus)就會自動添加。頂層針對實例化的唯一變化是只需調用xactor和子環境的構建器。 3.子環境的整個階段處理完全在xactor內部進行,測試平臺的移植能力更強, 。 示例2為用于實現外設xactor的代碼示例。 示例2 :IO xactor的實現。 下面的示例3說明添加IO到系統vmm_env如何大大簡化,無需連接通道或啟動/停止xactor,這些任務將由VMM xactor迭代器完成,迭代器會尋找系統xactor基本類的衍生類。 示例3: Xactor插入env中。 測試結束由系統狀態和外設狀態決定,外設狀態由子環境所傳遞的共識決定。結束測試之前,測試平臺會查看所有活動組件的共識狀態。 指定交叉關系 在指定同一外設交易內不同類型或模式的外設交易間關系上,使用VMM多流方案是一種有效的方法。如前所述,所有交易都產生自一個公共基本類,因此它們可以通過一個公共框架傳遞。一個路由器類(產生自vmm_broadcast)將交易路由至相應的交易器,由其處理分組數據。該流程如圖5所示。 圖5:交易流程。 路由器回調函數也可以根據需要丟棄或修改分組數據。當引腳通過多路復用方案由多個模塊共用時,就需要進行修改。這種情況下,可以丟棄引腳沖突的交易。由于路由器知曉所生成的交易,因此它可以決定僅針對那些在測試中處于活動狀態的外設調用start_xactor(),從而避免不必要的線程。 功能覆蓋率 每個系統組件都會增加功能覆蓋率,這樣可以確保模塊與系統的功能覆蓋率之間有一個良好的交叉關系。由于模塊交易和xactor被重用,因此來自模塊級測試平臺的功能覆蓋率也可以在系統級重用。 流水線式RAL訪問 在多核系統中,任何一個內核都可以訪問外設寄存器,并沒有一種直接的方法來指定在RAL讀寫期間外設在哪個內核上工作。間接方法則是通過讀寫任務的data_id字段指定內核,但其缺點是data_id的這種用法無法對來源不同的模塊級環境實施。 另一種解決辦法是將交易隨機映射到任一內核,但是要求一個模塊的所有交易必須使用同一內核接口。可以通過將內核分配變為非隨機方式進行優化 。然而,即便有多個接口可用,由于RAL訪問任務execute_single()一次只能接受一個交易,其效率仍然低下。如果啟用流水線式RAL,則所有接口可以同時使用,接口的使用將得到進一步優化。 使用VMM-MAM進行存儲器管理 對于本身具有DMA引擎的IP模塊,必須直接配置系統存儲器,這將需要分配存儲器段。使用VMM存儲器分配管理器(MAM)進行系統存儲器分配,可以防止試圖訪問存儲器的不同模塊發生沖突,并且有助于模塊到系統的重用。通過改變存儲器指針,模塊測試平臺可以訪問不同的系統存儲器,但同時仍然在系統級運行。VMM-MAM還能分配具有所需存儲器對齊方式的隨機區域。 VMM錄制/回放 利用VMM錄制功能可以錄制交易,這有助于保存測試案例,即使測試平臺后來經過多次變更,保存下來的測試案例仍然可以回放。如果沒有錄制,則在線程順序發生改變的情況下,測試可能無法利用種子再現相同的方案。 使用RAL回調函數進行測試轉儲 通過附加RAL回調函數,可以將動態完成的配置打印輸出為匯編語言格式,這將生成所執行測試的一個靜態版本。回調函數可以在配置開始之前插入,然后在配置完成時刪除,如下面示例4所示。 示例4 : RAL轉儲示例。 |