覆蓋sequence和sequence item
有時(shí),在激勵(lì)生成過(guò)程中,更改sequence或sequence item的行為很有用。UVM 工廠(chǎng)提供了一種覆蓋機(jī)制,能夠在不更改任何測(cè)試平臺(tái)代碼且無(wú)需重新編譯的情況下將一個(gè)對(duì)象替換為另一個(gè)對(duì)象。
UVM 工廠(chǎng)允許工廠(chǎng)注冊(cè)的對(duì)象被派生類(lèi)型的對(duì)象覆蓋。這意味著當(dāng)使用 <class_name>::type_id::create() 方法構(gòu)造對(duì)象時(shí),對(duì)象類(lèi)型會(huì)根據(jù)被覆蓋后的類(lèi)型構(gòu)造。例如,如果存在類(lèi)型為 seq_a 的sequence,并且將其擴(kuò)展為創(chuàng)建類(lèi)型為 seq_b 的sequence,則 seq_b 可用于覆蓋 seq_a。
UVM中有兩種覆蓋方式,一種是根據(jù)類(lèi)型覆蓋,一種是根據(jù)實(shí)例覆蓋。
sequence類(lèi)型覆蓋
類(lèi)型覆蓋意味著任何時(shí)候使用工廠(chǎng)構(gòu)造特定對(duì)象類(lèi)型時(shí),都會(huì)返回覆蓋類(lèi)型的句柄。類(lèi)型覆蓋可以與sequence一起使用,它應(yīng)該是測(cè)試中測(cè)試用例配置的一部分。一旦設(shè)置了類(lèi)型工廠(chǎng)覆蓋,它將應(yīng)用于后續(xù)sequence代碼中構(gòu)造覆蓋sequence對(duì)象的所有位置。
sequence實(shí)例覆蓋
可以通過(guò) UVM 測(cè)試臺(tái)組件層次結(jié)構(gòu)中的“路徑”覆蓋特定sequence。對(duì)于 uvm_components,路徑通過(guò) create 方法的名稱(chēng)和父參數(shù)定義為構(gòu)建過(guò)程的一部分。但是,sequence是 uvm_objects 并且僅在其構(gòu)造函數(shù)中使用名稱(chēng)參數(shù),并且未鏈接到 uvm_component 層次結(jié)構(gòu)中。為sequence創(chuàng)建路徑的解決方案是使用 create 方法的另外兩個(gè)參數(shù)。傳遞給sequence的第三個(gè)參數(shù)可以由 get_full_name() 調(diào)用的結(jié)果填充,也可以是任意字符串。實(shí)例覆蓋然后使用此字符串與sequence的實(shí)例名稱(chēng)字段連接來(lái)重新創(chuàng)建sequence的“實(shí)例路徑”。在這種情況下,必須預(yù)先考慮sequence實(shí)例覆蓋作為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的覆蓋
原則上,相同的工廠(chǎng)覆蓋機(jī)制可用于 sequence_items。但是,它需要使用派生類(lèi)型的先驗(yàn)知識(shí)來(lái)編寫(xiě)driver,以便它可以將接收到的 sequence_item 轉(zhuǎn)換為正確的類(lèi)型。因此,從實(shí)用的角度來(lái)看,sequence_items 不太可能被覆蓋。