UVM sequencer和sequence

文章目录

  • UVM sequencer和sequence
    • 一、概述
    • 二、sequence和item发送实例
    • 三、发送sequence/item方法建议
    • 四、发送sequence/item方法解析
  • 关注作者

一、概述

  • 了解了sequencer与driver之间传递sequence item的握手过程,同时也掌握了sequence与item之间的关系。
  • 接下来需要就sequence挂载到sequencer的常用方法做出总结,大家可以通过对这些常用方法和宏的介绍,了解到它们不同的使用场景。
  • 面对多个sequence如果需要同时挂载到sequencer时,那就面临着仲裁的需要,uvm_sequencer自带有仲裁特性,结合sequence的优先级设定,最终可以实现想要的效果。

二、sequence和item发送实例

class bus_trans extends uvm_sequence_item;rand int data;`uvm_object_utils_begin(bus_trans)`uvm_field_int(data,UVM_ALL_ON)`uvm_object_utils_end...
endclassclass child_seq extends uvm_sequence;`uvm_object_utils(child_seq)...task body();uvm_sequence_item tmp;bus_trans req;tmp=create_item(bus_trans::get_type(),m_sequencer,"req");void'($cast(req,tmp));strat_item(req);req.randomize with{data==10;};finish_item(req);endtask
endclassclass top_sequence extends uvm_sequence;`uvm_object_utils(top_sequence)...task body();uvm_sequence_item tmp;bus_trans req;child_seq cseq;cseq=child_seq::type_id::create("cseq");tmp=create_item(bus_trans::get_type,m_sequencer,"req");cseq.start(m_sequencer,this);void'($cast(req,tmp));strat_item(req);req.randomize with{data==10;};finish_item(req);endtask
endclass

挂载sequence和item的过程是不一样的
指明挂载的sequence的父类,它们的优先级是一样的。比如说,top_sequence的优先级是100,如果child_sequence没有指明父类,那它是默认的优先级,如果我告诉了它的parent sequence,那么它们整个链条上面产生的所有item,sequence优先级都跟顶层top优先级一致。

class sequencer extends uvm_sequencer;`uvm_component_utils(sequencer)...
endclassclass driver extends uvm_driver;`uvm_component_utils(driver)...task run_phase(uvm_phase phase);REQ tmp;bus_trans req;forever beginseq_item_port.get_next_item(tmp);void'($cast(req,tmp));seq_item_port.item_done();endendtask
endclassclass env extends uvm_env;sequencer sqr;driver drv;`uvm_component_utils(env)...function void build_phase(uvm_phase phase);sqr=sequencer::type_id::create("sqr",this);drv=driver::type_id::create("drv",this);endfunctionfunction void connect_phase(uvm_phase phase);drv.seq_item_port.connect(sqr.seq_item_export);endfunction
endclassclass test1 extends uvm_test;env e;`uvm_component_utils(test1)...function void build_phase(uvm_phase phase);e=env::type_id::create("e",this);endfunctiontask run_phase(uvm_phase phase);top_seq seq;phase.raise_objection(phase);seq=new();seq.start(e.sqr);phase.drop_objection(phase);endtask
endclass

三、发送sequence/item方法建议

在上述例码中,主要使用了两种方法。

第一个方法是针对将sequence挂载到sequencer上的应用。

  • uvm_sequence::start(uvm_sequencer_base sequencer,uvm_sequence_base parent_sequence=null,int this priority=-1,bit call_pre_post=1)
  • 在使用该方法的过程中,用户首先应该指明sequencer的句柄。如果该sequence是顶部的sequence,即没有更上层的sequence嵌套它,则它可以省略对第二个参数parent_sequence的指定。
  • 第三个参数的默认值-1会使得该sequence如果有parent_sequence会继承其优先级值,如果他是顶部(root)sequence,则其优先级会被自动设定为100,用户也可以自己制定优先级数值。
  • 第四个参数建议使用默认值,这样的话uvm_sequence::pre_body()和uvm_sequence::post_body()两个方法会在uvm_sequence::body()的前后执行。
  • 在上面的例子中,child_seq被嵌套到top_seq中,继而在挂载时需要指定parent_sequence;而在test一层调用top_seq时,由于它是root_sequence,则不需要再指定parent sequence,这一点用户需要注意。另外,在调用挂载sequence时,需要对这些 sequence进行例化。

第二个方法是针对将item挂载到sequencer上的应用。

  • uvm_sequencer::start_item(uvm_sequence_item item,int set_priority=-1,
    uvm_sequencer_base sequencer=null);
  • uvm_sequence::finish_item(uvm_sequence_item item,int set_priority=-1);
  • 对于start_item()的使用,第三个参数,用户需要注意是否将item挂载到"非当前parent sequence挂载的sequencer"上面,简单来说,如果你想将item和其parent sequence挂载到不同的sequencer上面,你就需要指定这个参数。
  • 在使用这一对方法时,用户除了需要记得创建item,例如通过uvm_object::create()或者uvm_sequence::create_item(),还需要在它们之间完成item的随机化处理。

四、发送sequence/item方法解析

对于一个item的完整传送,sequence要在sequencer一侧获得通过权限,才可以顺利将item发送至driver。拆解步骤如下:
1.创建item
2.通过start_item()方法等待获得sequencer的授权许可,其后执行parent sequence的方法pre_do()。
3.对item进行随机化处理。
4.通过finish_item()方法在对item进行了随机化处理之后,执行parent sequence的mid_do(),以及调用uvm_sequencer::send_request()和uvm_sequencer::wait_for_item_done()来将item发送至sequencer再完成与driver之间的握手。最后,执行了parent_sequence的post_do()。

这些完整的细节有两个部分需要注意。

  • 第一,sequence和item自身的优先级,可以决定什么时刻可以获得sequencer的授权。
  • 第二,读者需要注意到,parent sequence的虚方法pre_do()、mid_do()和post_do()会发生在发送item的过程中间。

如果对比start()方法和start_item()/finish_item(),读者首先要分清它们面向的挂载对象是不同的。

在执行start()过程中,默认情况下会执行sequence的pre_body()和post_body(),但是如果start()的参数call_pre_post=0,那么就不会这样执行,所以在一些场景中,UVM用户会奇怪为什么pre_body()和post_body()没有被执行。

pre_body()和post_body()并不是一定会被执行的,这一点同UVM的phase顺序执行是有区别的。

下面一段代码是对start()方法执行过程的自然代码描述,可以看出它们执行的顺序关系和条件:

sub_seq.pre_start()       (task)
sub_seq.pre_body()        (task) if call_pre_post==1parent_seq.pre_do(0)  (task) if parent_sequence!=nullparent_seq.mid_do(this) (func) if parent_sequence!=null
sub_seq.body               (task) YPUR STIMULUS CODEparent_seq.post_do(this) (func) if parent_sequence!=null
sub_seq.post_body()        (task) if_call_pre_post==1
sub_seq.post_start()       (task)
  • 对于pre_do()、mid_do、post_do()而言,子一级的sequence/item在被发送过程中会间接调用parent sequence的pre_do()等方法。
  • 只要在参数传递过程中,确保子一级sequence/item与parent sequence的联系,那么这些执行过程是会按照上面的描述依次执行的。
    不建议使用pre_do、mid_do、post_do,也不建议使用pre_body和post_body

下面是start_item()/finish_item()的自然代码描述,来表示执行发送item时的相关方法执行顺序:

sequencer.wait_for_grant(prior) (task)
parent_seq.pre_do(1)            (task)
parent_seq.mid_do(item)         (func)
sequencer.send_request(item)    (func)
sequencer.wait_for_item_done()  (task)
parent_seq.post_do(item)        (func)

解析:

  • 上述代码前两条属于start_item
  • 后四条属于finish_item

关注作者

  • 自述
    作者是一位中科大数字设计专业的研究生,水平有限,如有错误,请大家指正,想要与大家一同进步。
  • 经历
    曾获得国家奖学金,“高教社杯”数学建模国家二等奖等
  • 陆续更新:
    1.与UVM验证相关的system verilog后续内容;
    2.与verilog数字设计相关的一些基础模块设计,例如FIFO,UART,I2C等的书写。
    3.保研与竞赛经历等
  • 微信公众号
    欢迎大家关注公众号“数字IC小白的日常修炼”,期待与大家一同仗剑遨游数字IC世界。

(18)UVM sequencer和sequence相关推荐

  1. UVM学习笔记--sequence和sequencer

    1. UVM sequence机制的意义 UVM的sequence机制最大的作用就是将test case和testbench分离开来. 对一个项目而言,testbench是相对稳定的框架,而针对各个m ...

  2. UVM入门与进阶学习笔记16——sequencer和sequence(2)

    目录 sequence的层次化 Hierarchical Sequence Virtual Sequence Layering Sequence sequence的层次化 就水平复用而言,在MCDF各 ...

  3. (17)UVM sequencer和driver

    UVM sequencer和driver 文章目录 UVM sequencer和driver 一.概述 二.端口和方法 三.事务传输实例 四.事务传输过程分析 五.通信时序 六.握手建议 关注作者 一 ...

  4. (8)UVM Sequencer和Driver

    UVM Sequencer和Driver 概述 端口和方法 实例 通信时序 握手建议 概述 driver同sequencer之间的TLM通信采取了get模式,即由driver发起请求,从sequenc ...

  5. UVM知识点总结-sequence

    sequence及相关组件 基本的点 (1)uvm_sequence_item可以在uvm_sequece的任何阶段进行创建(2)sequence一旦活动起来就必须挂载在一个sequencer,通过这 ...

  6. UVM——Sequencer Driver

    driver和sequencer之间的通信方式采取get模式,即由driver发起请求,从sequencer一端获得item,再由sequencer将其传递至drive.driver只要可以从sequ ...

  7. UVM中的sequence

    sequence基础 1. 如果将激励放在driver的main_phase中,是可行的,但是如果要对激励作修改,那么扩展性较差,所以我们将激励改为放在sequence中去写. driver就负责驱动 ...

  8. Sequencer和Sequence

    一.sequence和item发送实例 class bus_trans extends uvm_sequence_item;rand int data;`uvm_object_utils_begin( ...

  9. 关于UVM中的Sequence(一)

    1.sequence存在的意义 sequence机制的目的是为了将激励的产生功能从driver中剥离出来.这样在不同的测试用例中,就可以将不同的sequence设置成sequencer的main_ph ...

最新文章

  1. 设计模式10——flyweight模式
  2. CWNA考试常见RF术语
  3. Python中常见的数据类型小结
  4. 系统优化怎么做-新系统上线前做什么
  5. 关于.NET中的Server push技术
  6. mysql originator_MySQL数据库事件调度(Event)
  7. JulyNovel-React
  8. Spring properties定义bean
  9. MySQL高级知识(四)——Explain
  10. Producer Consumer
  11. IBM加入OpenOffice 贡献Lotus Notes程序代码
  12. 原生Servlet 上传文件
  13. svn服务端安装、迁移教程、Eclipse切换svn连接库
  14. 完整JAVAweb项目源码,打字游戏,用jdbc在mysql保存游戏数据,完整项目源码和数据库
  15. 推荐3个免费开源的加密软件,知乎高赞
  16. 计算机端最好用的词典——GoldenDict
  17. 国产GP232RL 串口芯片完美兼容FT232RL 引脚开发资料
  18. 【Unity3d】U3d灯光
  19. Linux第7章Gdk及Cairo基础,GNOME 平台的2D图形编程(GTK,GDK,Cairo...) 简介 [转]...
  20. 老说程序员如何看产品经理,今天说说产品经理讨厌哪些程序员

热门文章

  1. ③读后感之《异类不一样的成功启示录》格拉德威尔
  2. 谈谈如何写好一份简历
  3. 秋招经验总结(私企,外企,国企)
  4. 国科大学习资料--人工智能原理与算法-2020年期末考试题解析(学长整理)
  5. Linux7清空回收站,centos rm回收站
  6. redis 主从、读写 相关
  7. 修改linux系统的时间EDT和EST为CST
  8. zuiqingchun4
  9. java imageio 内存问题_java中的内存泄漏ImageIO.read()
  10. 时间复杂度:1秒内能执行多少指令