Подтвердить что ты не робот

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

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

Пример:

`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 для блоков внутри проекта, как строки. У меня уже есть `define для иерархических путей и я пытаюсь повторно использовать их при указании hdl_paths, поэтому у меня нет одинакового пути, определенного дважды. Мой testbench будет использовать как иерархический путь, так и строковый путь.

4b9b3361

Ответ 1

Невозможно использовать макрос `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

Ответ 2

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

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

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