Systemverilog:是否可以将宏视为可以索引的数组?

时间:2018-01-11 21:49:33

标签: macros system-verilog

在SystemVerilog中,是否可以将宏索引为长层次引用?即。

`define CONDENSED top.DUT.mod.sub_module.register_map

然后执行以下操作:

`CONDENSED.reg1[0]

2 个答案:

答案 0 :(得分:1)

宏只是简单的文本替换。除了令牌(字符串,数字文字,标识符,注释)之外,执行替代的文本预处理器对SystemVerilog语法一无所知。只要生成的文本是合法的SystemVerilog文本,您就可以使用任何宏。 (并注意关于拆分构成令牌的文本的规则)。

答案 1 :(得分:1)

您甚至可以在宏中包含索引:

`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