覆蓋sequence和sequence item
有時,在激勵生成過程中,更改sequence或sequence item的行為很有用。UVM 工廠提供了一種覆蓋機制,能夠在不更改任何測試平臺代碼且無需重新編譯的情況下將一個對象替換為另一個對象。
UVM 工廠允許工廠注冊的對象被派生類型的對象覆蓋。這意味著當使用 <class_name>::type_id::create() 方法構(gòu)造對象時,對象類型會根據(jù)被覆蓋后的類型構(gòu)造。例如,如果存在類型為 seq_a 的sequence,并且將其擴展為創(chuàng)建類型為 seq_b 的sequence,則 seq_b 可用于覆蓋 seq_a。
UVM中有兩種覆蓋方式,一種是根據(jù)類型覆蓋,一種是根據(jù)實例覆蓋。
sequence類型覆蓋
類型覆蓋意味著任何時候使用工廠構(gòu)造特定對象類型時,都會返回覆蓋類型的句柄。類型覆蓋可以與sequence一起使用,它應(yīng)該是測試中測試用例配置的一部分。一旦設(shè)置了類型工廠覆蓋,它將應(yīng)用于后續(xù)sequence代碼中構(gòu)造覆蓋sequence對象的所有位置。
sequence實例覆蓋
可以通過 UVM 測試臺組件層次結(jié)構(gòu)中的“路徑”覆蓋特定sequence。對于 uvm_components,路徑通過 create 方法的名稱和父參數(shù)定義為構(gòu)建過程的一部分。但是,sequence是 uvm_objects 并且僅在其構(gòu)造函數(shù)中使用名稱參數(shù),并且未鏈接到 uvm_component 層次結(jié)構(gòu)中。為sequence創(chuàng)建路徑的解決方案是使用 create 方法的另外兩個參數(shù)。傳遞給sequence的第三個參數(shù)可以由 get_full_name() 調(diào)用的結(jié)果填充,也可以是任意字符串。實例覆蓋然后使用此字符串與sequence的實例名稱字段連接來重新創(chuàng)建sequence的“實例路徑”。在這種情況下,必須預(yù)先考慮sequence實例覆蓋作為sequence架構(gòu)的一部分。
//?
//?The?build?method?of?a?test?class:?
//?
//?Inheritance:?
//?
//?a_seq?<-?b_seq?<-?c_seq?
//?
function?void?build_phase(?uvm_phase?phase?);?
?m_env?=?sot_env::type_id::create("m_env",?this);?
??//?Set?type?override?
?b_seq::type_id::set_type_override(c_seq::get_type());?
//?Set?instance?override?-?Note?the?"path"?argument?see?the?line?for?s_a?creation?
//?in?the?run?method?
?a_seq::type_id::set_inst_override(c_seq::get_type(),?"bob.s_a");?
endfunction:?build?
//?
//?Run?method?
//?
task?run_phase(?uvm_phase?phase?);?
?a_seq?s_a;??//?Base?type
?b_seq?s_b;??//?b_seq?extends?a_seq
?c_seq?s_c;??//?c_seq?extends?b_seq
?phase.raise_objection(?this?,?"start?a,b?and?c?sequences"?);?
//?Instance?name?is?"s_a"?-?first?argument,?
//?path?name?is?"bob"?but?is?more?usually?get_full_name()?-?third?argument?
?s_a?=?a_seq::type_id::create("s_a",,"bob");?
//?More?usual?create?call?
?s_b?=?b_seq::type_id::create("s_b");?
?s_c?=?c_seq::type_id::create("s_c");?
??s_a.start(m_env.m_a_agent.m_sequencer);??//?Results?in?c_seq?being?executed?
??s_b.start(m_env.m_a_agent.m_sequencer);??//?Results?in?c_seq?being?executed?
?s_c.start(m_env.m_a_agent.m_sequencer);?
?phase.drop_objection(?this?,?"a,b?and?c?sequences?done"?);?
endtask:?run?
sequence item的覆蓋
原則上,相同的工廠覆蓋機制可用于 sequence_items。但是,它需要使用派生類型的先驗知識來編寫driver,以便它可以將接收到的 sequence_item 轉(zhuǎn)換為正確的類型。因此,從實用的角度來看,sequence_items 不太可能被覆蓋。