在 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
我怀疑你没有展示更多,因为你的实际代码更复杂。很难提出替代方案。
主要问题是为什么如此紧密联系的 类 在两个单独的包中?如果它们在同一个包中,您可以使用前向 typedef
来解决这种循环依赖。
另一种方法是通过删除默认 type T = my_class
并只使用 type T
来打破循环依赖。
我有一个叫 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
我怀疑你没有展示更多,因为你的实际代码更复杂。很难提出替代方案。
主要问题是为什么如此紧密联系的 类 在两个单独的包中?如果它们在同一个包中,您可以使用前向 typedef
来解决这种循环依赖。
另一种方法是通过删除默认 type T = my_class
并只使用 type T
来打破循环依赖。