Как проверить текущее имя экземпляра?

Мне нужно использовать текущее имя экземпляра (полное иерархическое имя) в условии создания условия if:

generate
   if (current_instance_name() == "a.b.c.foo")
   ...

Есть ли способ сделать это в Verilog или SystemVerilog? Я знаю %m, но он позволяет печатать только имя экземпляра.

Спасибо.


person Laurent A    schedule 30.09.2014    source источник
comment
Я почти уверен, что вы не можете этого сделать. Если вы хотите, чтобы определенный экземпляр содержал разные сгенерированные блоки, вам придется использовать параметры и соответствующим образом параметризовать экземпляр.   -  person Tudor Timi    schedule 30.09.2014
comment
Кроме того, полагаться на полные иерархические пути внутри модуля — очень плохая практика, поскольку это нарушает инкапсуляцию.   -  person Tudor Timi    schedule 30.09.2014
comment
Условие генерации, если требуется постоянное выражение, которое можно вычислить на этапе уточнения.   -  person jclin    schedule 01.10.2014


Ответы (2)


Способ сделать это

localparam string current_path = $sformatf("%m");

generate
if (current_path == "a.b.c.foo") begin ...
person dave_59    schedule 01.10.2014

Вы по-прежнему можете использовать %m, передав его $psprintf, который вернет строку. Следующая функция должна решить вашу проблему:

function string current_instance_name();
return $psprintf("%m");
endfunction
person AldoT    schedule 30.09.2014
comment
Хотя это возвращает полный путь, я почти уверен, что он не может использовать его в операторе генерации, потому что он не разрешается в сложную постоянную времени. - person Tudor Timi; 30.09.2014
comment
Хотя основной симулятор поддерживает $psprintf, он не является частью стандартов IEEE1364 (Verilog) или IEEE1800 (SystemVerilog). Чтобы пожаловаться на стандарт(ы), используйте $sformatf - person Greg; 30.09.2014
comment
%m возвращает текущий путь, по которому находится строка формата, а не имя экземпляра. Если вы помещаете функцию в пакет и вызываете функцию внутри вашего модуля/экземпляра, строка формата приводит к package_name::current_instance_name - person jclin; 01.10.2014
comment
@jclin, ха, хорошо, это тоже правда. Он вернет местоположение функции и имя функции. - person AldoT; 01.10.2014
comment
Вместо %m в VCS есть %i, который вернет строку, указывающую, из какого экземпляра/блока была вызвана функция. - person AldoT; 01.10.2014