Как передать класс между двумя модулями?

У меня есть два модуля и класс, и я хотел бы переместить этот класс из одного модуля в другой. Что-то вроде этого:

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), поэтому мои вопросы:

  • Законно ли вообще проходить занятия через порты? Если нет, то какой элегантный способ сделать это?
  • Что означает «Регистрация в низком соединении входного порта»? Я знаю, что это может быть специфическая ошибка компилятора и ничего показательного, но если бы я знал, что он пытается мне сказать, я мог бы быть на шаг ближе к исправлению этого.

person Jan Bartels    schedule 12.06.2015    source источник


Ответы (1)


Переменная любого типа может быть портом input или output. Возможно, вам придется написать для вашего компилятора

input var foo foo_inst,

Но было бы лучше использовать ref, когда порт действительно является дескриптором.

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

Обратите внимание, что у вас есть опечатка с foo_o или foo_inst и состояние гонки между триггером ->trig и элементом управления событиями @(trig).

person dave_59    schedule 12.06.2015
comment
Эй, @Dave, спасибо, что прояснил это. Я знал, что SV поддерживает передачу по ссылке, но не подумал применить это здесь. Я исправил опечатку, так как это не было частью проблемного кода. Не могли бы вы немного подробнее рассказать о состоянии гонки? Я сделал небольшой мокап на EDAplayground, и, похоже, он работает, как задумано. - person Jan Bartels; 16.06.2015
comment
Вы исправили состояние гонки, задержав триггер. В вашем исходном примере у вас был триггер из блока initial в момент времени 0 и always @(event), который также запускается в момент времени 0. Большинство симуляторов всегда запускают блочные процессы до начального блочного процесса, но вы не должны на это рассчитывать. - person dave_59; 17.06.2015
comment
Идея была почти готова. Динамически размещаемые объекты могут передаваться только по ссылке. По крайней мере с компилятором, который я использую - не чувствую себя достаточно уверенно, чтобы говорить за все SV. Изменение ввода и вывода на «ref» устранило проблему. Без промедления все действительно развалится. Я рассмотрю это в своих модулях. Спасибо, что указали на это. - person Jan Bartels; 17.06.2015