uvm_component源代码分析
文章目录
零、前言
本文参考了张强大佬的uvm白皮书,以及uvm1.1源代码的部分注释,供学习使用,话不多说
一、uvm_compoent和uvm_object的区别?
先看看uvm_compoent和uvm_object的继承关系(派生图)
我们其实可以看到uvm_component,是继承于uvm_object类型的,uvm_object类提供了一些简单的接口,以便于field_automation机制的发挥,比如copy ,pack ,print。继承于uvm_object类型的uvm_report_object则是提供了一些报告机制中的接口。
而我们要说的uvm_compoent类并不直接继承于uvm_object类型,中间加了一层,anyway,uvm_compoent组件比uvm_object多了一些更实际的东西,比如:
1、里面多了phase,拥有强大的phase机制;
2、他是树形组织结构的一个结点,任何的组件都会在树形结构里面有他的位置,如果没写写parent,就会被直接挂到uvm_root上面。
下面文章的内容将从树形结构展开,phase机制会单独开一篇文章讲,phase机制是uvm里面最精彩的机制。
二、uvm_component树形结构
我们知道 uvm_component类的new函数是function new(string name,uvm_component parent), 而对于uvm_object new函数则是function new(string name),为什么会多一个parent?
1.uvm树形结构
1.1 uvm_compoent组件为什么会有parent?
使用uvm的时候,每个组件底下会挂载一些子组件,比如env 底下挂的agent ,agent底下挂的driver,sequencer,monitor等,我们是如何描述这个组件的从属关系的呢,如果是在c++里面我们很有可能像下面这样描述
class child{
int age ;
int name;
}
class parents{
int age;
int name;
child child1 ,child2;
}
这样看起来非常合理是不是,但是假如,我想要遍历这个家族关系,那就犯了难了。我没有一个办法去遍历他的成员变量,但是uvm经常需要对组织结构进行遍历,例如在报告信息,打印拓扑结构的时候,再比如phase机制,都需要用到uvm的树形结构。
1.2 uvm如何形成树形结构
uvm提供的办法是,增加成员变量 m_parent , m_children ,m_children_by_handle,这样就能记录一个组件的父亲和孩子。遍历的时候只需要去树根,找到每一个组件的所有孩子,就可以遍历完所有结点。
class A extends uvm_compoent;
uvm_component m_children[string];
uvm_component m_children_by_handle[uvm_compoent];
uvm_component m_parent;
function