2015-06-12 2 views
1

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

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), так что я задаю следующие вопросы:

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

ответ

0

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

input var foo foo_inst, 

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

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

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

+0

Эй, @ Даве, спасибо, что расчистили это. Я знал, что SV поддерживает передачу по ссылке, но я не думал применять ее здесь. Я исправил опечатку, так как это не было частью проблемного кода. Не могли бы вы немного рассказать о состоянии гонки? Я сделал небольшой макет на EDAplayground (http://www.edaplayground.com/x/8TW), и, похоже, он работает по назначению. –

+0

Вы установили условие гонки, запустив триггер. В исходном примере у вас был триггер из «начального» блока в момент времени 0 и «всегда @ (событие)», который также начинается во время 0. Большинство симуляторов начнут всегда блокировать процессы до начального блочного процесса, но вы должны не рассчитывайте на это. –

+0

Идея была почти там. Динамически выделенные объекты ** могут передаваться только через ссылку. По крайней мере, с компилятором, который я использую, не чувствуйте себя достаточно уверенно, чтобы говорить за все SV. Изменение ввода и вывода на «ref» исправило проблему. Без задержки вся вещь действительно разваливается. Я расскажу об этом в своих модулях. Спасибо, что указали это. –

Смежные вопросы