2015-09-16 3 views
0

Я пытаюсь создать макрос в System Verilog, поэтому я могу использовать его в строке для печати.Как создать строку из макропроцессора с аргументами

Я создал STRINGIFY макрос:

`define STRINGIFY(x) `"x`" 

как предложено здесь: How to create a string from a pre-processor macro

Однако макрос Я пытаюсь stringify принимает аргументы.

Рассмотрим следующий код:

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

Я хочу выход быть "top.chip.block.wire" вместо этого.

Обратите внимание, что макрос HPATH принимает аргумент wire.

Это пример кода запуска здесь: http://www.edaplayground.com/x/CKB

EDIT: Проблема заключается в том, что `STRINGIFY макрос останавливается расширением макроса внутри, когда макрос внутри имеет аргументы. Например:

`define STRINGIFY(x) `"x`" 
`define HPATH top.chip.block 
`define HPATH_SIGNAL(signal) top.chip.block.signal 

$display(`"`HPATH`"); // correctly outputs "top.chip.block" 
$display(`STRINGIFY(`HPATH)); // correctly outputs "top.chip.block" 
$display(`"`HPATH_SIGNAL(sig)`"); // correctly outputs "top.chip.block.sig" 
$display(`STRINGIFY(`HPATH_SIGNAL(sig))); // incorrectly outputs "`HPATH_SIGNAL(sig)" 

Кажется, что `HPATH_SIGNAL (сиг) не решен, когда вложены внутри` STRINGIFY макро

Возникает вопрос: почему не HPATH_SIGNAL (сиг) расширила последний линия?

Вот пример кода запуска: http://www.edaplayground.com/x/RF2

ответ

0

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

В тексте макроса разрешено смешивать символы «и», однако использование «всегда начинается строковый литерал и должно иметь завершение». Любые символы, встроенные внутри этого строкового литерала, включая «,», запускают строковый литерал, последний символ которого завершен «из».

`define HPATH(signal) `"top.chip.block.signal`" 
`define W wire 
module a; 
    initial begin 
    string hpath = `HPATH(wire); 
    //string hpath = `HPATH(`W); 
    $display("%s",hpath); 
    end 
endmodule 

выход: top.chip.block.wire

Надеюсь, вы понимаете контекст ` "и"(или просто макроопределения)

+0

Ну, я все еще хочу использовать макрос HPATH как иерархический путь (без кавычек). Я пересмотрю свой вопрос, так как я сужу проблему. –

0

Я не согласен с выходом, который вы получаете на детской площадке EDA. Я получаю желаемый результат с помощью ModelSim/Questa. Независимо от того, где макро текст аргумент раскрывается перед тем или после прохождения через макро внешний уровень (LRM говорит после) `» должен был разрешить макрос, который был передан через быть расширен.

+0

Да, проблема возникает на игровой площадке EDA при работе с VCS 2014 и более ранними версиями симулятора Icarus Verilog. –

0

Кажется, это проблема VCS.

Когда же код запускается на Icarus Verilog 0.10.0 и Ривьера-PRO EDU 2015,06 тренажерах выход правильно.

Проблема возникает при работе с VCS 2014.12 симулятор.

Смежные вопросы