Systemverilog взаимодействует через иерархические границы - PullRequest
0 голосов
/ 13 декабря 2018

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

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

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

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

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

assign interfaceB.rx1 = interfaceA.rx1;

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

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

и т. д.

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

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

Спасибо enter image description here

1 Ответ

0 голосов
/ 13 декабря 2018

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

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

interface InterfaceB( input rx1, rx2, output ...)'
 modport .../ same as what you have
endinterface
...