一、 p_sequencer 与m_sequencer 的关系

m_sequencer是在UVM 原码中定义的,
p_sequencer 需要我们在代码中进行宏定义才能使用,通过如下定义后, 可以直接引用p_sequencer变量。

class er_gtx_ast_seq  extends er_ast_transfer_seq;`uvm_object_param_utils(er_gtx_ast_seq)`uvm_declare_p_sequencer(er_ast_sequencer)function new(string name="er_gtx_ast_seq");super.new(name);job_desc_port = new($sformatf("%s.%s", "job_desc_port", get_inst_id()), p_sequencer);endfunction

下图描述了uvm 原码中 sequence 和 sequencer的各种集成关系,m_sequencer 是在uvm_sequence_item中例化的 uvm_sequencer_base类型的变量,p_sequencer是在用户定义的seq中定义的er_ast_sequencer类型的变量,他们的句柄类型不同,所以一些定义在er_ast_sequencer(sqr2,sqr3,sqr4)中的变量如ast_cfg,可以通过p_sequencer.ast_cfg 引用,如果通过m_sequencer.ast_cfg引用会报错找不到。
***p_sequencer与m_sequencer从本质上来说是指向同一个sequencer的实例(来自uvm 实战,怎样指向同一个实例, 可以看源码, 留作业)。

二、sequence的启动方法


1、seq.start(sqr) uvm_sequence_base中的start(), 需要传进去一个参数,指定特定的sequencer。

2、给指定的sequencer set default_sequence,UVM tree 启动执行到该seqr 的run_phase时,会调用start_default_sequence, 最终还是会调用该sequence的start()。

3、通过uvm_do 一系列的宏来执行, 最底层的宏定义是uvm_do_on_pri_with。

 do:***支持seq 或者是transaction***,当uvm_do(seq)时也是调用seq.start 函数)。on:指定sequencer,没有指定时,默认是parent_sequence的sequencer。pri:是指这个seq在其parent sequence 的多个seq中的优先级。with:可以施加对其transaction 的约束。
`define uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, PRIORITY, CONSTRAINTS) \begin \uvm_sequence_base __seq; \`uvm_create_on(SEQ_OR_ITEM, SEQR) \if (!$cast(__seq,SEQ_OR_ITEM)) start_item(SEQ_OR_ITEM, PRIORITY);\if ((__seq == null || !__seq.do_not_randomize) && !SEQ_OR_ITEM.randomize() with CONSTRAINTS ) begin \`uvm_warning("RNDFLD", "Randomization failed in uvm_do_with action") \end\if (!$cast(__seq,SEQ_OR_ITEM)) finish_item(SEQ_OR_ITEM, PRIORITY); \else __seq.start(SEQR, this, PRIORITY, 0); \end

三、关于virtual_sequencer 和 virtual sequence

在验证环境中,一般virtual sequencer 和virtual sequence 一起配合使用,他们都不产生和传递transaction,只负责调度其他的sequences 和sequencer,负责他们之间的协同工作。
在介绍virtual sqr的用法前,我们先思考一个问题,为什么要使用virtual sqr,使用它有什么好处?
我们知道,sequence不属于uvm tree的一部分,如果想引用环境中的变量要通过p_sequencer 来引用,
如果约束seq1和seq2的某些变量,需要用到寄存模型的值时。
如下图一,使用virtual_seq和virtual_sqr,只需要在virtual_sequencer中声明一个reg 的句柄就可以,然后在virtual_sequence中通过p_sequencer.reg 进行调用。

如下图二,不使用virtual_seq 和virtual_sqr, 需要在每组agent的sqr 中都定义reg 的句柄,并给其赋值,才能保证相应的sequence可以看到reg。如果有多组agent(对应不同的interface)时,这种操作会很麻烦。


  1. 这里的virtual, 并非是真的virtual,即***并没有使用virtual 关键字***,只是加了前缀 virtual_,作为识别。
class virtual_sequencer extends uvm_sequencer;
  1. sequencer 的实例化是在,agent1/agent2中完成的,然后在gtx_tb 中通过$cast,将virtual_sequencer.sqr1 指向gtx_env.agent1.sqr 的实例。

  2. virtual_sequence 的p_sequencer 指向 virtual_sequencer, 然后通过seq的几种启动方式,将seq1指到p_sequencer.sqr1, 将seq2指到p_sequencer.sqr2。

class virtual_sequence extends uvm_sequence;rand random_write_read_seq random_write_read_seq;rand write_request_seq write_request_seq;`uvm_object_utils_begin(virtual_sequence)`uvm_field_object(random_write_read_seq, UVM_ALL_ON)`uvm_field_object(write_request_seq, UVM_ALL_ON)`uvm_object_utils_end`uvm_declare_p_sequencer(virtual_sequencer)function new(string name="virtual_sequence");super.new(name);endfunction // newvirtual task body();super.body();//fork`uvm_info(get_type_name(), "Virtual sequence virtual_sequence started", UVM_MEDIUM);repeat(20) begin`uvm_do_on(random_write_read_seq, p_sequencer.sqr1)endrepeat(20) begin#2000ns;`uvm_do_on(write_request_seq, p_sequencer.sqr2)end//join#20000ns;`uvm_info(get_type_name(), "Finished body of virtual_sequence", UVM_MEDIUM);endtask : body endclass // virtual_sequence

四、virtual sequencer 如何例化,更利于环境的复用?

virtual sequencer 不同于普通的sequencer 在agent中例化,那么virtual sequencer 应该在哪一层例化才是最优解呢?

放在base test 里例化 和uvm_env 一个层级,更有利于环境的集成和复用。因为这样在环境集成时,更容易将block级的virtual sequencer 剥离出去,降低代码冗余度。

##五、test/sequence/driver 之间的handshaking

UVM中的sequencer相关推荐

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

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

  2. UVM中的TLM机制

    一.TLM中的几种术语 transport = put + get: peek 与get 类似,其数据流.控制流都相似,唯一的区别在于当get任务被调用时,FIFO内存缓存中的会少一个transact ...

  3. UVM实战 卷I学习笔记10——UVM中的寄存器模型(3)

    目录 后门访问与前门访问 *UVM中前门访问的实现 后门访问操作的定义 *使用interface进行后门访问操作 UVM中后门访问操作的实现:DPI+VPI *UVM中后门访问操作接口 后门访问与前门 ...

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

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

  5. UVM中Objection的作用

    objection机制用来控制验证平台的关闭.phase和objection与UVM验证平台息息相关,phase恰如铁轨,让UVM这趟列车在铁轨上向前运行,不会脱轨,不会跳过某一段而直接到达后一段,o ...

  6. UVM中的sequence

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

  7. UVM中factory机制的使用

    UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因 ...

  8. UVM中超时退出set_timeout函数

    在UVM中通过uvm_root的set_timeout函数可以设置超时时间: //base_test.sv 18 function void base_test::build_phase(uvm_ph ...

  9. UVM 中的消息机制

    UVM消息属性 UVM 中的消息有三种属性,分别是:严重度(severity).冗余度(verbosity).以及消息的关联行为,此外还有消息的标签 ID.UVM 的消息机制基于该三种属性和标签 ID ...

最新文章

  1. 在Ubuntu 16.4.3 LTS x86_64上安装PyCharm社区版笔记
  2. Windows 10版星巴克应用现身官网
  3. 基于WebSocket协议的iOS端即时聊天
  4. Win10重装系统后更改用户文件夹名称的方法
  5. java与html5的区别_HTML4和HTML5的区别
  6. 物联网应用领域-物联网智能安全始于产品开发
  7. 【Python】Smtplib正确模拟发送QQ邮件
  8. 十大经典排序C++实现及动图演示
  9. Intel 64/x86_64/IA-32/x86处理器通用寄存器 (1) - 32位通用寄存器
  10. 关于Autorun.inf文件
  11. 淘宝中的一些基本CSS代码
  12. oracle jde优势介绍,Oracle JDE EnterpriseOne模块的详细功能介绍
  13. 城市公交类毕业论文文献都有哪些?
  14. 日期抽象数据类型设计与实现作业总结
  15. 右键菜单项删除 pycharm vs
  16. 《2018中国区块链行业发展白皮书》发布
  17. 工作一周随笔记———一个即将踏入编程的少年
  18. 百度地图常用的几个webAPI(中文地址转经纬度,经纬度转中文地址)
  19. 百度文库 -3ds max
  20. Python中常用最神秘的函数! lambda 函数深度总结!

热门文章

  1. (Animator详解一)mixamo动画导入Unity的一些配置
  2. 把Colab运行后生成的文件保存到Google drive
  3. Apple iPhone
  4. (已解决)windows和linux系统中使用 pycharm 时设置打印字体颜色和背景色
  5. 用html制作验证码英文数字,基于javascript实现数字英文验证码
  6. CentOS离线 + 在线安装telnet(rpm包安装)
  7. 第一次开发EOS区块链的经验总结
  8. 【python】必应api获取壁纸信息+修改桌面+倒计时显示
  9. webRtc-streamer简单使用-备份
  10. edvac是商用计算机吗,计算机基础知识78228