1

次のようなレジスタ読み取りシーケンスがあります。

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 を実行する仮想シーケンスができました。

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?
    };
};

私の主な目的は、上記の例では MY_FIELD である特定のレジスタ ビット フィールドの値を読み取ることです。オリジナルを何も変更せずにそれを行う方法はありREAD_REG vr_ad_sequenceますか? READ_REG vr_ad_sequenceやむを得ない場合、読み込んだ値を呼び出し元に返すにはどうすればよいsample_vseqでしょうか?

よろしくお願いします。

4

1 に答える 1

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;
};

(現在、構文を確認できません)

于 2016-12-13T11:23:22.777 に答える