У меня есть два модуля и класс, и я бы хотел переместить этот класс из одного модуля в другой. Что-то вроде этого:Как пройти класс между двумя модулями?
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), так что я задаю следующие вопросы:
- Действительно ли законно пропускать классы через порты? Если нет, то какой элегантный способ ?
- Что такое «Регистрация в низком подключении входной порт» означает? Я знаю, что это может быть ошибка компилятора и ничего индикативного, но если бы я знал, что он пытался сказать мне, я мог бы сделать шаг ближе к исправлению этого.
Эй, @ Даве, спасибо, что расчистили это. Я знал, что SV поддерживает передачу по ссылке, но я не думал применять ее здесь. Я исправил опечатку, так как это не было частью проблемного кода. Не могли бы вы немного рассказать о состоянии гонки? Я сделал небольшой макет на EDAplayground (http://www.edaplayground.com/x/8TW), и, похоже, он работает по назначению. –
Вы установили условие гонки, запустив триггер. В исходном примере у вас был триггер из «начального» блока в момент времени 0 и «всегда @ (событие)», который также начинается во время 0. Большинство симуляторов начнут всегда блокировать процессы до начального блочного процесса, но вы должны не рассчитывайте на это. –
Идея была почти там. Динамически выделенные объекты ** могут передаваться только через ссылку. По крайней мере, с компилятором, который я использую, не чувствуйте себя достаточно уверенно, чтобы говорить за все SV. Изменение ввода и вывода на «ref» исправило проблему. Без задержки вся вещь действительно разваливается. Я расскажу об этом в своих модулях. Спасибо, что указали это. –