在 systemverilog 中交叉 class/file 参考编译

Cross class/file reference compilation in systemverilog

我有一个叫 my_class 的 class。在 my_class 中有一个 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,因为它正在使用它信息也是如此。这种交叉引用通常是如何解决的?

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

这种先有鸡还是先有蛋的问题在OO设计中很常见。如果所有东西都在同一个包中,前向类型定义就可以了:

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

我怀疑你没有展示更多,因为你的实际代码更复杂。很难提出替代方案。

主要问题是为什么如此紧密联系的 类 在两个单独的包中?如果它们在同一个包中,您可以使用前向 typedef 来解决这种循环依赖。

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