Как да тествам текущото име на екземпляр?

Трябва да използвам текущото име на екземпляр (пълно йерархично име) в условие за генериране на 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
Условието за генериране на if изисква постоянен израз, който може да бъде оценен по време на фазата на разработка.   -  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