UVM中Driver,transaction,sequence,sequencer之间的关系。

UVM将原来在Driver中的数据定义部分,单独拿出来成为Transaction,主要完成数据的randomize and constrained.

在Transaction之上有增加一层sequence,它可以调用,控制同一类型的transaction。

在UVM中增减component名叫sequencer,来留下与sequence的接口,并控制sequence的启动,定义与UVM环境中其他的component的

联系。

uvm_sequence_base从uvm_sequence_item继承而来,uvm_sequence_item从uvm_transaction继承而来,uvm_transaction从

uvm_object继承而来。

一个sequence的启动有两种方式:

1)将sequence设置为某个sequencer的某个phase的default_sequence。这样随着phase的执行,sequence会自动执行。

uvm_config_db #(uvm_object_wrapper)::set(this, "env.i_agent.sqr.main_phase", "default_sequence",

case0_sequence::type_id::get() );

2)可以在任何component的task phase中直接调用start函数。

my_seq.start(sequencer);   //一般在testcase的相应phase中启动一个sequence。

//virtual sequence/sequencer的嵌套使用,sequence中包含几个sequencer,

//在这个sequence的body中,再启动其他的sequence

第二种方式,主要用在需要对不同的sequence的执行进行控制,或并行执行的时候。

uvm_sequence_base中定义有一个uvm_phase类型的starting_phase的变量,一般用在sequence的body中设置objection。

当选择使用default_sequence的方式来启动时,这个变量会被自动设置。当选择第二种方式来启动时,这个变量需要自己设置,保证不为空。

sequence启动后,开始执行内部定义的一个task——virtual task body();  一般定义为virtual类型,方便重载。

还有两个回调函数pre_body();  post_body();来供用户配置。

其中在task body()中,定义的函数有:`uvm_create(m_trans)等价于m_trans=new("m_trans");

sequencer.wait_for_grant(prior);依靠指定的优先级向sequencer发出请求。

this.pre_do();执行完后,将会对transation进行随机化。

this.mid_do();    这三个do函数为callback函数。

sequencer.send_request();

sequencer.wait_for_item_done();

this.post_do();

这些是UVM内部定义的一个task body内应该有的几个部分,但是一般可以直接new+自己的randomized+`uvm_send来完成。

wait_for_grant和pre_do又可以组成一个start_item的宏,剩下四部分还能组成finish_item的宏。整个还可以组成uvm_do系列的宏。还可以

增加很多priority的选项。

sequence作为一个object,可以在任何component上进行例化/create,再调用start启动sequence。

同一个sequencer上:

同一个sequencer上可以同时启动多个sequence,这时sequencer通过sequence/transaction的优先级进行调用。

在sequence中,可以通过lock,来使得该sequencer在执行完当前队列中的sequence后,在单独的执行接下来的sequence。直到unlock函数。

grab则表示不等队列中的sequence执行完,在当前sequence执行完之后,sequencer便单独的执行接下来的sequence,

直到ungrab,然后再执行队列中的sequence。

重载is_relevant() function可以让sequence主动放弃sequencer的使用权。

重载wait_for_relevant(),通过修改环境中的变量,可以使得sequence重新有效。

在每个sequence中,都有一个uvm_sequencer_base类型的变量,称为m_sequencer,当需要在sequence和sequencer之间传递值时,可以通过

$cast(x_sequencer, m_sequencer),然后通过x_sequencer直接调用sequencer中的值。

uvm中通过宏定义`uvm_declare_p_sequencer(my_sequencer)进行了封装。之后可以使用p_sequencer

而sequencer可以通过config_db与其他的component交换配置。

通过virtual_sequence和virtual_sequencer来进行控制

1)定义virtual sequence---不指定transaction,内部的body task直接通过sequence.start(不同sequencer)开始不同sequencer的sequence。

2)定义virtual sequencer--不指定uvm_sequence_item,内部包含多个具体针对不同transaction的sequencer

3)将virtual sequencer中的sequencer在connect_phase中,连接到具体的agent上的sequencer。

4)通过启动virtual sequencer上的sequencer,进而启动agent上的sequencer。

5)agent上的sequencer通过export与driver上的port连接。

推荐在virtual sequence上的控制objection。

sequence的task函数内部还可以再启动其他的sequence,但是必须是同一transaction类型的。但是virtual sequence可以启动其他不相同

的sequence。所以在实际的使用中,常在virtual sequencer指定default_virtual_sequence,再在其中调用需要在这个phase执行的

sequence,从而达到控制sequence的目的。

sequencer中的两个变量:

m_sequencer是uvm_sequencer_base类型的的对象。定义在sequence类内部,作为一些操作的default_sequencer。

p_sequencer相当于是m_seqencer经过$cast()处理的。是启动该sequence的那个sequencer类型的对象。可以调用更高一级的

sequencer内的新变量。UVM内部使用宏定义`uvm_declare_psequencer(my_sequencer)来声明。

sequence中的宏'uvm_send本质上是start_item和finish_item两个宏组合而成一体来的。'uvm_send不会完成

                  sequence的new和randomized

UVM中的sequence使用(一)的更多相关文章

  1. UVM中factory机制的使用

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

  2. UVM中的factory机制实现

    首先在Systemverilog中便有对于重载的最基本的支持. 1)定义task/function时,使用virtual关键字.那之后在test_case中调用时,便使用句柄指向的对象的类型而不是句柄 ...

  3. UVM中的class

    UVM中的类包括:基类(base)------------uvm_void/uvm_object/uvm_transaction/uvm_root/uvm_phase/uvm_port_base 报告 ...

  4. 【转】MySQL中增加sequence管理功能(模拟创建sequence)

    1.oracel可以直接支持sequence,但是mysql不支持sequence,因此我们要通过模拟sequence的方法在mysql中创建sequence.模拟sequence的方法:项目场景:项 ...

  5. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  6. UVM中的regmodel建模(三)

    总结一下UVM中的寄存器访问实现: 后门访问通过add_hdl_path命令来添加寄存器路径,并扩展uvm_reg_backdoor基类,定义read与write函数,最后在uvm_reg_block ...

  7. UVM中的regmodel建模(一)

    UVM中的regmodel继承自VMM的RAL(Register Abstract Layer),现在可以先将寄存器模型进行XML建模,再通过Synopsys 家的工具ralgen来直接生成regmo ...

  8. cocos2d-html5学习笔记(六)--alpha2中cc.Sequence.create中的bug

    cocos2d-html5学习笔记(六)--alpha2中cc.Sequence.create中的bug http://blog.csdn.net/allenice1/article/details/ ...

  9. oracle中创建sequence指定起始值

    oracle中创建sequence指定起始值 DECLARE V_Area_Id NUMBER; BEGIN SELECT MAX(T.Area_Id)+10 INTO V_Area_Id FROM ...

随机推荐

  1. 使用私钥.pem和SecureCRT登陆linux系统

    将密钥上传到一台自己的linux主机,下面举例文件名为 key.pemchmod 600 key.pem改写密钥格式为 OpenSSH,如果询问passphrase可以留空(直接回车)ssh-keyg ...

  2. 应该了解的Openstack命令

    整理一下Openstack的命令.下面的命令,我都是全部在机器验证过,主要是参考 redhat文档 查看rabbitmq 队列 rabbitmqctl list_queues 查看keystone的用 ...

  3. 将Linux系统的字体全改成中文

    # 修改字符集,否则可能报 input/output error的问题,因为日志里打印了中文 $ localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 $ export ...

  4. vue之计算属性和侦听器

    一.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split('').rev ...

  5. easyui---easyloader.js

    1.easyloader.js 是根据用户指定,动态加载组件,可以替换下面jqueryeasyui <!-- <script type="text/javascript" ...

  6. FZU2110 Star【计算几何】

    Overpower often go to the playground with classmates. They play and chat on the playground. One day, ...

  7. POJ3150 Candies【差分约束】

    During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher b ...

  8. 2018No-java面试知识

    1.框架 1. springboot比spring的优点? 2. Springmvc的基本流程? 3. 微服务之间调用不会慢吗? 4. 大图片和大数据库怎么存储? 5. spring事物?四大特征, ...

  9. 【紫书】Tree UVA - 548 静态建树dfs

    题意:给你中序后序 求某叶子节点使得从根到该节点权值和最小.若存在多个,输出其权值最小的那个. 题解:先建树,然后暴力dfs/bfs所有路径,取min 技巧:递归传参数,l1,r1,l2,r2, su ...

  10. POJ - 1191 棋盘分割 记忆递归 搜索dp+数学

    http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...