uvm设计分析——field automation
uvm中的field_automation主要实现了class中的基础元素的copy,compare等函数,
实现方式分为两种:1)用户注册,field系列宏;uvm内部调用static status container中的function;
2)用户自己实现do_copy,do_print等函数,调用static printer内的函数;

uvm_object中实现了print,sprint等函数,实现调度接口,调度status_container和do_function;
status_container中的function在进行filed注册的时候,被实现出来;
do_print等函数,留下对用户的hook;
不调用filed macros的class,需要在自己内部实现;
这样所有的extend的class,都包含这些general的一些function;
comparer等class中具体实现了针对不同类型的filed的操作;int,string,object,time等;
status_container,在object内部是一个static变量,内部包含comparer,printer等class的变量,所以可以在prj 任何class调用;
从而可以在用户进行filed macros register的时候,实现filed function;
总之,print等函数,实现都在相应的printer实现,但是调用分为了两种,用户自己实现do_function,或者调用field macros;
printer的实现:
内部实现了cfg与function的颗粒度分解,knobs中定义了很多打印选型,mcd表示打印输出STDOUT等;
object depths,是否打印所有的children,默认都是打开的;
object callback,打印object之前对header或者footer调用自定义函数;
type_name,prefix,field_size,决定是否打印这些附加信息;
function中,定义了各个类型的print实现;

knobs并没有被extend,printer被extend了三个,基本的print function不变,只是更新了omit函数,规定了自己的格式;
默认的printer,为table_printer,在uvm内部被显示的new之后,typedef为default printer;
三种printer,之间可以相互重载,单独封装,相互替代,这种在设计模式中,也被称为strategy,或policy;
一个最重要的变量:
1)uvm_printer_row_info m_rows[$],结构体类型,内部包含:level,name,type_name,size,value信息;
每次调用各个print_int等函数,都会将信息,push_back到该queue中;
一个最重要的function:
2)emit函数,返回值string,首先打印格式,其次遍历m_row,更新自己的返回值
被uvm_object的print函数调用;
comparer的实现:
comparer更加简单一些,config的变量更少,所以直接做在一个class中,比较之后,主要需要选择性打印信息;
config:policy,默认都是default的,reference,表示只比较指针;
uvm_deep,表示uvm的deep_copy的方式进行比较;
uvm_shallow,表示sv默认的copy方式进行比较,class内的class直接copy指针;
show_max,verbosity,severity,表示report时的配置;默认使用uvm_root的report调用;
check_type,在compare object的时候,来表示是否要比较object的类型,还是只需要值相同,默认打开;

record和pack不在描述;
copy更加简单,没有相应的控制器来实现,直接调用field_automation和do_copy函数;
field_automation实现时,会区分UVM_COPY和UVM_REFERENCE,reference,直接指针赋值;
no_reference,进行clone操作;
其中的clone函数,调用的是create函数,做创建;所有的object都必须重载该函数;
还有set_xx_local的操作,可以直接调用相应函数,set local var的值;函数定义在uvm_object,调用在field_automation;
相应的macros:
uvm_field_utils_begin(T):function __M_uvm_field_automation的定义;
uvm_field_utils_end:endfunction __m_uvm_field_automation的结束定义;
uvm_field_xx_xx(ARG,FLAG):根据uvm_action,定义case...endcase来实现copy,print,compare等函数,调用相应comparer等;
uvm automation的action包括:

应用:在class中不做field的宏调用,显示定义自己的do_function:

uvm设计分析——field automation的更多相关文章
- uvm设计分析——reg
项目中的reg_model一般只有一份,set到reg_sequence上,所以多个sequence并行启动结束的时候,reg model会成为一个共享资源. uvm_reg_field中的volat ...
- uvm设计分析——factory
uvm的factory机制,通过实例一个static类型default factory,并且通过宏将所有例化extend出来的object,component register到该factory的内部 ...
- uvm设计分析——tlm
tlm模块,用来在不同模块之间实现实时通信,主要基于两个定义在通信双方的port类来实现. 两个port之间,通过connect函数,来拿到双方的class指针,进而调用对方的function. 但是 ...
- uvm设计分析——callback
uvm_callback,设计者在进行class的function设计时,有意留下的一些hook,总是遍历某个pool中的对象: 使用者在使用时,将实现添加到某个pool中: callback中,最重 ...
- uvm设计分析——report
uvm_report实现中的类图,如下: 1)uvm_component均从uvm_report_object extend而来,其中定义了report_warning,error,info,fata ...
- (转)UVM挑战及概述
UVM的调度也具有其独特的挑战,尤其是在调试的领域.其中的一些挑战如下: 1. Phase的管理:objections and synchronization 2. 线程调试 3. Tracing i ...
- UVM挑战及概述
UVM的调度也具有其独特的挑战,尤其是在调试的领域.其中的一些挑战如下: 1. Phase的管理:objections and synchronization 2. 线程调试 3. Tracing i ...
- (转)UVM内容梗概
1. 类: 面向对象基础传统的面向对象编程与systemverilog类的特点,类的定义,成员与方法,构造函数,对象的复制和深/浅拷贝,父类/子类关系,类的继承,作用域的规则,对象的句柄以及赋值,方法 ...
- 深入浅出Automation Anywhere
Automation Anywhere是基于CLIENT-SERVER架构(control room和客户端),客户端主要是Bot Creator 和 BotRunner 主要构成: 1.WEBCR: ...
随机推荐
- instrument之Time Profiler总结
一.工欲善其事必先利其器 time profile时间分析工具用来检测应用CPU的使用情况,可以看到应用程序中各个方法正在消耗CPU时间,使用大量CPU不一定是个问题.客户端中动画就对CPU依赖就非常 ...
- B+树vs. LSM树(转)
原文:<大型网站技术架构:核心原理与案例分析>,作者:李智慧 本书前面提到,由于传统的机械磁盘具有快速顺序读写.慢速随机读写的访问特性,这个特性对磁盘存储结构和算法的选择影响甚大. 为了改 ...
- bug: '\xff' 转换成-1 而不是255
后台给的值处理后 Byte rtncode = payload[0]; 打印payload[0]是'\xff', 增加 if (rtncode ==255 ){ ....} 的判断,跳里面去了 然后用 ...
- 让对象支持with语句
一.with语句的好处 with语句的好处在于,它可以自动帮我们释放上下文,就比如文件句柄的操作, 如果你不使用with语句操作,你要先open一个文件句柄,使用完毕后要close这个文件句柄, 而使 ...
- SHOW STATUS 查看各种类型SQL执行的频率
通过 SHOW STATUS 可以提供服务器状态信息,也可以使用 mysqladmin extendedstatus 命令获得.SHOW STATUS 可以根据需要显示 session 级别的统计结果 ...
- laravel项目出现Non-static method Redis::hGet() cannot be called statically的解决方法
早上ytkah在配置laravel项目中出现Non-static method Redis::hGet() cannot be called statically错误提示,很显然这是redis出问题了 ...
- PropTypes使用
PropTypes防止后期代码传参数错误,所以加一个校验, 代码: import React, {Component,PropTypes} from 'react'; import {View, Te ...
- Python3学习之路~6.8 多态
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型 ...
- EOS account 中的 Threshold 和 weight 使用
https://eoscity.io/f/viewtopic.php?f=7&t=17 这篇文章的原文: (https://steemit.com/eos/@genereos/eos-mu ...
- xtrabackup全库还原+binlog日志还原
1.场景 mysql数据库误删某个库.误删表或者误删除数据 如下模拟图:备份策略定为每天凌晨进行全库备份,在B时间点进行了误操作以后,有两种恢复场景,一种是恢复到B时间点误操作前,一种是恢复到C时间点 ...