第一种: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浏览量
19240 -
sequence
+关注
关注
0文章
23浏览量
2874
发布评论请先 登录
相关推荐
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)
评论