uvm_component parent参数

uvm_component parent参数

UVM通过uvm_component来实现树形结构。所有的UVM树的结点本质上都是一个uvm_component。每个uvm_component都有一个特点:它们在new的时候,需要指定一个类型为uvm_component、名字是parent的变量:

function new(string name, uvm_component parent);

一般在使用时,parent通常都是this。假设A和B均派生自uvm_component,在A中实例化一个B:

class B extends uvm_component;
 …
endclass
class A extends uvm_component;
  B b_inst;
  virtual function void build_phase(uvm_phase phase);
b_inst = new("b_inst", this);
  endfunction
endclass

在b_inst实例化的时候,把this指针传递给了它,代表A是b_inst的parent。为什么要指定这么一个parent呢?一种常见的观点是,b_inst是A的成员变量,自然而然的,A就是b_inst的parent了,无需再在调用new函数的时候指定,即b_inst在实例化时可以这样写:

b_inst = new("b_inst");

这种写法看似可行,其实忽略了一点,b_inst是A的成员变量,那么在SystemVerilog仿真器一级,这种关系是确定的、可知的。假定有下面的类:

class C extends uvm_component;
   A a_inst;
   function void test();
  …
  a_inst.b_inst = …;
  a_inst.d_inst = …;
  …
   endfunction
endclass

可以在C类的test函数中使用a_inst.b_inst来得到B的值或者给B赋值,但是不能用a_inst.d_inst来给D赋值。因为D根本就不存在于A里面。

SystemVerilog仿真器会检测这种成员变量的从属关系,但是关键问题是它即使检测到了后也不会告诉A:你有一个成员变量b_inst,没有一个成员变量d_inst。A是属于用户写出来的代码,仿真器只负责检查这些代码的合理性,它不会主动发消息给代码,所以A根本就没有办法知道自己有这么一个孩子。

换个角度来说,如果在test中想得到A中所有孩子的指针,应该怎么办?读者可能会说,因为A是自己写出的,它就只有一个孩子,并且孩子的名字叫b_inst,所以可以直接使用a_inst.b_inst就可以了。问题是,假设要把整棵UVM树遍历一下,即要找到每个结点及结点的孩子的指针,那如何写呢?似乎根本就没有办法实现。

解决这个问题的方法是,当b_inst实例化的时候,指定一个parent的变量,同时在每一个component的内部维护一个数组m_children,当b_inst实例化时,就把b_inst的指针加入到A的m_children数组中。只有这样才能让A知道b_inst是自己的孩子,同时也才能让b_inst知道A是自己的父母。当b_inst有了自己的孩子时,即在b_inst的m_children中加入孩子的指针。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!