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를 시작하고 때 포함 된 task body 메소드를 호출하는 것입니다이 start_item()seq1입니다 또한 start_item()을 가짐; 실제 시퀀스에있는 start_item에 문제가 있습니까? v_seq1seq1 사이에서 데이터 전송은 어떻게 이루어 집니까? 그리고 또 다른 질문은 "seq1.start (seqr1);"입니다. 필수?

답변

-1

코드에 문제가 있다고 생각합니다. 먼저 시퀀서에서 sequnece를 시작해야합니다. 따라서 기본적으로 트랜잭션의 목적으로 패킷에 start_item 메서드가있는 해당 시퀀스의 bodu 메서드가 호출됩니다.

가상 시퀀스는 다음과 같습니다.

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 start_item (seq1.w_transh)을 호출하지 않을 수도 있습니다. 이것은 클래스의 캡슐화를 위반합니다. seq1.start (seqr1)를 호출하고 seq1의 본문에서 start_item을 수행하면됩니다. –