2013-12-09 66 views
9

我曾經在不同的VHDL項目上看到過一次又一次的問題,那就是頂級測試平臺總是很大,難以保持組織。基本上有一個主要的測試過程,其中每個測試信號都被控制或驗證,隨着時間的推移,它會變得很大。我知道你可以爲低級組件製作測試平臺,但是這個問題主要適用於頂級輸入/輸出測試。如何管理大型VHDL測試平臺

我想有某種層次結構來保持組織結構。我試過實現VHDL程序,但是編譯器非常不高興,因爲它以爲我試圖從不同的代碼段中分配信號......

VHDL中是否有任何可用的實現c編程的內聯函數的行爲?函數或#define預處理器替換宏?如果不是,你可以提出什麼建議?那會使我很高興能夠有我的頂級測試平臺如下所示:

testClockSignals(); 
testDigitialIO(); 
testDACSignals(); 
... 

具有這些功能的實現在一個單獨的文件將被錦上添花。哈哈...我只是想編寫和模擬測試平臺的C.

回答

2

分離的管理程序測試平臺的代碼是可能的,但也許是 編譯器抱怨,因爲一個程序試圖訪問沒有 信號在適用範圍 ?如果程序要控制不在範圍內的信號,那麼信號可以作爲過程的參數給出,如以下示例 procReset示例所示。

測試臺結構,多層次,便於維護,如下所示 :

--========================================================== 
-- Reusable procedures 

-- Reset generation 
procedure procReset(signal rst : out std_logic; ...) is 
... 

--========================================================== 
-- Main test control procedure in test bench 
process is 

    ------------------------------------------------------------ 
    -- General control and status 

    -- Reset device under test and related test bench modules 
    procedure genReset is 
    begin 
    procReset(rst, 100 ns); -- procReset declared elsewhere 
    -- Other code as required for complete reset 
    end procedure; 

    ------------------------------------------------------------ 
    -- Test cases 

    procedure testClockSignals is 
    begin 
    genReset; -- Apply reset to avoid test case interdependency 
    -- Test code here, and call genErr if mismatch detected 
    end procedure; 

    procedure testDigitialIO is 
    begin 
    genReset; -- Apply reset to avoid test case interdependency 
    -- Test code here, and call genErr if mismatch detected 
    end procedure; 

    procedure testDACSignals is 
    begin 
    genReset; -- Apply reset to avoid test case interdependency 
    -- Test code here, and call genErr if mismatch detected 
    end procedure; 

begin 

    ------------------------------------------------------------ 
    -- Run test cases 
    testClockSignals; 
    testDigitialIO; 
    testDACSignals; 
    -- End of simulation 
    std.env.stop(0); 
    wait; 

end process; 

有幾個層次的結構:

  1. 運行測試用例:凡手續對於每個測試用例,調用的是 。因此可以在開發和調試過程中註釋掉更多的測試用例或更多的測試用例。

  2. 測試用例:測試用例代碼本身,它被寫爲 獨立和獨立的程序。通過重置(使用 genReset過程)待測設備和相關測試 工作臺支持模塊避免了不同測試用例的運行之間的相互依賴關係 。

  3. 一般控制和狀態:可重複使用的測試臺特定 程序,例如復位被測設備和測試 工作臺支持模塊。

  4. 可重複使用的程序:不直接控制或使用測試臺 信號,但只能通過程序參數。這些程序可以位於包(其他文件)中以便在其他測試臺中重複使用 。

測試臺文件可能仍然是一個相當數量的線,因爲所有的測試 情況下的代碼仍然必須與上述方法相同的文件,如果這個 測試平臺的代碼需要直接訪問測試臺信號以便控制或檢查信號值。如果信號值可以通過自變量傳遞給測試用例 ,如procReset調用所做的那樣,那麼它可能是 將測試用例代碼移動到另一個包。

5

這是一個VHDL要求,要麼你寫過程中的過程(如@MortenZdk建議),要麼你把所有的IO都傳遞給它。

我的選擇是將我的程序只放在軟件包中,所以我使用pass all IO方法。爲了簡化傳遞的內容,我使用記錄。如果將其減少到一條記錄,則它將處於輸出狀態,並需要記錄元素的解析功能。

有關此方法的更多的想法,轉到:http://www.synthworks.com/papers/,看到報紙標題: 「加快驗證通過預先使用...」(接近底部)和 「VHDL測試平臺技術,跨越式的SystemVerilog」(在頂部)

另一個關鍵方面是對每個獨立接口使用單獨的進程。這種刺激方式可以同時生成不同的界面。這在論文中也有說明。

0

如果您對每個塊有較低級別的測試臺,那麼您可以在頂層使用它們。

通過讓關鍵的低層次測試元素實體在它們自己的權利中,您可以將它們組合到更高層次的測試項目中,這些測試項目往往只是一個小墊片,用於將引腳級別數據轉換爲最初的測試級別數據使用。例如,在圖像處理FPGA中,您可以使用一些圖像採集和數據檢查代碼來檢查算法部分。這些可以按原樣使用,或者通過一些封裝將數據提供給頂層FPGA引腳,然後將引腳輸出解碼爲原始檢查代碼所需的格式。

毫無疑問,在較低級別測試的寄存器設置代碼可以用適當擺動FPGA引腳的一些代碼封裝,並解釋引腳擺動結果。

這兩組代碼的組合允許您檢查圖像處理管道的端到端功能以及該管道的寄存器配置。