Как создать строку из макропроцессора
У меня есть макрос препроцессора, который представляет собой иерархический путь в моем проекте.
Пример:
`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 будет использовать как иерархический путь, так и строковый путь.
Ответы
Ответ 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 даст вам текущую иерархию, если она используется в инструкции отображения $, так что это может быть лучшим вариантом.