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. web自动化时,sendkeys输入长文本时浏览器响应慢或错误时处理

    在做某个测试时,要在文本框中输入大量的文本,文件内容如下: "-----BEGIN CERTIFICATE-----\nMIIBozCCAQwCAQEwDQYJKoZIhvcNAQEFBQA ...

  2. thinkCMF----使用自定义函数

    thinkCMF使用自定义函数:app 下新建 common.php

  3. Java开发之上帝之眼系列教程前言&目录

    前言 如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝的角度去观察(了解)Java体系. ...

  4. openstack 部署(Q版)-----环境准备篇

    一.环境准备 系统:centos7 cinder01 内网:192.168.10.51 外网:172.16.1.51 compute01   内网:192.168.10.52 外网:172.16.1. ...

  5. HDU 6447 - YJJ's Salesman - [树状数组优化DP][2018CCPC网络选拔赛第10题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 Problem DescriptionYJJ is a salesman who has tra ...

  6. Unity事件处理机制与NGUI事件机制

    1 Unity原生 1.1 GUI void OnGUI(){ if(GUI.Button(Rect position, string text)){ //点击后立即执行 } 1.1 Input 每个 ...

  7. FZU - 2150 Fire Game bfs+双起点枚举

    题意,10*10的地图,有若干块草地“#”,草地可以点燃,并在一秒后点燃相邻的草地.有墙壁‘·‘阻挡.初始可以从任意两点点火.问烧完最短的时间.若烧不完输出-1. 题解:由于100的数据量,直接暴力. ...

  8. Python面向对象:继承和多态

    继承与多态简介: 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写. 动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的. ...

  9. linux:正则表达式grep命令

    基本语法一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串. 一.选择:| |   竖直分隔符表示选择,例如"boy|girl"可 ...

  10. bisecting k-means

    总结 1.二分法 2.总体中的最值 bisecting k-means :在初始时将所有数据当成一个聚簇,然后递归地将最不紧凑的聚簇用2-means拆分为2个聚簇,直至满意