Как эмулировать отображение $ с помощью Verilog Macros?
Я хочу создать макрос с несколькими параметрами, как $display.
Мой код выглядит так, но он не работает.
`define format_macro(A) \
$write("%s", $sformatf(A)); \
Вот как я назвал format_macro.
`format_macro("variable = %d", variable)
Как я могу это сделать?
3 ответа
Я хочу создать макрос с несколькими параметрами, как $ display.
Ты не можешь Verilog и SystemVerilog не поддерживают вариационные макросы.
Вот обходной путь, если ваша цель - использовать это для форматирования строк или вывода, и вы хотите избежать необходимости набирать $sformat
повсюду. Вы можете определить макрос для одного аргумента и объединить этот аргумент с $sformat
, Предостережение при этом заключается в том, что при использовании макроса необходимо заключить аргумент в скобки.
Обратите внимание ()
для $sformatf
не являются частью макроса:
`define format_macro(A) \
$write("%s", $sformatf A ); \
Тогда вы можете сделать это:
`format_macro(("a = %d", a))
`format_macro(("a = %d, b = %d", a, b))
Кстати, здесь есть отличный скринкаст, который показывает, как настроить обмен сообщениями в UVM. В нем автор показывает эту методику макросов, а также некоторые другие полезные советы, если вы используете UVM.
Вы передаете 2 аргумента вашему макросу, "variable = %d"
а также variable
макрос имеет только 1 вход. Читая вопрос, это может быть не несколько аргументов, которые вы хотите, а переменное число.
Для статического списка либо есть настройка макроса для форматирования текста:
`define say(n) $display("cowsay : %s", n);
initial begin
`say("Moo")
end
=>cowsay : moo
Или сначала создайте строку и передайте в качестве одного аргумента.
`define say(n) $display("%s", n);
string msg;
initial begin
$sformat(msg, "variable is : %d", 3);
`say(msg)
end
=>variable is : 3
SystemVerilog теперь поддерживает необязательные макропараметры, которые позволяют вам создавать умный ключ, как это: http://ionipti.blogspot.com/2012/08/systemverilog-variable-argument-display.html
Это позволяет вам изменить формат сообщения в макросе (добавьте "ОШИБКА", или, возможно, номер файла и строки, или что-то еще, что вам нравится), что вы не можете сделать с вышеупомянутым подходом, заключив все параметры в круглые скобки.