我们何时在uvm中使用“ typedef class xxxxx”?

时间:2018-09-18 00:36:07

标签: system-verilog uvm

我不熟悉uvm,但是试图理解和学习。

倾斜UVM时发现以下代码。

typedef class driver; 
typedef class monitor;   

class env; driver d0; 
monitor mon0;   
function init_drvr (); 
d0 = new (); // initialize endfunction   
function init_mon (); 
mon0 = new (); // initialize endfunction endclass
endfunction
endclass

特别是

typedef class driver; 
typedef class monitor;   

可能似乎声明了一些东西,但是为什么那些typedef在里面?

请让我知道我们为什么使用

typedef class driver; 

typedef class monitor;   

以及如何理解这种语法?

2 个答案:

答案 0 :(得分:1)

这被称为转发声明,并且是大多数面向对象的语言编译器的功能。用于声明尚未定义的标识符。

基本上,您要告诉编译器的是在编译范围的其他地方定义了一个名为monitordriver的类。这将在运行时解决。

有关更多信息,请参见下面的文章:(它是C ++,但适用此概念)

https://www.learncpp.com/cpp-tutorial/17-forward-declarations/

答案 1 :(得分:1)

在SystemVerilog中很少需要typedef class name。大多数编程语言都要求声明用作类型名称的标识符,然后才能对其进行语法引用。发生的一种情况是您是否具有循环类引用

class X;
  Y has_a_Y;
endclass
class Y;
  X has_a_X;
endclass

为了编译类X的代码,必须声明类Y。如果更改类的编译顺序,则X变为未知。因此,我们使用称为 forward typedef

typedef class Y;
class X;
  Y has_a_Y;
endclass

现在,只要在关闭当前作用域之前定义了类X,就可以编译类Y

但是,UVM强烈不鼓励这种编码,因为这些依赖性使代码的可重用性降低。

有时候,即使没有循环依赖关系,人们也使用正向typedef,因为他们太懒了,无法按正确的依赖关系顺序编译代码。