第一種:start啟動
最簡單粗暴的一種方式,只需要在某個component,如my_sequencer、my_env甚至base_test的main_phase中啟動。
task fish_env::main_phase(uvm_phase phase);
fish_sequence seq; //創建seq實例
phase.raise_objection(this);
seq = fish_sequence::type_id::create("seq");
seq.start(fish_agt.sqr); //將seq發送給對應的sequencer
phase.drop_objection(this);
endtask
注:
- 如果在sequencer中啟動,唯一的區別就是start的參數變為this,即seq.start(this);
- 通常sequence不會直接發送給sequencer,而是通過virtual_sequence和virtual_sequencer;
- raise_objection和drop_objection往往伴隨sequence的啟動;
第二種:default_sequence
采用default_sequence啟動,實際上還是調用了start任務,
uvm_config_db#(uvm_object_wrapper)::set(this,
"env.fish_agt.sqr.main_phase",
"default_sequence",
case0_sequence::type_id::get());
)
或者先例化,再采用default_sequence啟動:
function void fish_case0::build_phase(uvm_phase phase);
case0_sequence cseq;
super.build_phase(phase);
cseq = new("cseq");
uvm_config_db#(uvm_sequence_base)::set(this,
"env.fish_agt.sqr.main_phase",
"default_sequence",
cseq);
endfunction
第三種:`uvm_do系列宏啟動
`uvm_do(SEQ_OR_ITEM)o
`uvm_do_pri(SEQ_OR_ITEM, PRIORITY)
`uvm_do_with(SEQ_OR_ITEM, CONSTRAINTS)
`uvm_do_pri_with(SEQ_OR_ITEM, PRIORITY, CONSTRAINTS)
`uvm_do_on(SEQ_OR_ITEM, SEQR)
`uvm_do_on_pri(SEQ_OR_ITEM, SEQR, PRIORITY)
`uvm_do_on_with(SEQ_OR_ITEM, SEQR, CONSTRAINTS)
`uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, PRIORITY, CONSTRAINTS)
uvm_do的宏有多種,根據實際情況選擇合適的宏。實際工作當中,使用較多的就是
uvm_do_on(SEQ_OR_ITEM, SEQR),第一個參數表示要發送的sequence或者item,第二個參數表示要將此sequence或者item發送給哪個sequencer。工作中有多個seq,為了實現seq的統一調度,就會使用virtual_sequence/sequencer,在vitrual_sequence 的body中例化多個sequence,使用uvm_do_on將sequencer掛載到指定sequencer上。
`uvm_declare_p_sequencer(fish_virtual_sequencer)
task fish_virtal_seq::body();
fish_sequence_1 fish_seq_1;
fish_sequence_2 fish_seq_2;
...
fish_sequence_n fish_seq_n
`uvm_do_on(fish_seq_1, p_sequencer.sqr_1);
`uvm_do_on(fish_seq_2, p_sequencer.sqr_2);
...
`uvm_do_on(fish_seq_n,p_sequencer.sqr_n);
end_task:body
如此一來,fish_seq就掛載到了fish_virtual_sequencer中某個具體的sequencer上,這是最通用的做法。但UVM的用法太靈活了,最近在工作中,我遇到,seq不會掛載到某個具體的sqr的情況,也疑惑了很久,下次和你們分享。歡迎持續關注。
第四種:uvm_create和
uvm_send
class case0_sequence extends uvm_sequence #(fish_transaction)
...
task case0_sequence::body()
`uvm_create(f_trans)
...//對transaction做處理
`uvm_send(f_trans)
endtask
uvm_create宏的作用就是實例化transaction,實例化之后,可以對其做更多的處理,處理完畢再使用`uvm_send宏發送出去。
-
UVM
+關注
關注
0文章
182瀏覽量
19238 -
sequence
+關注
關注
0文章
23瀏覽量
2873
發布評論請先 登錄
相關推薦
UVM sequence分層有哪幾種方式呢
UVM sequence分層的幾種體現
如何配置sequence的仲裁算法和優先級及中斷sequence的執行
UVM中seq.start()和default_sequence執行順序
淺談UVM之sequence/item見解(上)
![淺談<b class='flag-5'>UVM</b>之<b class='flag-5'>sequence</b>/item見解(上)](https://file.elecfans.com/web1/M00/45/D5/o4YBAFp5YuCAUvLmAAAy0q6PnwM341.png)
談UVM之sequence/item見解 sequencer特性及應用(下)
![談<b class='flag-5'>UVM</b>之<b class='flag-5'>sequence</b>/item見解 sequencer特性及應用(下)](https://file.elecfans.com/web1/M00/45/D9/pIYBAFp5ZR-AFCsHAAAKbIqMt2Q658.jpg)
UVM sequence機制中response的簡單使用
在Sequencer上啟動一個Sequence
![在Sequencer上<b class='flag-5'>啟動</b>一個<b class='flag-5'>Sequence</b>](https://file1.elecfans.com/web2/M00/89/70/wKgZomSDzaiAD7uWAAALU2b65So265.png)
如何將sequences類型添加或注冊到sequence library里呢?
![如何將sequences類型添加或注冊到<b class='flag-5'>sequence</b> library里呢?](https://file1.elecfans.com/web2/M00/A3/96/wKgaomT6x-qAWMk4AAF7iIp9Kgg610.jpg)
電氣工程師進階知識匯總:電機啟動的五種常見方式
![電氣工程師進階知識匯總:電機<b class='flag-5'>啟動</b>的五種<b class='flag-5'>常見方式</b>](https://file1.elecfans.com/web2/M00/A4/5B/wKgaomUCfoGAUfbMAAAVkqhJrTI342.jpg)
評論