2013-12-09 9 views
9

私が何度も何度もVHDLプロジェクトで見た1つの問題は、トップレベルのテストベンチが常に大きくて整理が難しいことです。基本的には、すべてのテスト信号が制御され、検証されるメインのテストプロセスがありますが、時間が経つにつれて大きくなります。下位レベルのコンポーネントのテストベンチを作成できることはわかっていますが、この質問は主にトップレベルの入出力テストに当てはまります。大きなVHDLテストベンチを管理する方法

私は物事を整理するために何らかの種類の階層構造を持っていたいと思います。私はVHDLプロシージャを実装しようとしましたが、コンパイラはコードの異なるセクションからの信号を割り当てようとしていると思っていたので非常に不幸でした...

cプログラミングのインライン展開の動作を得るには、 #defineプリプロセッサの置き換えマクロ?そうでない場合は、何をお勧めしますか?別のファイルにこれらの関数の実装は、ケーキの上のアイシングされるだろう持っ

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

:それは次のようになり、私のトップレベルのテストベンチを持っていることができて、私は幸せになるだろう。ハハ...私はちょうどC.

答えて

2

のテストベンチは、管理可能な手順でテストベンチのコードを分離書いて、シミュレートしたいのですが可能ですが、手順が なかった信号をアクセスしようとするので、多分 コンパイラが訴え範囲内 ?スコープ内にない信号を制御するプロシージャーの場合は、 以下の例のように、 procResetの例に示すように、プロシージャーに引数として信号を与えることができます。

容易にメンテナンスのための複数のレベルを有するテストベンチ構造は、 以下に示す:

  1. ランテストケース:手順

    --========================================================== 
    -- 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

(@MortenZdkが示唆するように)プロセスにプロシージャを書くか、すべてのIOを渡すかはVHDL要件です。

私の好みは自分の手順だけをパッケージに入れることです。そのため、すべてのIOを渡す方法を使用します。渡されたものを単純化するために、私はレコードを使用します。 1つのレコードに縮小すると、それはinoutになり、レコードの要素に解決機能が必要になります。で(下の方) 「使用前を通じて検証を加速...」と 「リープフロッグのSystemVerilog、VHDLテストベンチ技術」(:

このアプローチに関するより多くのアイデアについては

、後藤:http://www.synthworks.com/papers/と題した論文を参照トップ)

別の重要な側面は、独立したインターフェイスごとに別のプロセスを使用することです。このようにして、異なるインタフェースに対して同時に刺激を生成することができます。これは論文にも示されています。

0

各ブロックの下位レベルのテストベンチがある場合は、トップレベルでテストベンチを使用できます。

重要な下位レベルのテスト要素エンティティを独自のレベルにすることで、それらを上位レベルのテスト項目に構成することができます。これは、ピンレベルのデータを元のテストレベルのデータに変換する小さなシムを使用して。

たとえば、画像処理FPGAでは、アルゴリズム部品をチェックするためのイメージソーシングおよびデータチェックコードがあります。これらは、そのまま使用することもできますし、いくつかのラッピングを使用して最上位FPGAピンにデータを提供し、ピン出力を元のチェックコードに必要な形式にデコードすることもできます。

下位レベルでテストされた疑いのないレジスタセットアップコードは、FPGAピンを適切に動かしてピンウィングリングの結果を解釈することで、より多くのコードでラップすることができます。

2組のコードを組み合わせることで、画像処理パイプラインのエンドツーエンド機能とそのパイプラインのレジスタ構成を確認できます。

関連する問題