2017-01-23 419 views
1

我有一个名为my_class的类。在my_class中有一个名为my_port的类。 my_port参数化为其中一个参数为my_class。问题是,它们在不同的文件中,默认参数是my_class。我有一个my_class_pkg和my_port_pkg的包。如果我将my_port_pkg导入到my_class_pkg中,我仍然无法编译,因为my_port_pkg仍然需要能够看到my_class,因为它也使用该信息。这个交叉引用通常如何解决?systemverilog中的跨类/文件参考汇编

class my_port#(type T = my_class) extends base_class #(T); 
    //code here 
endclass 

class my_class 
    my_port#(something) X; 
    //code here 
endclass 

package my_class_pkg 
    import my_port_pkg::*; 
    `include "my_class.sv"; 
endpackage 

package my_port_pkg 
    `include "my_port.sv"; 
endpackage 
+0

你可以显示一些代码,你的描述不是很清楚。你在my_checker中说,有一个类my_port。你的意思是嵌套声明或参考。 my_checker在哪里声明?进口报表在哪里?为什么不将my_class_pkg导入my_port_pkg工作? –

+0

我已更新我的原始帖子。 my_class具有my_port的声明,my_port具有默认为my_class的参数化类型。这是否回答你的问题? – InternetDPS

+0

仍然没有足够的代码。软件包在哪里?,哪里是进口?,哪里是my_checker? –

回答

1

我怀疑你没有显示更多,因为你的实际代码更复杂。建议替代方案将很困难。

主要问题是为什么这种紧密连接的类在两个独立的包中?如果他们在同一个包中,则可以使用可解决此循环依赖性的前向typedef

另一种方法是通过删除默认的type T = my_class并仅使用type T来打破循环依赖关系。

+0

所以my_port实际上是一个在几个地方使用的实用程序类。我有它默认参数化为my_class的原因是因为我的理解是你需要提供一些默认值。我尝试不提供参数化的默认值,并且出现编译错误:“没有覆盖或默认值” – InternetDPS

+0

如果您在任何地方引用您提供覆盖的类,则不需要提供默认值。但是,如果my_port是一个我们在几个地方使用的实用类,那并不意味着my_class也可以在那些相同的地方使用,如果它是一个默认类型不会被覆盖? –

+0

不只是my_port。所以测试台有my_class和my_class_2。每个都需要有一个my_port。 my_port需要知道它所在类的类型,但它不能是静态的(实际上,这不仅仅是2类,而且这是UVM,因此环境更大且更具动态性)。 – InternetDPS

2

这种鸡和蛋的问题的是面向对象的设计普遍。如果一切都在同一个包,一个向前类型定义会做的伎俩:

package my_package; 

    typedef class my_class; // this is a forward type definition 

    class my_other_class; 
    my_class mc;  
    endclass 

    class my_class; 
    my_other_class moc; 
    endclass 

endpackage 

module my_module; 

    import my_package::*; 

    my_class mc = new; 

endmodule 

https://www.edaplayground.com/x/3sbd

在单独的包中的类,事情就比较麻烦一些。这似乎是工作,但有点讨厌:

my_class.sv:

class my_class; 
    my_port #(base_class) X; 
    //code here 
endclass 

my_port.sv:

typedef class my_class; 

class base_class #(type T = my_class); 
    //code here 
endclass 

class my_port#(type T = my_class) extends base_class #(T); 
    //code here 
endclass 

包:

package my_port_pkg; 
    `include "my_port.sv"; 
    `include "my_class.sv"; 
endpackage 

package my_class_pkg; 
    import my_port_pkg::*; 
    `include "my_class.sv"; 
endpackage 

https://www.edaplayground.com/x/2gCX

+0

我是否需要在同一个包中定义my_port和my_class? my_port是一个实用程序类,将在很多地方使用,所以我试图保持sv包含单独的。 – InternetDPS