我不熟悉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;
以及如何理解这种语法?
答案 0 :(得分:1)
这被称为转发声明,并且是大多数面向对象的语言编译器的功能。用于声明尚未定义的标识符。
基本上,您要告诉编译器的是在编译范围的其他地方定义了一个名为monitor
和driver
的类。这将在运行时解决。
有关更多信息,请参见下面的文章:(它是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,因为他们太懒了,无法按正确的依赖关系顺序编译代码。