2016-12-02 70 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 

我的疑問是,當我在test開始v_seq1它會調用它包含task body方法start_item()seq1是也有start_item(); start_item是否存在物理順序會產生任何問題?數據傳輸如何發生在v_seq1seq1之間? 和我的另一個問題是,「seq1.start(seqr1);」需要?

回答

-1

我認爲你的代碼中有一些排序問題。您應該首先在序列發生器上啓動序列,因此默認情況下會調用該序列的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之間沒有數據傳輸。請記住,虛擬sequnce用於協調物理序列

+0

對於您最後的問題,我想您可能不會調用start start_item(seq1.w_transh),這違反了類的封裝。你應該調用seq1.start(seqr1),並在seq1的主體中執行start_item。 –