Systemverilog: можно ли рассматривать макрос как массив, который можно проиндексировать?
В SystemVerilog, возможно ли индексировать макрос для длинной иерархической ссылки? т.е.
`define CONDENSED top.DUT.mod.sub_module.register_map
затем сделайте что-то вроде:
`CONDENSED.reg1[0]
2 ответа
Решение
Макрос - это просто простая подстановка текста. Текстовый препроцессор, выполняющий подстановку, ничего не знает о синтаксисе SystemVerilog, кроме того, что представляет собой токен (строка, числовой литерал, идентификатор, комментарий). Вы можете использовать любой макрос, если полученный текст является допустимым текстом SystemVerilog. (и соблюдайте правила разделения текста, составляющего токен).
Вы даже можете включить индексы в свой макрос:
`define MY_SELECTION(index0, index1) c0_a[index0].c1_a[index1].a
class c1;
int a;
endclass
class c0;
c1 c1_a[10];
function new();
foreach(c1_a[idx]) begin
c1_a[idx] = new();
end
endfunction
endclass
module top;
initial begin
automatic c0 c0_a[10];
foreach(c0_a[idx]) begin
c0_a[idx] = new();
end
`MY_SELECTION(5, 6) = 8;
$display("my_value: %0d", `MY_SELECTION(5, 6));
`MY_SELECTION(5, 6)[0] = 1;
$display("my_value: %0d", `MY_SELECTION(5, 6));
end
endmodule
Выход этого кода:
my_value: 8
my_value: 9
Вы можете запустить этот пример на EDA Playground - https://www.edaplayground.com/x/4EZZ