Systemverilog взаимодействует через иерархические границы

Я сталкивался с некоторыми внутренними проблемами при использовании интерфейсов systemverilog, когда интерфейс пересекает иерархические границы. Я попытался набросать ситуацию на прилагаемом чертеже.

На верхнем рисунке показан "обычный" метод использования интерфейсов. интерфейс и подключенный модуль создаются на одном уровне иерархии. Это работает для моделирования и бэк-энда.

Средняя картина показывает мою ситуацию. На верхнем уровне у меня есть модуль и интерфейс реализации. Интерфейс подключается к фиолетовому модулю, а затем подключается к 2 субмодулям. В симуляции это работает.

Затем инструмент синтеза жалуется, что интерфейс на фиолетовом уровне должен быть модпортом. Поэтому я добавил это. Однако инструмент синтеза интерпретирует провода как двунаправленные и добавляет логику для облегчения этого. В моем дизайне все провода однонаправлены.

Единственный обходной путь, который я смог найти, чтобы исправить эту проблему, изображен на нижнем рисунке. Я подключаю через модпорт оригинальный интерфейс (помеченный А). Затем я создаю новый интерфейс (помеченный B), у которого тот же родительский элемент, что и у интерфейса A. Оба интерфейса A и B подключены к соединительному модулю, который содержит множество операторов, таких как:

назначить interfaceB.rx1 = interfaceA.rx1;

назначить interfaceB.rx2 = interfaceA.rx2;

назначить interfaceA.statusX = interfaceB.statusX;

так далее

так что это просто "тупое" соединение интерфейса A и B.

Такой способ работы кажется очень неправильным, так как этот модуль подключения создает много накладных расходов. Есть ли хороший / более простой способ использования интерфейса через иерархические границы, который не только работает в симуляциях, но и работает для синтеза?

Спасибо

1 ответ

Решение

Иерархическая композиция, безусловно, является недостатком интерфейсов SystemVerilog.

Вы можете упростить свое решение, создав InterfaceB со списком портов и подключения к отдельным сигналам от InterfaceA порт. Это исключает подключение модуля.

interface InterfaceB( input rx1, rx2, output ...)'
 modport .../ same as what you have
endinterface
Другие вопросы по тегам