Передача иерархии в модуль Verilog

У меня есть модуль «наблюдателя», который в настоящее время использует глобальные иерархии внутри него. Мне нужно создать второй экземпляр этого со второй глобальной иерархией.

В настоящее время:

module watcher;
wire sig = `HIER.sig;
wire bar = `HIER.foo.bar;
...
endmodule

watcher w; // instantiation

Желанный:

module watcher(input base_hier);
wire sig = base_hier.sig;
wire bar = base_hier.foo.bar;
...
endmodule

watcher w1(`HIER1); // instantiation
watcher w2(`HIER2); // second instantiation, except with a different hierarchy

Моя лучшая идея — использовать vpp (препроцессор Verilog) для генерирования методом грубой силы двух практически идентичных модулей (по одному с каждой иерархией), но есть ли более элегантный способ?


person pdq    schedule 15.09.2008    source источник


Ответы (2)


Я предпочитаю иметь один модуль (или небольшое количество модулей) в вашем тестовом стенде, который содержит все ваши зонды, но не имеет других функций. Все другие модули в вашем тестовом стенде, которым требуются датчики, затем подключаются к этому «модулю датчика». Используйте интерфейсы SystemVerilog вместо необработанных проводов, если это вариант для вас. Это позволяет обойти вашу проблему, поскольку ни одному наблюдателю не потребуются глобальные иерархии, и ваш тестовый стенд в целом будет значительно проще поддерживать. См. Закон Деметры.

В качестве альтернативы... (но это помещает иерархию в ваши экземпляры...)

module watcher(sig, bar);
  input sig;
  input bar;
...
endmodule

watcher w1(`HIER1.sig, `HIER1.foo.bar); // instantiation
watcher w2(`HIER2.sig, `HIER2.foo.bar); // second instantiation, except with a different hierarchy

Впоследствии вы также можете:

`define WATCHER_INST(NAME, HIER) watcher NAME(HIER.sig, HIER.foo.sig)

`WATCHER_INST(w1, `HIER1);
`WATCHER_INST(w2, `HIER2);
person DMC    schedule 16.09.2008
comment
Спасибо за ответ, и я, конечно, согласен с большинством ваших пунктов в целом. К сожалению, в этом случае модуль имеет около 100 внутренних проводов датчиков, поэтому преобразование их в явные входы, хотя и более четкое, довольно запутанное. - person pdq; 16.09.2008
comment
Привет ПДК. Думаю, именно поэтому я упомянул интерфейсы SV. По крайней мере, вы можете инкапсулировать их в несколько логических групп и получить доступ к проводам внутри вашего модуля, используя точечную нотацию. - person DMC; 16.09.2008

Можно ли использовать ключевое слово SystemVerilog bind для привязки модуля к каждой иерархии, в которой он требуется? (Для этого требуется, чтобы вы использовали SystemVerilog и имели лицензию на симулятор.)

Использование bind похоже на создание экземпляра модуля обычным способом, за исключением того, что вы указываете путь к иерархии, в которой модуль создается «удаленно»:

bind top.my.hier my_module instance_name(.*);
bind top.my_other.hier my_module instance_name(.*);

Еще лучше: предположим, что каждая иерархия, к которой вы привязываетесь, является отдельным экземпляром одного и того же модуля. Затем:

bind remote_module my_module instance_name(.*);

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

person d3jones    schedule 22.05.2009