【发布时间】:2018-01-11 21:49:32
【问题描述】:
在 SystemVerilog 中,是否可以为长层次引用的宏建立索引?即
`define CONDENSED top.DUT.mod.sub_module.register_map
然后执行以下操作:
`CONDENSED.reg1[0]
【问题讨论】:
标签: macros system-verilog
在 SystemVerilog 中,是否可以为长层次引用的宏建立索引?即
`define CONDENSED top.DUT.mod.sub_module.register_map
然后执行以下操作:
`CONDENSED.reg1[0]
【问题讨论】:
标签: macros system-verilog
宏只是简单的文本替换。除了标记是什么(字符串、数字文字、标识符、注释)之外,执行替换的文本预处理器对 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
【讨论】: