systemverilog中的跨类/文件引用编译

时间:2017-01-23 06:26:05

标签: system-verilog

我有一个名为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,因为它也在使用该信息。这种交叉引用通常如何解决?

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

2 个答案:

答案 0 :(得分:2)

这种鸡蛋问题在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

答案 1 :(得分:1)

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

主要问题是为什么这些紧密连接的类在两个独立的包中?如果它们位于同一个包中,则可以使用可解决此循环依赖关系的转发type T = my_class

另一种方法是通过删除默认type T来破坏循环依赖关系,并使用 gridview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { final Intent intent; switch(position) { case 0: intent = new Intent(context, FirstActivity.class); break; case 1: intent = new Intent(context, SecondActivity.class); break; ... default: intent = new Intent(context, DefaultActivity.class); break; } startActivity(intent); } });