UVM: Starting a Sequence - IKSciting
1688
post-template-default,single,single-post,postid-1688,single-format-standard,bridge-core-2.8.7,qodef-qi--no-touch,qi-addons-for-elementor-1.7.1,qode-page-transition-enabled,ajax_fade,page_not_loaded,,qode-title-hidden,qode_grid_1300,footer_responsive_adv,qode-content-sidebar-responsive,qode-theme-ver-27.1,qode-theme-bridge,qode_header_in_grid,wpb-js-composer js-comp-ver-6.6.0,vc_responsive,elementor-default,elementor-kit-838

Starting a Sequence

UVM testbench에서 sequence를 시작하는 방법은 크게 두 가지다. 하나는 default_sequence라는 configuration database를 set 함으로써 implicitly 시작하는 방법이고, 나머지는 sequence의 start라는 method를 사용하여 explicitly 시작하는 방법이다. 결론부터 말하자면, sequence를 시작하기 위해서는 start method를 사용하는 것을 권장한다. 아래 내용 중 objection 관련 이해가 필요한 경우 Objection Mechanism 페이지를 참고하자.

default_sequence (Not Recommended)

첫 번째 방법은 test의 build_phase에서 uvm_config_db를 통해 특정 sequencer의 run_phase에 위치하는 default_sequence라는 configuration database에 시작하고자 하는 sequence를 set하는 것이다. 이렇게 set을 한 후 별도의 get 등의 작업을 하지 않아도 해당 sequence가 시작되게 된다. 이렇게 sequence를 시작하게 되면 sequence의 pre_startpost_start task에서 각각 raise_objection과 drop_objection을 해줌으로써 sequence의 진행 상황을 나타낸다. default_sequence를 사용하여 sequence 시작 시, starting_phase가 자동으로 설정되므로 아래 예제와 같이 별도의 처리 없이 그냥 사용하면 된다. 참고로 이 방법은 UVM 이전 methodology인 OVM에서 넘어온 방법이라고 한다.

class my_test extends uvm_test;

  // ...

  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    env = my_env::type_id::create("env", this);
    // starting a sequence with default_sequence
    uvm_config_db#(uvm_object_wrapper)::set(this, "env.agent.sequencer.run_phase", "default_sequence", my_sequence::type_id::get());
  endfunction: build_phase

endclass: my_test
class my_sequence extends uvm_sequence#(my_transaction);

  // ...

  virtual task pre_start();
    uvm_phase starting_phase = get_starting_phase(); // required for uvm 1.2
    starting_phase.raise_objection(this, get_type_name()); // raise an objection
  endtask: pre_start

  virtual task body();
    `uvm_info(get_type_name(), "in my_sequence", UVM_MEDIUM)
  endtask: body
 
  virtual task post_start();
    uvm_phase starting_phase = get_starting_phase(); // required for uvm 1.2
    starting_phase.drop_objection(this, get_type_name()); // drop an objection
  endtask: post_start

endclass: my_sequence
UVM_INFO @ 0: reporter [RNTST] Running test my_test...
UVM_INFO my_sequence.sv(26) @ 0: uvm_test_top.env.agent.sequencer@@my_sequence [my_sequence] in my_sequence
UVM_INFO /playground_lib/uvm-1.1d/src/base/uvm_objection.svh(1268) @ 0: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase

start Method (Recommended)

두 번째 방법은 test의 run_phase에서 시작하고자 하는 sequence를 직접 특정 sequencer에 연결하는 start method를 call하는 방법니다. raise_objection과 drop_objection은 아래 예제와 같이 test의 run_phase에서 수행하고 sequence에서는 body만을 기술해준다. 만약 sequence의 pre_startpost_start task에서 하고자 한다면, test의 run_phase에서 starting_phase를 직접 설정해주어야 한다.

class my_test extends uvm_test;

  // ...

  task run_phase(uvm_phase phase);
    super.run_phase(phase);
    phase.raise_objection(this); // raise an objection
    if (!seq.randomize()) begin
      `uvm_fatal(get_type_name(), "randomization fail");
    end
    seq.start(env.agent.sequencer); // start a sequence with start method
    phase.drop_objection(this); // drop an objection
  endtask: run_phase

endclass: my_test
class my_sequence extends uvm_sequence#(my_transaction);

  // ...

  virtual task body();
    `uvm_info(get_type_name(), "in my_sequence", UVM_MEDIUM)
  endtask: body

endclass: my_sequence
UVM_INFO @ 0: reporter [RNTST] Running test my_test...
UVM_INFO my_sequence.sv(19) @ 0: uvm_test_top.env.agent.sequencer@@seq [seq] in my_sequence
UVM_INFO /playground_lib/uvm-1.1d/src/base/uvm_objection.svh(1268) @ 0: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase

Summary

default_sequence를 이용하는 방법은 sequence가 자동으로 시작되게 되는 반면 start method를 이용하는 방법은 원하는 시점에 직접 시작하도록 관리할 수 있다. 따라서 다수의 sequence로 복잡한 sequence를 구성하기에 더 용이하다. 또한 default_sequence를 이용하면 sequence-level에서 objection control을 해주어야 하고, 이는 test-level까지 propagation이 되므로 불필요한 overhead가 발생한다. 뿐만 아니라 start method를 이용하면, sequence 뿐 아니라 test에서 objection에 대한 control을 할 수 있기 때문에 더 유연한 측면이 있다. 물론 UVM 1.2에는 propagation이 되지 않도록 설정할 수 있지만, 단순한 sequence를 작성하더라도 start method를 사용하는 것을 권장한다.

References

Tags:
10 Comments
  • kiteloop
    Posted at 11:58h, 14 September Reply

    looking good! a pity that is not in English!

    • IKS
      Posted at 11:59h, 14 September Reply

      Thanks!

  • SVLover
    Posted at 08:54h, 13 October Reply

    안녕하세요. config_db를 이용한 seq 시작은 찾기 쉽지 않던데 한국어로 이렇게 말끔히 정리된 글이 있어서 정말 놀랐고 도움이 많이 됐습니다.
    다만 얼마 전에 Synopsys 측에서 진행한 UVM 교육에서는 재사용성 때문에 config_db 방식을 추천하더라고요.
    아마 compile 없이 script만으로 runtime에서 override가 가능하기 때문인 것 같습니다.
    이 부분에서는 어떻게 생각하시나요?
    다시 한 번 좋은 글 감사합니다.

    • IKS
      Posted at 09:50h, 18 October Reply

      주요 EDA 3사(Cadence, Synopsys, Siemens) 뿐만 아니라 Doulos를 포함한 여러 회사에서 각각의 SystemVerilog/UVM coding guideline을 정의하고 있는데요. 이 내용이 회사에 따라 서로 다를 수 있습니다.

      Synopsys에서 실제로 ‘default_sequence’ method를 권장하고 있는지는 모르겠으나 Synopsys에서 판매하는 VIP(test suite)를 보면 말씀하신 것처럼 default_sequence method를 사용해서 개발된 것으로 보이네요.

      하지만 대부분의 검증 전문가는 ‘start’ method를 권장하고 있으며, 그 이유는 본문과 아래 링크를 참고 부탁 드립니다.
      ‘default_sequence’ method로 할 수 있는 것은 ‘start’ method로 모두 가능합니다.

      https://verificationacademy.com/forums/uvm/default-sequence-uvm

  • bbw अश्लील
    Posted at 15:49h, 30 March Reply

    कट्टर अश्लील qqyyooppxx.g5Sh7OqEjxI

  • व्यभिचारी पोर्न के बा
    Posted at 23:50h, 30 March Reply

    नानी के पोर्न के बा hjkvbasdfzxzz.pJELZhi1APh

  • मजेदार सेक्स पोर्न
    Posted at 19:13h, 01 April Reply

    किशोर अश्लीलता txechdyzxca.nDpd4XyfSFF

  • हेनतई, एनीमे पोर्न
    Posted at 02:35h, 03 April Reply

    शौकिया अश्लीलता hkyonet.PJi7CoEDk98

  • ladesbet milf ਪੋਰਨ
    Posted at 13:41h, 05 April Reply

    ladesbet ਮਿਸ਼ਰਤ ਪੋਰਨ ladesinemi.aKFiJAU01iS

  • ladesbet 有名人のポルノ
    Posted at 15:22h, 05 April Reply

    ladesbet ヴィンテージポルノ ladestinemi.6Bzknc4GhBn

Post A Comment