2016-09-02 5 views
0

sequence_libraryの "select_sequence"をカスタマイズしようとしているときに直面している1つの問題を理解してください。 私は "select_sequence"をカスタマイズして、シーケンスを正確な順序で実行する必要があります。これは外部ファイルで書かれています。 そのため、私は登録されたすべてのシーケンスタイプのコンテナを踏んでいます:sequences [$]。ダイナミックキャスティングキャストが必要なシーケンスと一致する場合は、select_sequence関数から数値を返します。つまり、シーケンスを実行するライブラリを作成します。シーケンスライブラリでselect_sequenceをカスタマイズする際の問題

これは私のコードから一部です:

class cfgSeqncLib extends uvm_sequence_library #(seqItem_cfg); 
    `uvm_object_utils(cfgSeqncLib) 
    `uvm_sequence_library_utils(cfgSeqncLib) 

    rstSeqnc resetSequence; 

    function int unsigned select_sequence(int unsigned max); 
     static int unsigned counter; 
     select_sequence = counter; 
     counter++; 
     if (counter > max) 
      counter = 0; 

     foreach (sequences[i]) 
     begin 
       if ($cast(resetSequence, sequences[i])) 
       $display("%t: <><><>><>< ResetSeq: Casting IS Successfull", $time); 
      else 
       $display("%t: >>>>>>>>ResetSeq: Casting is NOT Successfull", $time); 
     end // foreach 
    endfunction 
endclass 

そして、私は使用してライブラリ内のリセットシーケンスを追加しました: `uvm_add_to_seq_lib(rstSeqnc、cfgSeqncLib)コマンドを使用します。

事は$ケースが は\ >>>>>>>> ResetSeqそれは常に印刷シミュレーション中1すなわちを返さないことである:私はそのリセットシーケンスを見ることができるにもかかわらず

を成功していません鋳造がされていますsequence_libによって実行されますが、キャストは決してtrueを返しません。 理由を説明していただけますか?

UVMコードを使用している場合

は、私は、鋳造作品よりも、次のように select_sequence機能を変更します。Simulaiton中に

function int unsigned select_sequence(int unsigned max); 
     static int unsigned counter; 
     uvm_object_wrapper wrap; 
      uvm_object obj; 
      select_sequence = counter; 
     counter++; 
     if (counter > max) 
      counter = 0; 

    foreach (sequences[i]) 
     begin 
      wrap = sequences[i]; 
       obj = factory.create_object_by_type(wrap,get_full_name(), 
      $sformatf("%s:%0d",wrap.get_type_name(),sequences_executed+1)); 

      if ($cast(resetSequence, obj)) 
       $display("%t: !!!!!!! ResetSeq: Casting IS Successfull", $time); 
      else 
       $display("%t: >>>>>>>>ResetSeq: Casting is NOT Successfull", $time); 

     end // foreach 

    endfunction 

は私が取得しています:

!!!!!!! ResetSeq: Casting IS Successfull 

私が理解できない理由でキャスティングselect_sequenceの最初のバージョンは動作しませんが、後者の場合は動作します。誰かがこれを私に説明してください。

答えて

0

uvm_add_to_seq_libマクロを使用して配列をライブラリに追加すると、配列ライブラリーとこのインスタンスに存在する配列に配列のインスタンスを追加するという感覚を与えることができます( `uvm_add_to_seq_lib(rstSeqnc、cfgSeqncLib))。後で配列ライブラリーに入れます。

しかし、そうではなく、uvm内でよく使用されるスタイルのように、マクロはuvm_object_registryというオブジェクトを追加しています。 [uvm_object_registry番号(T、"S「)TYPE_ID;]このオブジェクトは、(静的に)一度uvm_object_utilsマクロ内でクラスごとに作成されます。このメカニズムは、作成および軽量ラッパーを使用するファクトリクラス/メカニズムの中で使用されて

(uvm_object_registryクラスのインスタンスは、type_id :: create関数(または他のファクトリ作成関数)の呼び出し時にのみ作成されます。

したがって$cast(resetSequence, sequences[i])の場合、実際にresetSequence [uvm_object_registry#(resetSequence、 "resetSequence")]タイプのobject_wrapperを失敗したresetSequenceにキャストしようとしています。

resetSequence != uvm_object_registry#(resetSequence,"resetSequence") 

マクロ自体を調べると、オブジェクトラッパーを返すget_type関数を呼び出す代わりに、TYPE(シーケンス)のインスタンスを追加しないことがわかります。我々は、そのクラスのインスタンスを作成するためにファクトリ・メカニズムを使用していることを見ることができるの下

`define uvm_add_to_seq_lib(TYPE,LIBTYPE) \ 
     static bit add_``TYPE``_to_seq_lib_``LIBTYPE =\ 
      LIBTYPE::m_add_typewide_sequence(TYPE::get_type()); 

は、(ケース2)コードを調べます。これにより、環境内の型オーバーライドが確実に機能し、シーケンスライブラリはシーケンスライブラリ内の登録されたものより新しいシーケンスを使用します。例1では、たとえコードが修正されたとしても、そのクラスのインスタンスを直接使用しようとする試みは不可能です。したがって、ケース2には利点があります。

wrap = sequences[i]; 
       obj = factory.create_object_by_type(wrap,get_full_name(), 
      $sformatf("%s:%0d",wrap.get_type_name(),sequences_executed+1)); 

      if ($cast(resetSequence, obj)) 
+0

説明をいただきありがとうございます。今は明らかです。 – haykp

+0

あなたは歓迎です –

関連する問題