UVM的树形结构是怎么创建的?

UVM树通过uvm_component来实现树形结构。所有的UVM树看的结点都是一个uvm_component。每一个uvm_component都有一个特点:他们在new的时候需要指定一个类型为uvm_component,名字为parent的变量。
uvm_component有phase的概念。
对于每一个uvm_component,它都有一个m_child[]用来保存它的孩子,同理也告诉这些孩子他们的父母是谁。

UVM树形结构

先来看看uvm_component.svh对应的源码:

  • m_parent/m_children[string]/m_children_by_handle[]构建了整个UVM的树形结构。

  • line1736-1739,uvm_root的name==top,但是set_name("")所有在get_full_name等函数调用的时候,就不会显示这一级。
  • 判断出来是最顶层,直接return,m_parent == null并且m_child[]也不会赋值。

  • line1748,相信看过uvm_phase就会知道这个函数。
  • line1749,判断uvm_build_phase是不是在common_domain里面。
  • line1771,通常在uvm_test_top,case的那一层parent的参数设置为null。

  • m_parent
  • m_children[]
  • m_children_by_handle[]
    构建了UVM树形结构

UVM树形结构

推荐这些文章:

uvm_common_phase.svh

run_phase extends uvm_task_phase
除了uvm_build_phase和uvm_final_phase的执行顺序是自上而下的(uvm_topdown_phase),剩下的所有不耗费时间的phase都是自下而上的(uvm_bottomup_phase)。
get_name()的返回值是除掉uvm__phase的name.
exec_func(uvm_component,uvm_phase)调用了uvm_component的函数。

...

uvm_runtime_phase.svh

问题:为什么get_name()返回的是出掉uvm_和_phase的name呢?
答:因为在new的时候的string name就是这样规范的。

扩展自uvm_task_phase

小结:

12个并行的run-time phase都扩展自uvm_task_phase
exec_task(uvm_component,uvm_phase),里面调用了uvm_component的函数。
new(string name="phase_name")的命名,使得phase.get_name()=main,而不是uvm_main_phase.
get()函数的调用使得各个...

UVM 怎么层次化引用其他component类中的属性

在UVM中我们一般是通过uvm_config_db机制来在不同的类间传递数据。但这需要在传出和传入的类中各加一段代码,
并且uvm_config_db机制较为麻烦,传递对象时还需要进行类型转换。那么能不能像SV一样通过类似$root的方式来直接
改变/获得其他类中的属性呢?答案是可以的。
类似于SV,SV中top module的上一级是$root, UVM中顶层类是uvm_root,它是所有parent = null 的类的parent类
(注意,此处不要和OOP中的父类混淆,UVM中 parent 和child不是派生关系也不一定是包含关系,仅仅是UVM中定义的一种关系)。
uvm_roo...

2.5构建-seq body task之采用uvm_create&uvm_send宏

1.采用uvm_create & uvm_send宏
(1)uvm_create/uvm_create_on调用uvm_sequence_base的create_item函数,并利用factory机制进行seq或seq_item的例化;
(2)uvm_rand_send系列宏与uvm_send宏的区别在于前者包含了trans的随机化过程,即可以省略assert(m_trans.randomize());
(3) uvm_send_pri与uvm_send相比,前者可以设定优先级;

 
 
 
 
 

...

UVM factory对用户的接口

我们知道factory的实现,其实最终都是通过uvm_factory.svh中的四个函数来实现的。factory具有全局唯一的特性。

大体上可以按照_by_name/_by_type或者是inst/all来做划分
可以在任意的地方用factory.set_inst_override_by_type的方式来调用

在uvm_component中对这几个函数重新包装了一层。

除了对path进行了full_path的拼接以外,剩余的就没有做额外的处理,直接调用的是factory的函数。
所以在uvm_component的tree的节点上其实是可以直接调用起来的。

...

日常记录(63)UVM事件、序列、寄存器

uvm_callback
可以控制组件产生的回调函数
代码:
建立了数据edata类,cb1的回调类,cb2继承于cb1的回调类,comp1注册cb1回调类,然后进行回调执行。
注意在env中,对comp1中添加了cb1和cb2的回调属性。回调进行的时候,是先父后子了。

点击查看代码
module uvm_callback_sync;
import uvm_pkg::*;
`include "uvm_macros.svh"

class edata extends uvm_object;
int data;
`uvm_object_u...

UVM my_case的创建过程

相信下面这张图就是UVM的整个tree的框架,my_case这一层是我们可见的一层,但是在uvm_root里面实例化my_case却是我们user不能看到的一层,今天我们就来说一下uvm_root这一层my_case的实例化是怎么进行的。

在run_test()函数里面调用factory机制,根据case的name创建实例。实例化的名字就叫uvm_test_top,并且name = "uvm_test_top".
参考前面讲的factory机制是怎么样创建实例的。

...

[CU]factory机制3-factory机制创建实例(create_object/component_by_type/name)(factory机制-例化)

1.factory机制创建示例的简单分析

1 class uvm_default_factory extends uvm_factory;
2
3 // Group: Registering Types
4
5 // Function: register
6 //
7 // Registers the given proxy object, ~obj~, with the factory.
8
9 extern virtual function void register (uvm_object_wrapper obj);...

日常记录(69)回顾/100

uvm的功能覆盖率收集
类定义
创建了一个类,继承于uvm_subscriber#(trans_name)
https://gitee.com/bai-mengwei/sy_uvm_tb/blob/main/inout_coverage.sv#L4
另外需要定义和实例化trans后,后面write的时候需要赋值。
实现write函数
用于外部调用,名字必须为t。(继承关系)
function void write(packet t);
pkt_cg.sa = t.sa;
pkt_cg.da = t.da;
...

uvm_config_db源代码分析

伪代码参考链接:https://www.processon.com/view/link/622af92e1efad407e98a6fca

config_db机制是UVM中在不同的component之间实现资源共享的机制,它避免了全局变量的弊端。
通篇源代码看下来,其实config_db机制也是利用了一个全局的大池子(uvm_resource_pool)来存放资源,然后进行存取。

资源存放在什么地方:uvm_resource_pool
资源以什么形式存放:uvm_resource#(type T)
资源是如何存取:uvm_resource_db#(type T)

uvm_resourc...

文章标题:UVM的树形结构是怎么创建的?
文章链接:https://www.dianjilingqu.com/4636.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>