12 Mar 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_start
, post_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_start
, post_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
- https://www.vmmcentral.org/vmartialarts/2012/11/reusable-sequences-in-uvm-2/index.html
- http://www.chipverify.com/uvm/test
- https://verificationacademy.com/forums/uvm/starting-uvm-sequence
Jung Ik Moon
Verification Engineer
kiteloop
Posted at 11:58h, 14 Septemberlooking good! a pity that is not in English!
IKS
Posted at 11:59h, 14 SeptemberThanks!
SVLover
Posted at 08:54h, 13 October안녕하세요. config_db를 이용한 seq 시작은 찾기 쉽지 않던데 한국어로 이렇게 말끔히 정리된 글이 있어서 정말 놀랐고 도움이 많이 됐습니다.
다만 얼마 전에 Synopsys 측에서 진행한 UVM 교육에서는 재사용성 때문에 config_db 방식을 추천하더라고요.
아마 compile 없이 script만으로 runtime에서 override가 가능하기 때문인 것 같습니다.
이 부분에서는 어떻게 생각하시나요?
다시 한 번 좋은 글 감사합니다.
IKS
Posted at 09:50h, 18 October주요 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कट्टर अश्लील qqyyooppxx.g5Sh7OqEjxI
व्यभिचारी पोर्न के बा
Posted at 23:50h, 30 Marchनानी के पोर्न के बा hjkvbasdfzxzz.pJELZhi1APh
मजेदार सेक्स पोर्न
Posted at 19:13h, 01 Aprilकिशोर अश्लीलता txechdyzxca.nDpd4XyfSFF
हेनतई, एनीमे पोर्न
Posted at 02:35h, 03 Aprilशौकिया अश्लीलता hkyonet.PJi7CoEDk98
ladesbet milf ਪੋਰਨ
Posted at 13:41h, 05 Aprilladesbet ਮਿਸ਼ਰਤ ਪੋਰਨ ladesinemi.aKFiJAU01iS
ladesbet 有名人のポルノ
Posted at 15:22h, 05 Aprilladesbet ヴィンテージポルノ ladestinemi.6Bzknc4GhBn