0

UVM SV テスト ベンチでメールボックスを使用していますが、メールボックスに書き込もうとしているときに問題に直面しています。私のコードは次のようになります。

class my_seqyuence extends uvm_sequence;

mailbox data;
some_user_defined_type mydata;

function new(string name = "my_sequence");
  super.new(name);
  data=new();
endfunction

task body();
  forever begin
  // blocking-get. program is blocked here... not why get is not returning...!
    data.get(mydata);
    decode_mydata_and_do_something_here;
  end
endtask

function void writetrans(some_user_defined_type trans);
// I used print statements with mailbox size and i can see that valid trans is arriving here and successfully writing to mailbox.
  data.try_put(trans)
endfunction 
endclass

何がうまくいかなかったのかよくわかりません...データは writetrans(*) 関数までずっと到着しており、最終的にはメールボックスにスペースがあるにもかかわらず書き込みに失敗しています。

4

2 に答える 2

3

コードにいくつかの問題がありますが、関数とタスクの呼び出しをどのように調整しているかを正確に把握していないと、何が問題なのかを知ることは困難です。

try_put()との結果を常にテストして、try_get()成功したかどうかを確認する必要があります。

より安全な型チェックのために、常にパラメーター化されたメールボックスを使用する必要があります

mailbox #(some_user_defined_type) data;
于 2014-04-12T03:40:45.663 に答える
0

1) anaylsis_export または anaylsis_imp を使用して、モニターの分析ポートに接続します。

2) メールボックスは無制限なので、 try_put( )の代わりにput()を使用してください。SystemVerilog LRM によると、try_put は無制限のメールボックスには意味がありません。これは、アイテムをメールボックスにブロックしないで入れるためにのみ使用されます。無意味な意味はわかりませんが、期待どおりに機能しないことを意味している可能性があります。

LRM から -

try_put() メソッドは、メッセージを厳密な FIFO 順でメールボックスに格納します。このメソッドは、限定されたメールボックスに対してのみ意味があります。

3) get()メソッドの前にメールボックスの num() 関数を使用して、1 より大きいことを確認します。または、try_get()を実行して、戻り値が 1 (0-> 空、- 1-> タイプの不一致)

于 2016-10-14T14:33:19.930 に答える