如何在两个模块之间传递一个类?

时间:2015-06-12 22:07:54

标签: system-verilog

我有两个模块和一个类,我想将该类从一个模块移动到另一个模块。像这样:

class foo;
   int x;
   int y;
endclass

module mod_A(output foo foo_inst, output event trig);
   initial begin
      foo my_foo = new;
      my_foo.x = 1;
      my_foo.y = 2;
      foo_inst = my_foo;
      ->trig;
   end
endmodule

module mod_B(input foo foo_inst, input event trig);
   always @(trig) begin
       $display("%d%d, is a funky number.", foo_inst.x, foo_inst.y);
   end
endmodule

module top();
   event trig;
   foo   foo_inst;
   mod_A mod_A(.trig, .foo_inst);
   mod_B mod_B(.trig, .foo_inst);
endmodule

当然,还有一些在每个模块中使用的类中定义的函数。 这个设置的问题是我看到mod_B的每个端口都有错误:

Error-[RIPLIP] Register in low conn of input port
Non-net variable 'foo_inst' cannot be an input or inout port.
Non-net variable   'trig'   cannot be an input or inout port.

EDAplayground不支持类对象作为模块端口,而1800-2012仅在端口声明(23.2.2)中提到接口声明,事件,数组结构或联合,所以我的问题是:

  • 通过端口传递类是否合法?如果没有,那么优雅 完成这个的方法?
  • 什么"注册低conn 输入端口"意思?我知道这可能是特定于编译器的 错误,没有任何指示,但如果我知道它试图告诉我什么,我可能会更接近解决这个问题。

1 个答案:

答案 0 :(得分:1)

任何类型的变量都可以是inputoutput端口。您可能必须为编译器编写

input var foo foo_inst,

但是当端口真的是一个句柄时,最好使用ref

module mod_A(ref foo foo_inst, ref event trig);

请注意,您有foo_ofoo_inst的拼写错误以及触发器>trig和事件控件@(trig)之间的竞争条件。