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

Другие вопросы по тегам