2016-12-02 4 views
0

次のように私は、仮想シーケンスのためにいくつかのコードを書いています:仮想列クラス計画

class base_v_seq extends uvm_sequence #(uvm_sequence_item); 
seqr1 seqr1h; 
seqr2 seqr2h; 
//function new...... 
endclass 

class v_seq1 extends base_v_seq #(uvm_sequence_item); 
//... 
task body(); 
seq1 seq1h; 
seq2 seq2h; 
seq1h=seq1::type_id::create("seq1"); 

start_item(seq1.w_transh);--------------(1) 
assert(se1.w_trans.randomize); 
finish_item(seq1.w_transh); 

seq1.start(seqr1); 
endclass 

class test extends uvm_test(); 
//... 
task run_phase(); 
v_seq1.start(null); 
endtask 
endclass 

class seq1 extends uvm_sequence#(uvm_sequence_item); 
//... 
wr_trans wr_transh; 

endclass 

私の疑問は、私がtestv_seq1を始めていたときに、それはそれはseq1があるstart_item()含まtask bodyメソッドを呼び出すということですまた、start_item()を有する。物理的なシーケンスに存在するstart_itemは問題を引き起こしますか? v_seq1seq1の間でデータ転送はどのように行われますか? と私のもう一つの質問は、 "seq1.start(seqr1);"です必須?

答えて

-1

あなたのコードに問題があると思います。最初にシーケンサーでsequneceを起動する必要があります。デフォルトでは、そのシーケンスのboduメソッドが呼び出されます。ここでは、トランザクション目的のためにパケットにstart_itemメソッドがあります。

仮想シーケンスは次のようになります。

class vseq extends uvm_sequence #(uvm_sequnce_item); 
    // Handles of the Sequencers 
    a_sequencer_t a_sequencer; 
    b_sequencer_t b_sequencer; 

    seq1 aseq; 
    seq2 bseq; 

    task body(); 
    begin 
    aseq = seq1::type_id::create("aseq"); 
    bseq = seq2::type_id::create("bseq"); 

    // Start interface specific sequences on the appropriate target sequencers: 
    aseq.start(a_sequencer); 
    bseq.start(b_sequencer); 
    end 
endclass 

// In the testbench, 
vseq v1 = vseq::type_id::create("vseq"); 
v1.a_sequencer = <a_sequencer_t handle>; 
v1.b_sequencer = <b_sequencer_t handle>; 

v1.start(null); 

詳細な説明と例については、UVM Cookbookを参照してください。

0

Seq_1はアイテムを作成し、それを実行するシーケンサに直接送信します。シーケンサーは、ドライバがseq_item_port.get()を呼び出すときにアイテムが存在するかどうかをチェックし、そうであれば、シーケンサーはそのアイテムを返します。したがって、seq_1とvseqの間でデータは転送されません。仮想シーケンスが物理シーケンスを調整するために使用されることを覚えておいてください。

+0

最後の質問ではstart_item(seq1.w_transh)を呼び出すことはできません。これはクラスのカプセル化に違反します。 seq1.start(seqr1)を呼び出し、seq1の本体でstart_itemを実行するだけです。 –

関連する問題