前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我眼中的UVM |07.启动sequence的几种常见方式

我眼中的UVM |07.启动sequence的几种常见方式

作者头像
用户10108023
发布2022-10-28 16:34:40
1.1K0
发布2022-10-28 16:34:40
举报

07

我眼中的UVM

写在前面的话

嗨,屏幕前的你还好吗?我是不二鱼,一个不喜欢写技术博客的IC验证工程师,写这个系列,是需要很大的勇气的,因为,写得人很多,但写得好的不多,我也是如此。我一个菜鸡,敢写UVM(应该也不止UVM,我尽量把其他知识杂糅进去),我是疯了吗?至今能有比张强老师写得好的估计也没有,我之所以写,是为了促进自己进步,换了一个新的环境,使用UVM也是日常必备,所以,以写促学,写一写我眼中的UVM,我希望将自己在工作当中遇到的困惑和思考,和大家分享。也希望能和大家一起学习,相互成就,如有错误,欢迎私信我批评指正

第一种:start启动

最简单粗暴的一种方式,只需要在某个component,如my_sequencer、my_env甚至base_test的main_phase中启动。

代码语言:javascript
复制
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任务,

代码语言:javascript
复制
uvm_config_db#(uvm_object_wrapper)::set(this,
                                        "env.fish_agt.sqr.main_phase",
                                        "default_sequence",
                                         case0_sequence::type_id::get());
)

或者先例化,再采用default_sequence启动:

代码语言:javascript
复制
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系列宏启动

代码语言:javascript
复制
`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上。

代码语言:javascript
复制
`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

代码语言:javascript
复制
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宏发送出去。

好了,今天的分享就到这里了,希望对你的学习有一点帮助。持续更新,欢迎关注。觉得有帮助的朋友,希望能够点个赞鼓励一下!!你的每个鼓励都是我持续创作的动力!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 不二鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档