• 正文
    • Virtual Sequences
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

【UVM COOKBOOK】Sequences||Virtual Sequences

03/26 13:40
202
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

Virtual Sequences

Virtual Sequences是使用多個sequencer控制激勵生成的sequence。由于sequence、sequencer和driver(proxy和 BFM)專注于interface,幾乎所有測試平臺都需要一個sequence來協(xié)調(diào)不同接口之間的激勵以及它們之間的交互。Virtual Sequences通常是sequence層次結構的頂層。Virtual Sequences也可以稱為master sequence或coordinator sequence。

vritual sequence和普通sequence的區(qū)別在于,目的不是要發(fā)送sequence item。相反,它會在不同的目標代理上生成和執(zhí)行sequence。為了做到這一點,它包含了目標sequencer的句柄。

//?Creating?a?useful?virtual?sequence?type:
typedef?uvm_sequence?#(uvm_sequence_item)?uvm_virtual_sequence;
//?Virtual?sequence?example:
class?my_vseq?extends?uvm_virtual_sequence;
...
//?Handles?for?the?target?sequencers:?
?a_sequencer_t?a_sequencer;?
?b_sequencer_t?b_sequencer;
?task?body();
??...
//?Start?interface?specific?sequences?on?the?appropriate?target?sequencers:
??aseq.start(?a_sequencer?,?this?);?
??bseq.start(?b_sequencer?,?this?);
?endtask?
endclass

為了使vritual sequence正常工作,必須分配sequencer句柄。通常,test類的run_phase中創(chuàng)建vritual sequence,并且對vritual sequence中的sequencer句柄進行分配。分配好了以后就可以直接在空句柄上啟動。

my_seq?vseq?=?my_seq::type_id::create("vseq");
vseq.a_sequencer?=?env.subenv1.bus_agent.sequencer;?
vseq.b_sequencer?=?env.subenv2.subsubenv1.bus_agent3.sequencer;
vseq.start(?null?);

vritual sequence有幾個變體。vritual sequence也可以在sequencer上啟動。vritual sequence不必由test執(zhí)行,它可以由封裝多個代理的環(huán)境執(zhí)行。對于一個具有許多代理的大型測試環(huán)境,可能會有幾個vritual sequence同時運行。

除了sequencer句柄,vritual sequence還可以包含其他所需要的測試平臺資源,包括寄存器模型。

推薦的vritual sequence初始化方法

為了有效地使用UVM,許多公司將測試環(huán)境的實現(xiàn)與測試用例的實現(xiàn)分開。這要么是概念分離,要么是組織分離。測試環(huán)境實現(xiàn)應該提供一個測試基類和一個vritual sequence的基類,從中可以導出測試用例。測試基類負責構建和配置驗證環(huán)境組件層次結構,并指定將運行哪個vritual sequence。測試基類還應該包含一種用于為從vritual sequence基類派生的vritual sequence分配sequencer句柄的方法。通過幾層垂直重用,到目標sequencer的分層路徑可以變得相當長。由于測試環(huán)境知道到目標sequence器的層次路徑,因此這些信息可以封裝用于所有未來的測試用例編寫者。

例如圖中的測試環(huán)境,為了解釋vritual sequence的重用性,在top下的兩個子環(huán)境有四個代理。vritual sequence積累包含了每個sequencer的句柄:

class?top_vseq_base?extends?uvm_sequence?#(uvm_sequence_item);
?`uvm_object_utils(top_vseq_base)
?uvm_sequencer?#(a_seq_item)?A1;?
?uvm_sequencer?#(a_seq_item)?A2;?
?uvm_sequencer?#(b_seq_item)?B;?
?uvm_sequencer?#(c_seq_item)?C;?
?function?new(string?name?=?"top_vseq_base");
??super.new(name);?
?endfunction
endclass:?top_vseq_base

測試基類中有一個為vritual sequence分配sequencer句柄的方法。

class?test_top_base?extends?uvm_test;
`uvm_component_utils(test_top_base)?
?env_top?m_env;
????function?new(string?name?=?"test_top_base",?uvm_component?parent?=?null);
??super.new(name,?parent);
?endfunction
?function?void?build_phase(uvm_phase?phase);
??m_env?=?env_top::type_id::create("m_env",?this);?
?endfunction:?build_phase
//?Method?to?initialize?the?virtual?sequence?handles
?function?void?init_vseq(top_vseq_base?vseq);?
??vseq.A1?=?m_env.m_env_1.m_agent_a.m_sequencer;?
??vseq.C?=?m_env.m_env_1.m_agent_c.m_sequencer;?
??vseq.A2?=?m_env.m_env_2.m_agent_a.m_sequencer;?
??vseq.B?=?m_env.m_env_2.m_agent_b.m_sequencer;
?endfunction:?init_vseq
endclass:?test_top_base

在從測試基類派生的測試用例中,在vritual sequence啟動之前調(diào)用vritual sequence初始化方法。

class?init_vseq_from_test?extends?test_top_base;
?`uvm_component_utils(init_vseq_from_test)
????function?new(string?name?=?"init_vseq_from_test",?uvm_component?parent?=?null);
??super.new(name,?parent);
?endfunction
?task?run_phase(uvm_phase?phase);
??vseq_A1_B_C?vseq?=?vseq_A1_B_C::type_id::create("vseq");?
??phase.raise_objection(this);
????????init_vseq(vseq);?//?Using?method?from?test?base?class?to?assign?sequence?handles
??vseq.start(null);?//?null?because?no?target?sequencer
??phase.drop_objection(this);
??endtask:?run_phase
endclass:?init_vseq_from_test

從virtual sequence基類中派生出的virtual sequence就不需要初始化了

class?vseq_A1_B_C?extends?top_vseq_base;
?`uvm_object_utils(vseq_A1_B_C)
?function?new(string?name?=?"vseq_A1_B_C");
??super.new(name);?
?endfunction
?task?body();
??a_seq?a?=?a_seq::type_id::create("a");?
??b_seq?b?=?b_seq::type_id::create("b");?
??c_seq?c?=?c_seq::type_id::create("c");
??a.start(A1);
??fork
???b.start(B);
???c.start(C);
??join?
?endtask:?body
endclass:?vseq_A1_B_C

用相同的辦法就能把其他測試環(huán)境的資源傳遞給vritual sequence,例如寄存器模型和config對象。

virtual sequencer-一種運行virtual sequence的替代方法

除了直接在空句柄上啟動virtual sequence,還可以在virtual sequencer內(nèi)置所需要的sequencer句柄,然后在上面啟動。這種方式存在一個問題,virtual sequencer是一個具體實現(xiàn),他和env緊密的耦合在一起,增加了垂直復用的復雜性。

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄