System verilog 我们什么时候使用;typedef类别xxxxx“;在uvm中?

System verilog 我们什么时候使用;typedef类别xxxxx“;在uvm中?,system-verilog,uvm,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 endfunc

我不熟悉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;   

如何理解这种语法?

这被称为向前声明,是大多数面向对象语言编译器的一个特性。它用于声明尚未定义的标识符

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

<更多信息,请参考下面的文章:(在C++中,但概念适用)


这称为向前声明,是大多数面向对象语言编译器的一项功能。它用于声明尚未定义的标识符

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

<更多信息,请参考下面的文章:(在C++中,但概念适用)


在SystemVerilog中很少需要
typedef类名。大多数编程语言要求先声明用作类型名的标识符,然后才能按语法引用它们。出现这种情况的一个地方是,如果您有循环类引用

class X;
  Y has_a_Y;
endclass
class Y;
  X has_a_X;
endclass
为了编译类
X
的代码,必须声明类
Y
。如果更改类的编译顺序,则
X
将变为未知。因此,我们使用所谓的前向类型定义

typedef class Y;
class X;
  Y has_a_Y;
endclass
现在,只要在关闭当前作用域之前定义了类
Y
,类
X
就会编译

然而,UVM强烈反对这种编码,因为这些依赖关系会降低代码的可重用性


有时,人们甚至在没有周期性依赖项的情况下也会使用正向typedef,因为他们太懒了,无法按照正确的依赖项顺序编译代码

在SystemVerilog中很少需要
typedef类名。大多数编程语言要求先声明用作类型名的标识符,然后才能按语法引用它们。出现这种情况的一个地方是,如果您有循环类引用

class X;
  Y has_a_Y;
endclass
class Y;
  X has_a_X;
endclass
为了编译类
X
的代码,必须声明类
Y
。如果更改类的编译顺序,则
X
将变为未知。因此,我们使用所谓的前向类型定义

typedef class Y;
class X;
  Y has_a_Y;
endclass
现在,只要在关闭当前作用域之前定义了类
Y
,类
X
就会编译

然而,UVM强烈反对这种编码,因为这些依赖关系会降低代码的可重用性

有时,人们甚至在没有周期性依赖项的情况下也会使用正向typedef,因为他们太懒了,无法按照正确的依赖项顺序编译代码