Как создать строку из макроса препроцессора

У меня есть макрос препроцессора, который представляет собой иерархический путь в моем проекте.

Пример:

`define HPATH top.chip.block

Мне нужно построить строку, которая содержит значение `HPATH, поэтому в моем примере строка должна равняться top.chip.block.

Есть ли способ построить такую ​​строку?

Ни одна из следующих попыток не сработала:

string hpath;
hpath = "`HPATH";     // Results in hpath = "`HPATH"
hpath = \"``HPATH\";  // Doesn't compile
hpath = `HPATH;       // Doesn't compile

Я хочу, чтобы hpath было эквивалентно выполнению этого назначения hpath = "top.chip.block", но с использованием `HPATH вместо повторного указания пути.

Я не могу использовать %m, потому что мне нужна строка в моей среде UVM верхнего уровня, а не в модуле.

Еще немного предыстории: причина, по которой я хочу это сделать, заключается в том, что я использую бэкдор-доступ к регистрам в библиотеке классов UVM. API бэкдора требует установки hdl_path для блоков в дизайне в виде строки. У меня уже есть `определения для иерархических путей, и я пытаюсь повторно использовать их при указании hdl_paths, чтобы один и тот же путь не определялся дважды. Мой тестовый стенд будет использовать как иерархический путь, так и строковый путь.


person dwikle    schedule 12.03.2013    source источник


Ответы (3)


Невозможно использовать макрос `define внутри строкового литерала. Согласно SystemVerilog LRM:

Подстановка макросов и подстановка аргументов не должны происходить внутри строковых литералов.

Однако строковый литерал может быть создан с помощью макроса, который принимает аргумент и включает кавычки в макрос с помощью ``"`.

Опять же, из LRM:

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

Итак, это работает:

`define STRINGIFY(x) `"x`"
`define HPATH top.chip.block
string hpath = `STRINGIFY(`HPATH);
$display(hpath);                       // Output: "top.chip.block"

Пример кода можно запустить здесь: http://www.edaplayground.com/s/4/879

person dwikle    schedule 13.03.2013

Я знаю, что это старая тема, но я решил поделиться нашим решением. Использование $sformatf позволяет при необходимости добавлять дополнительную информацию.

`define STRINGIFY(DEFINE) $sformatf("%0s", `"DEFINE`")
person MBW    schedule 25.06.2018

Я думаю, это то, что вы ищете.

`define HPATH `"top.chip.block`"
string hpath = `HPATH;

Как указал инструмент, escape-последовательность %m даст вам текущую иерархию при использовании в операторе $ display, так что это может быть лучшим вариантом.

person Community    schedule 13.03.2013
comment
Не совсем так — мне все еще нужно использовать `HPATH в качестве иерархической ссылки в некоторых других контекстах, поэтому простое определение макросов в виде строки не сработает. - person dwikle; 13.03.2013