2014-03-07 6 views
2

나는 가상 시퀀서를 가지고 있는데,이 가상 시퀀서에서 3 개의 트랜잭션을 각각 해당 시퀀서에서 병렬로 실행한다. 그래서 이런 일이 :임의 화없이 uvm_do_on을 수행하는 방법은 무엇입니까?

class top_vseqr extends uvm_seqr extends uvm_sequencer; 
    type_a_seqr seqr_a; 
    type_b_seqr seqr_b; 
    type_c_seqr seqr_c; 

... 

endclass: top_vseqr 

class simple_vseq extends uvm_sequence; 
    `uvm_declare_p_sequencer(top_vseqr) 

    type_a_seq seq_a; 
    type_b_seq seq_b; 
    type_c_seq seq_c; 

    ... 

    virtual task body(); 
    fork 
     `uvm_do_on(seq_a, p_sequencer.seqr_a) 
     `uvm_do_on(seq_b, p_sequencer.seqr_b) 
     `uvm_do_on(seq_c, p_sequencer.seqr_c) 
    join 
    endtask: body 

endclass: simple_vseq 

을하지만 지금은 내가 실행하고 테스트에 따라, 가상 시퀀서에 특정 트랜잭션을 구동 할 수 있어야합니다. 그렇게하기 위해, 나는 모니터가 인터페이스에서 트랜잭션을 볼 때마다 업데이트되는 분석 가져 오기 클래스와, 구동 될 다음 트랜잭션을 반환하는 함수를 가진다. 그래서 지금은 다음과 같이 수행 할 : 나는 'uvm_send 매크로가 있다고 본 것 UVM 문서를 통해 파고

class test extends uvm_test; 

    model model_a; 
    simple_vseq seq; 
    top_vseqr virt_seqr; 

    ... 

    task run_phase(uvm_phase phase); 

    ... 

    seq = simple_vseq::type_id::create("seq", this); 
    seq.seq_a = model_a.get_sequence(); 
    seq.start(virt_seqr); 

    ... 

    endtask: run_phase 

을하지만, 당신이 순서를 실행하는 시퀀서를 선택하는 것을 허용하지 않습니다 (즉, 나는 'uvm_send_on'또는 이와 비슷한 것을 보지 못했다). 내가 무엇을 할 수 있을지?

감사합니다.

답변

2

randomize()을 호출하지 않고도 uvm_do_on macro의 내용을 구현할 수 있습니다 (두 번째 코드에서 보여준 것처럼). 걱정할 필요가 없습니다. 시퀀서/드라이버 핸드 셰이크 메커니즘이 매우 간단하기 때문에 이는 어쨌든 일부 전문가의 권장 사례입니다. `uvm_do* 매크로는 표준이 아니며 처음부터 도움이됩니다.

0

나는 `uvm_send_on macro이 있다고 생각하지 않지만 사용할 수있는 매크로는 `uvm_create_on(SEQ_OR_ITEM, SEQR)입니다. UVM 문서에서 이것은 매크로가 호출되는 시퀀스에 부모 시퀀스를 설정하고 시퀀서를 지정된 ~ SEQR ~ 인수로 설정한다는 점을 제외하면 `uvm_create과 동일합니다. 실제로 `uvm_create macro은 기본적으로 m_sequencer를 전달하여 내부적으로 `uvm_create_on macro을 호출합니다. 당신은`uvm_create_on 호출을 사용하여 그것을 무시할 수있다.

또는 m_sequencer 변수를 설정하도록 sequence_item 객체에서 set_sequencer을 수행 할 수도 있습니다.

희망이 도움이됩니다.

0

`uvm_do_on_with가 요구 사항을 충족시킬 수 있으며 패킷에서 rand를 삭제하여 임의 화를 비활성화하거나 제약 조건을 추가 할 수도 있습니다.