Системный макрос Verilog с использованием строк

Я хотел бы создать системный макрос Verilog и передать ему строковую переменную. Я прочитал другой поток, который использует define to define a string and pass thatSTRING_NAME, который работает, но мне нужно следующее.

`define STRINGIFY(x) `"x`"

Я хочу, чтобы REG_PATH был преобразован в string, который используется в качестве параметра.

`define mirror(REG_PATH) \
   $display(`STRINGIFY(REG_PATH)``other text);

При использовании я хотел бы передать строку с помощью строковой переменной.

string register_path = "my string"
`mirror(register_path)

Я не пробовал этот код, но знаю, что вы можете передать переменную string в macro. Вот почему я использую STRINGIFY(REG_PATH).


person G Nich    schedule 20.07.2016    source источник


Ответы (2)


Если требуется просто отображение, так как строка уже передана в макрос, и ее можно использовать напрямую без необходимости преобразования в отображении.

define mirror(REG_PATH) \
   $display("%s ``other text",REG_PATH);

string register_path = "my string";

initial
   `mirror(register_path)

Также строки можно объединять напрямую.

`define mirror(REG_PATH) \
   {REG_PATH," other text"}
initial
  $display(`mirror(register_path));

Вариант 3

 `define mirror(REG_PATH)  \
 $display("%s otherstring",$psprintf("%s",REG_PATH));
 initial
       `mirror(register_path)

Вариант 4

`define mirror(REG_PATH) \
    $psprintf("%s",REG_PATH)

initial
begin
  $display(`mirror(register_path));
end
person Rahul Menon    schedule 20.07.2016
comment
$ Display приведен только для примера. Я хочу назначить register_path = string, но это не приведет к отображению строки $ display. Он отобразит register_path. - person G Nich; 22.07.2016
comment
psprintf можно использовать. Поскольку требуется содержимое register_path и его значение устанавливается во время выполнения. `определить зеркало (REG_PATH) $ display (% s другая строка, $ psprintf (% s, REG_PATH)); - person Rahul Menon; 22.07.2016
comment
Но если я вызову `mirror (string_parameter) и string_parameter = My String, я не получу My String, напечатанный в $ display. Я получу параметр string_parameter в том виде, в каком он напечатан. - person G Nich; 25.07.2016
comment
Понятно, но если мы не будем использовать define STRINGIFY(x) x`, мы должны получить лучший результат, вариант 3 и вариант 4 генерируют мою строку в качестве выходных данных моделирования в отмене, это сработает? - person Rahul Menon; 25.07.2016
comment
STRINGIFY (x) тоже не работает, поэтому я больше не использую это как вариант. варианты 3 и 4 не работают, если я вызываю `mirror (my_string_variable) и my_string_variable = register_path; Это не печатается. my_string_variable рассматривается как строка и отображается. - person G Nich; 05.08.2016
comment
Я повторно запустил вариант 3 и 4 в двух симуляторах (vcs и ncsim), и оба печатают значение в my_string_variable, т.е. register_path, я предполагаю, что копия старого макроса или STRINGIFY может быть где-то в файлах, переопределяющих новое определение, вызывая my_string_variable для печати. - person Rahul Menon; 06.08.2016
comment
Попробуйте запустить этот код. Джордж не будет отображаться. Вам нужно будет заменить строковую переменную на reg, если вы не используете симулятор, поддерживающий строку. define STRINGIFY(x) x" define mirror (reg_path) $ display (STRINGIFY(reg_path)); module test; string reg_path = "George"; //reg [8*6:1] reg_path="George"; initial begin mirror (reg_path) end endmodule - person G Nich; 10.08.2016
comment
Да, вы правы, этого не произойдет, потому что макрос STRINGILY будет рассматривать x как строку и не будет выполнять никаких подстановок, он проигнорирует входной параметр (x). Попробуйте запустить этот код, вместо этого он напечатает Джордж. `define STRINGIFY (x) $ psprintf (% s, x)` определить зеркало (reg_path) $ display (`STRINGIFY (reg_path)); модуль тестовый; строка reg_path = Джордж; // reg [8 * 6: 1] reg_path = Джордж; начальное начало `mirror (reg_path) end endmodule // '' необходимо отредактировать - person Rahul Menon; 10.08.2016

Я нашел в этом проблему. Поскольку макрос является функцией времени компиляции, перевод строки во время выполнения выполняться не будет. Все, что мне нужно сделать, это передать объект вместо строки, потому что вещь, которую я хочу передать, выглядит как строка, но на самом деле это объект. `define mirror (x) x.mirror_task () добавляет объект к задаче зеркала в классе объектов.

person G Nich    schedule 10.08.2016