Я столкнулся с некоторыми внутренними проблемами при использовании интерфейсов systemverilog, когда интерфейс пересекает иерархические границы.Я попытался набросать ситуацию на прилагаемом чертеже.
На верхнем рисунке показан «обычный» метод использования интерфейсов.интерфейс и подключенный модуль создаются на одном уровне иерархии.Это работает для симуляции и бэк-энда.
Средняя картинка показывает мою ситуацию.На верхнем уровне у меня есть модуль и интерфейс реализации.Интерфейс подключается к фиолетовому модулю, а затем подключается к 2 субмодулям.В симуляции это работает.
Тогда инструмент синтеза жалуется, что интерфейс на фиолетовом уровне должен быть модпортом.Поэтому я добавил это.Однако инструмент синтеза интерпретирует провода как двунаправленные и добавляет логику для облегчения этого.В моем дизайне все провода однонаправлены.
Единственный обходной путь, который я смог найти, чтобы исправить эту проблему, изображен на нижнем рисунке.Я подключаю через модпорт оригинальный интерфейс (помеченный А).Затем я создаю новый интерфейс (помеченный B), у которого тот же родительский элемент, что и у интерфейса A. Оба интерфейса A и B подключены к соединительному модулю, который содержит множество операторов, таких как:
assign interfaceB.rx1 = interfaceA.rx1;
назначить interfaceB.rx2 = interfaceA.rx2;
назначить interfaceA.statusX = interfaceB.statusX;
и т. д.
, так что это просто«тупое» соединение интерфейса A и B.
Такой способ работы кажется очень неправильным, так как этот соединительный модуль создает много накладных расходов.Есть ли хороший / более простой способ использования интерфейса поверх иерархических границ, который не только работает в симуляциях, но и работает для синтеза?
Спасибо