2016-12-12 12 views
1

から読み出したデータを取得する私はこのようなものになりレジスタ読ん配列を有する:どのようvr_ad_sequence

extend MAIN MAIN_TEST sample_vseq { 
    !reg_read : READ_REG vr_ad_sequence; 

    body() @driver.clock is first { 
     do reg_read keeping { 
      .driver == driver.reg_driver; 
      .reg_kind == MY_REGISTER; 
     }; 

     // how to get the value of MY_REGISTER.MY_FIELD from 
     // the reg_read sequence above? 
    }; 
}; 
:今

extend vr_ad_sequence_kind: [READ_REG]; 
extend READ_REG vr_ad_sequence { 
    // register to read 
    reg_kind : vr_ad_reg_kind; 
    !reg : vr_ad_reg; 

    // more fields no longer shown here 

    body() @driver.clock is { 
     var reg_item : vr_ad_reg; // reg_item gets a value from a 
            // method that returns the correct 
            // register instance from the addr_map, 
            // which I no longer want to show here 

     reg = new vr_ad_reg with { .kind = reg_kind; };  
     read_reg { .static_item == reg_item; } reg; 
    }; 
}; 

を、私は上記のvr_ad_sequenceを行う仮想配列を有し

私の主な目的は、上記の例でMY_FIELDである特定のレジスタビットフィールドの値を読み取ることです。元のREAD_REG vr_ad_sequenceに何も変更せずにそれを行う方法はありますか?それが助けられない場合は、に読み取り値を返すようにするにはどうすればよいですか?

ありがとうございます。

+0

あなたのBFMは、読み込むデータを使用してバストランザクションを更新していますか? vr_ad - > sequence_driver - > BFMチェーン全体に適切なインフラストラクチャを設定する必要があります。 –

+0

@TudorTimi:はい、実際にREAD_REGシーケンスを実行した後、vr_adはこのメッセージからわかるように、正しいバス値を取得している 'compare_and_update_body()'を実行します - 主な質問を参照してください上記。 – renvill

+0

こんにちは、シーケンスregフィールドは実際にread_regアクションによって変更されると予想されます。また、レジスタに入れる値は、vr_ad_execute_op()メソッド(BFMドライバのメソッド)によって返される値です。 vr_ad_execute_opは、compare_and_updateを呼び出す1つの値(例では0x4)とモニタを返し、別のデータ(0)で呼び出しを行うことがあります。 * .vr_ad_execute_opにブレークポイントを設定し、それが返す値を確認することをお勧めします。 – user3467290

答えて

1

読み取り後にレジスタ値を取得するには、まずバス上で読み取りが完了していることを確認する必要があります。したがって、あなたのBFMがブロックしている(しばしばそうでない)か、レスポンスが受信されたかどうかを示すフラグをシーケンスに追加します(これはBFM /ドライバから設定できます)。 次に、vr_ad_mapインスタンスから値を取得できます。 など。

body() @driver.clock is first { 
    do reg_read keeping { 
     .driver == driver.reg_driver; 
     .reg_kind == MY_REGISTER; 
    }; 
    // Wait for read response 
    sync true(reg_read != NULL and reg_read.done); 
    // Access shadow register through pointer to vr_ad_map instance 
    print addr_map.get_register_by_kind(MY_REGISTER).as_a(MY_REGISTER vr_ad_reg).MY_FIELD; 
}; 

(私は今の構文をチェックすることはできません)

+0

これは問題を解決しました。正しい構文は次のようになります。 'print get_enclosing_unit(my_env_u).addr_map.get_reg_by_kind(MY_REGISTER).as_a(MY_REGISTER vr_ad_reg).MY_FIELD;'私は仮想シーケンスに入っています。ラインは少し長いですが、その目的を果たしています。どうもありがとう! – renvill