System verilog 我们什么时候使用;typedef类别xxxxx“;在uvm中?
我不熟悉uvm,但我正在努力理解和学习 我在倾斜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
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,因为他们太懒了,无法按照正确的依赖项顺序编译代码