(22)UVM 虚拟类序列(virtual sequence)
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不一样,它不是预定义好的,是新鲜定义的,定义它的宏内容完成了两部。
- 定义了成员变量的类型mcdf_virtual_sequencer p_sequencer;
- 进行了句柄转换$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建议
- 需要区分virtual sequence同其他普通sequence(element sequence、hierarchical sequence)。
- 需要区分virtual sequencer同其它底层负责传送数据对象的sequencer。
- 在virtual sequence中记得使用宏`uvm_declare_p_sequencer来创建正确类型的p_sequencer变量,方便接下来各个目标sequencer的索引。
- 在顶层环境中记得创建virtual sequencer,并且完成virtual sequencer中各个sequencer句柄与底层sequencer的跨层次连接。
关注作者
- 自述
作者是一位中科大数字设计专业的研究生,水平有限,如有错误,请大家指正,想要与大家一同进步。 - 经历
曾获得国家奖学金,“高教社杯”数学建模国家二等奖等 - 陆续更新:
1.与UVM验证相关的system verilog后续内容;
2.与verilog数字设计相关的一些基础模块设计,例如FIFO,UART,I2C等的书写。
3.保研与竞赛经历等 - 微信公众号
欢迎大家关注公众号“数字IC小白的日常修炼”,期待与大家一同仗剑遨游数字IC世界。
(22)UVM 虚拟类序列(virtual sequence)相关推荐
- 【UVM基础】虚序列器与虚序列(virtual sequencer与virtual sequence)快速上手指南
文章目录 一.virtual sequence与virtual sequencer 二.virtual sequence and sequencer的产生 2.1.嵌入序列器 2.2.嵌入序列,控制序 ...
- UVM—virtual sequencer and virtual sequence详解
目录 1.前言 2.virtual sequencer使用环境 3. virtual sequencer 和virtual sequence的作用 4.m_sequencer与p_sequencer ...
- 理解UVM中的virtual sequencer和virtual sequence
这周看了Cliff的文章<Using UVM Virtual Sequencers & Virtual Sequences>,本文相当于是一个阅读记录. 一.什么时候需要virtu ...
- UVM中Virtual sequence的作用
virtual sequence是用来实现sequence之间的同步.从字面上理解,即虚拟的sequence.虚拟的意思就是它根本就不发送transaction,它只是控制其他的sequence,起统 ...
- uvm中sequence和virtual sequence中objection的控制
sequence中的objection的控制策略 在整颗UVM树中,树的结点很多,理论来说在任何组件中都可以控制objection.一般在sequence和virtual sequence中,也有在s ...
- UVM设计模式 (七)命令模式、三种sequence启动方式、start_item/finish_item、中介模式、virtual sequence
本篇介绍UVM中的sequence,这是UVM中最基础的部分.对于前面介绍的uvm_callback, uvm_visitor等,很少被使用到或者也只有搭建平台的人会使用.不能认为平台的搭建更富有&q ...
- 虚拟试衣:Virtual Try-on Network系列工作
虚拟试衣:Virtual Try-on Network系列工作 前言:原先在知乎上用Markdown+LaTex编辑的插件失效了,稍微修正了下长公式,短的符号就不一一修改了.最佳浏览体验见:http: ...
- Oracle 11g新特性之--虚拟列(Virtual Column)
Oracle 11g新特性之--虚拟列(Virtual Column) Oracle 11G虚拟列Virtual Column介绍 在老的 Oracle 版本,当我们需要使用表达式或者一些计算公式时, ...
- Oracle中序列(Sequence)详解
Oracle中序列(Sequence)详解 一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用 ...
最新文章
- java objectoutputstream怎么用_java序列化与ObjectOutputStream和ObjectInputStream的实例详解...
- ThinkPHP的安装
- c语言 修改密码源码,基于51单片机串口密码修改设计-(源码+电路图)
- Java 添加、更新和移除PDF超链接
- MetaModelEngine:域模型定义
- [Ext JS]5.9 嵌套Grid的实现及注意事项
- HTML十进制字符编号
- 台式计算机键盘示意图,电脑键盘示意图
- 解决react状态管理---React Query
- python分布式定时任务_分布式定时任务框架——python定时任务框架APScheduler扩展...
- 结对开发项目--石家庄地铁web版
- 【2021-04-23】JS逆向之某船舶物资采购平台动态cookie
- ubuntu串口调试工具kermit和minicom
- iOS11降级到iOS10.3.3/10.3.2教程
- spring中自带的缓存springcache
- 泽塔云在2022年Gartner中国区超融合市场竞争报告中被评为优秀厂商代表
- logstash实例简单demo
- Java丨即时聊天程序的实现
- Linux命令 - mkdir命令
- MySQL鲜为人知的排序方式