4

Cocotb のEndian Swapper の例を拡張して、テスト対象デバイス (DUT) によって出力されたパッケージの内容もチェックできるようにしたいと考えています。提供されているコード例では、予想される出力を生成するmodel関数が、変更されていない入力トランザクションを予想される出力のリストに追加します。このリストは、スコアボードへのパラメータとして与えられます。

スコアボードがどのように機能するか、および関数がバイト スワップされたトランザクションをmodel追加しなかった理由を理解するために、DUT に設計エラーを導入しました。endian_swapper.vhdlの次のコード ブロック内

if (byteswapping = '0') then
    stream_out_data      <= stream_in_data;
else
    stream_out_data      <= byteswap(stream_in_data);
end if;

if最初の行の条件を次のように反転しただけです(byteswapping /= '0')

テストベンチを再実行した後、テストが失敗すると予想していましたが、それでも成功します。

#  62345.03ns INFO     cocotb.regression                         regression.py:209  in handle_result                   Test Passed: wavedrom_test
#  62345.03ns INFO     cocotb.regression                         regression.py:170  in tear_down                       Passed 33 tests (0 skipped)
#  62345.03ns INFO     cocotb.regression                         regression.py:176  in tear_down                       Shutting down...

スコアボードの作成で比較機能が欠落しているようです:

self.scoreboard = Scoreboard(dut)
self.scoreboard.add_interface(self.stream_out, self.expected_output)

の呼び出しには 3 番目のパラメーターが必要ですがadd_interface、このパラメーターは文書化されていません。

では、この比較関数を指定して、パッケージの内容もチェックするにはどうすればよいでしょうか?

シミュレーションに QuestaSim を使用し、 でテストベンチを実行しましたmake SIM=questa。また、実行の間にビルド ディレクトリをクリーンアップしました。

4

2 に答える 2

3

Icarus を使用しているときに次の diff を適用すると、テストは期待どおりに失敗します。

diff --git a/examples/endian_swapper/hdl/endian_swapper.sv b/examples/endian_swapper/hdl/endian_swapper.sv
index 810d3b7..a85db0d 100644
--- a/examples/endian_swapper/hdl/endian_swapper.sv
+++ b/examples/endian_swapper/hdl/endian_swapper.sv
@@ -119,7 +119,7 @@ always @(posedge clk or negedge reset_n) begin
             stream_out_startofpacket <= stream_in_startofpacket;
             stream_out_endofpacket   <= stream_in_endofpacket;

-            if (!byteswapping)
+            if (byteswapping)
                 stream_out_data      <= stream_in_data;
             else 
                 stream_out_data      <= byteswap(stream_in_data);

Questa にはアクセスできませんが、VHDL シミュレーターで何が起こるか見てみます。私の本能はmake clean、変更を行った後に実行したことを再確認し、Questa がビルドされた RTL ライブラリを何らかの方法でキャッシュしていないことを確認することです。

add_interfaceスコアボードのメソッドに文書化されていないキーワード引数がいくつかあることは正しいです。

  • compare_fn任意の呼び出し可能な関数にすることができます
  • reorder_depthトランザクションの並べ替えを許可する整数です

compare_fn指定すると、モニターが受信したときにトランザクションで呼び出されますが、これは非常に原始的なメカニズムです。スケーラブルではなく、歴史的な理由でのみ存在します (したがって、文書化されていません)。

より良い方法は、Scoreboard クラスをサブクラス化compareし、次のプロトタイプに従ってカスタム メソッドを定義することです。

def compare(self, got, exp, log, strict_type=True):
    """
    Common function for comparing two transactions.
    Can be re-implemented by a subclass.
    """

ここでgot、 およびexpは受信および期待されるトランザクションであり、 はモニターlogのインスタンスへの参照ですlogger(より意味のあるメッセージを提供するため)。

于 2016-03-02T22:01:30.013 に答える
2

Endian Swapper サンプルの最上位は、SystemVerilog コードおよび VHDL コードとして提供されます。コンパイル オプションで指定されていない場合は、デフォルトで Verilog コードが使用されます。

私が実行した場合:

make SIM=questa TOPLEVEL_LANG=vhdl

クイック スタート ガイドに記載されているように、すべてが期待どおりに機能します。この場合、比較関数を指定する必要はありません。

于 2016-03-03T07:56:28.553 に答える