UVM 虚拟类序列(virtual sequence)

文章目录

  • UVM 虚拟类序列(virtual sequence)
    • virtual sequence介绍
    • virtual存在对于sequence和sequencer的改变
    • virtual sequence示例
    • virtual sequence示例解析
    • virtual sequence建议
  • 关注作者

在上一节中,已经讲过了层次类序列(hierarchical sequence)。接下来要讲的是虚拟类序列(virtual sequence)。如何区别接下来讲到的virtual sequence与hierarchical sequence呢?

它们两者之间的共同点就是对于各个sequence的协调。它们的不同在于,hierarchical sequence面对的对象是同一个sequencer,即hierarchical sequence本身也会挂载到sequencer上面,而对于virtual sequence而言,它内部不同的sequence可以允许面向不同的sequencer种类。

virtual sequence介绍

virtual sequencer起到一个简单路由的作用

  • 伴随着底层模块的验证周期趋于尾声,在MCDF子系统验证环境集成过程中,完成了前期的结构垂直复用,就需要考虑如何复用各个模块的element sequence和hierarchical sequence。
  • 对于更上层的环境,可想而知的是,顶层的测试序列要协调的不再只是面向一个sequencer的sequence群,而是要面向多个sequencer的sequence群。那么面向不同sequencer的sequence群落在组织以后,如何分别挂接到不同的sequencer上呢?
  • 我们在之前介绍的sequence,都是面向单一的sequencer,因此挂载也很简单,即通过uvm_sequence::start()来挂载root sequence,而在内部的child sequence则可以通过宏`uvm_do来实现。
  • 如果将各个模块环境中的element sequence和hierarchical sequence都作为可以复用的sequence资源,那么就需要一个可以容纳各个sequence的容器来承载它们,同时也需要一个合适的routing sequencer来组织不同结构中的sequencer,这样的sequence和sequencer分别称之为virtual sequence和virtual sequencer。

virtual存在对于sequence和sequencer的改变

就之前的sequence和sequencer而言,它们之间的差别在于:

  • virtual sequence可以承载不同目标sequencer的sequence群落,而组织协调这些sequence的方式则类似于高层次的hierarchical sequence。virtual sequence一般只会挂载到virtual sequencer上面。
  • virtual sequencer与普通的sequencer相比有着很大的不同,它们起到了桥接到其他sequencer的作用,即virtual sequencer是一个链接所有底层sequencer句柄的地方,它是一个中心化的路由器。
  • 同时virtual sequencer本身并不会传送item数据对象,因此virtual sequencer不需要与任何的driver进行TLM连接。所以UVM用户需要在顶层的connect阶段,做好virtual sequencer中各个sequencer句柄与底层sequencer实体对象的一一对接,避免句柄悬空。

virtual sequence示例

接下来的示例用来表示element sequence/hierarchical sequence与virtual sequence的关系,以及底层sequencer与virtual sequencer的联系,同时也说明virtual sequence与virtual sequencer的挂载关系。

class mcdf_normal_seq extends uvm_sequence;`uvm_object_utils(mcdf_normal_seq)`uvm_declare_p_sequencer(mcdf_virtual_sequencer)...task body();clk_rst_seq clk_seq;reg_cfg_seq cfg_seq;data_trans_seq data_seq;fmt_slv_cfg_seq fmt_seq;// 配置formatter slave agent`uvm_do_on(fmt_seq,p_sequencer.fmt_sqr)// 打开时钟并完成复用`uvm_do_on(clk_seq,p_sequencer.cr_sqr)// 配置MCDF寄存器`uvm_do_on(cfg_seq,p_sequencer.reg_sqr)// 传送channel数据包fork`uvm_do_on(data_seq,p_sequencer.chnl_sqr0)`uvm_do_on(data_seq,p_sequencer.chnl_sqr1)`uvm_do_on(data_seq,p_sequencer.chnl_sqr2)joinendtask
endclass

m_sequencer是一个父类句柄,是uvm_seq自己预定义的
p_sequencer是一个子类句柄,在这个实例中它的类型就是mcdf_virtual_sequencer,和m_sequencer不一样,它不是预定义好的,是新鲜定义的,定义它的宏内容完成了两部。

  1. 定义了成员变量的类型mcdf_virtual_sequencer p_sequencer;
  2. 进行了句柄转换$cast(p_sequencer,m_sequencer);把m_sqr父类句柄转换成了子类句柄p_sqr。不论是m_sqr还是p_sqr都指向virtual_sqr,当然virtual_sqr是一个子类的类型
//子一级的sequencer和agent定义
//cr_master_sequencer | cr_master_agent
//reg_master_sequencer | reg_master_agent
//chnl_master_sequencer | chnl_master_agent
//fmt_slave_sequencer | fmt_slave_agent
class mcdf_virtual_sequencer extends uvm_sequencer;cr_master_sequencer cr_sqr;reg_master_sequencer reg_sqr;chnl_master_sequencer chnl_sqr0;chnl_master_sequencer chnl_sqr1;chnl_master_sequencer chnl_sqr2;fmt_slave_sequencer fmt_sqr;`uvm_component_utils(mcdf_virtual_sequencer)function new(string name,uvm_component parent);super.new(name,parent);endfunction
endclassclass mcdf_env extends uvm_env;cr_master_agent cr_agt;reg_master_agent reg_agt;chnl_master_agent chnl_agt0;chnl_master_agent chnl_agt1;chnl_master_agent chnl_agt2;fmt_slave_agent fmt_agt;mcdf_virtual_sequencer virt_sqr;`uvm_component_utils(mcdf_env)function new(string name,uvm_component parent);super.new(name,parent);endfunctionfunction void build_phase(uvm_phase phase);cr_agt=cr_master_agent::type_id::create("cr_agt",this);reg_agt=reg_master_agent::type_id::create("reg_agt",this);chnl_agt0=chnl_master_agent::type_id::create("chnl_agt",this);chnl_agt1=chnl_master_agent::type_id::create("chnl_agt",this);chnl_agt2=chnl_master_agent::type_id::create("chnl_agt",this);fmt_agt=fmt_slave_agent::type_id::create("fmt_agt",this);virt_sqr=mcdf_virtual_sequencer::type_id::create("virt_sqr",this);endfunctionfunction void connect_phase(uvm_phase phase);virt_sqr.cr_sqr=cr_agt.sqr;virt_sqr.reg_sqr=reg_agt.sqr;virt_sqr.chnl_sqr0=chnl_agt0.sqr;virt_sqr.chnl_sqr1=chnl_agt1.sqr;virt_sqr.chnl_sqr2=chnl_agt2.sqr;virt_sqr.fmt_sqr=fmt_agt.sqr;endfunction
endclassclass test1 extends uvm_test;mcdf_env e;...task run_phase(uvm_phase phase);mcdf_normal_seq seq;phase.raise_objection(phase);seq=new();seq=start(e.virt_sqr);phase.drop_objection(phase);endtask
endclass

virtual sequence示例解析

  • 对于virtual sequence mcdf_normal_seq而言,它可以承载各个子模块环境的element sequence,而通过最后挂载的virtual sequencer mcdf_virtual_sequencer中的各个底层sequencer句柄,各个element sequence可以分别挂载到对应的底层sequencer上。
  • 尽管在最后test1中,将virtual sequence挂载到了virtual sequencer上面,但是这种挂载的根本目的是为了提供给virtual sequence一个中心化的sequencer路由,而借助在virtual sequence mcdf_normal_seq中使用了宏`uvm_declare_p_sequencer,使得virtual sequence 可以使用声明后的成员变量 p_sequencer(类型为mcdf_virtual_sequencer)。来进一步回溯的virtual sequencer内部的各个sequencer句柄。
  • 在这里使用`uvm_declare_p_sequencer是较为方便的,因为这个宏在后台,可以新创建一个p_sequencer变量,而将m_sequencer的默认变量(uvm_sequencer_base类型)通过动态转换,变为类型为mcdf_virtual_sequencer的p_sequencer。
  • 只要声明的挂载sequencer类型正确,用户可以通过这个宏,完成方便的类型转换,因此才可以通过p_sequencer索引到在mcdf_virtual_sequencer中声明的各个sequencer句柄。
  • 初学者需要理解virtual sequence的协调作用,virtual sequencer的路由作用,以及在顶层中需要完成virtual sequencer同底层sequencer的连接,并最终在test层实现virtual sequence挂载到virtual sequencer上。
  • 这种中心化的协调方式,使得顶层环境在场景创建和激励控制方面更加得心应手,而且在代码后期维护中,测试场景的可读性也得到了提高。

virtual sequence建议

  1. 需要区分virtual sequence同其他普通sequence(element sequence、hierarchical sequence)。
  2. 需要区分virtual sequencer同其它底层负责传送数据对象的sequencer。
  3. 在virtual sequence中记得使用宏`uvm_declare_p_sequencer来创建正确类型的p_sequencer变量,方便接下来各个目标sequencer的索引。
  4. 在顶层环境中记得创建virtual sequencer,并且完成virtual sequencer中各个sequencer句柄与底层sequencer的跨层次连接。

关注作者

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

(22)UVM 虚拟类序列(virtual sequence)相关推荐

  1. 【UVM基础】虚序列器与虚序列(virtual sequencer与virtual sequence)快速上手指南

    文章目录 一.virtual sequence与virtual sequencer 二.virtual sequence and sequencer的产生 2.1.嵌入序列器 2.2.嵌入序列,控制序 ...

  2. UVM—virtual sequencer and virtual sequence详解

    目录 1.前言 2.virtual sequencer使用环境 3. virtual sequencer 和virtual sequence的作用 4.m_sequencer与p_sequencer ...

  3. 理解UVM中的virtual sequencer和virtual sequence

    这周看了Cliff的文章<Using UVM Virtual Sequencers & Virtual Sequences>,本文相当于是一个阅读记录. 一.什么时候需要virtu ...

  4. UVM中Virtual sequence的作用

    virtual sequence是用来实现sequence之间的同步.从字面上理解,即虚拟的sequence.虚拟的意思就是它根本就不发送transaction,它只是控制其他的sequence,起统 ...

  5. uvm中sequence和virtual sequence中objection的控制

    sequence中的objection的控制策略 在整颗UVM树中,树的结点很多,理论来说在任何组件中都可以控制objection.一般在sequence和virtual sequence中,也有在s ...

  6. UVM设计模式 (七)命令模式、三种sequence启动方式、start_item/finish_item、中介模式、virtual sequence

    本篇介绍UVM中的sequence,这是UVM中最基础的部分.对于前面介绍的uvm_callback, uvm_visitor等,很少被使用到或者也只有搭建平台的人会使用.不能认为平台的搭建更富有&q ...

  7. 虚拟试衣:Virtual Try-on Network系列工作

    虚拟试衣:Virtual Try-on Network系列工作 前言:原先在知乎上用Markdown+LaTex编辑的插件失效了,稍微修正了下长公式,短的符号就不一一修改了.最佳浏览体验见:http: ...

  8. Oracle 11g新特性之--虚拟列(Virtual Column)

    Oracle 11g新特性之--虚拟列(Virtual Column) Oracle 11G虚拟列Virtual Column介绍 在老的 Oracle 版本,当我们需要使用表达式或者一些计算公式时, ...

  9. Oracle中序列(Sequence)详解

    Oracle中序列(Sequence)详解 一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用 ...

最新文章

  1. java objectoutputstream怎么用_java序列化与ObjectOutputStream和ObjectInputStream的实例详解...
  2. ThinkPHP的安装
  3. c语言 修改密码源码,基于51单片机串口密码修改设计-(源码+电路图)
  4. Java 添加、更新和移除PDF超链接
  5. MetaModelEngine:域模型定义
  6. [Ext JS]5.9 嵌套Grid的实现及注意事项
  7. HTML十进制字符编号
  8. 台式计算机键盘示意图,电脑键盘示意图
  9. 解决react状态管理---React Query
  10. python分布式定时任务_分布式定时任务框架——python定时任务框架APScheduler扩展...
  11. 结对开发项目--石家庄地铁web版
  12. 【2021-04-23】JS逆向之某船舶物资采购平台动态cookie
  13. ubuntu串口调试工具kermit和minicom
  14. iOS11降级到iOS10.3.3/10.3.2教程
  15. spring中自带的缓存springcache
  16. 泽塔云在2022年Gartner中国区超融合市场竞争报告中被评为优秀厂商代表
  17. logstash实例简单demo
  18. Java丨即时聊天程序的实现
  19. Linux命令 - mkdir命令
  20. MySQL鲜为人知的排序方式

热门文章

  1. 华为mate40和苹果12promax哪个好 有什么区别?看了这篇再决定
  2. Python-int()函数
  3. Arcgis中属性值小数点前0不显示解决方法
  4. 关于数字档案馆建设实践与思考
  5. 数据库表可以没有主键吗?
  6. CAN通信(一)——认识CAN总线
  7. 我国各城市间航空班次
  8. 100个人排队,编号分别为1到100,每轮淘汰编号为奇数的人,然后重新编号,问最后剩下的人的初始编号是多少
  9. 承受自律的苦,不要承受自责的悔
  10. Android 上面关于不受控制3RD原生代码崩溃问题