我一直在尝试查看 SystemVerilog 中调用什么类函数而无需括号解析成。
说,这应该解析成什么:class_inst.func_name.abc
情况 1:func_name 返回一个结构体,其中 abc 是其中的成员。
情况 2:func_name 有一个名为 abc 的静态变量。
案例3:以上均为真。
情况 4:func_name 有一个名为 abc 的非静态变量。
PS:我们可以假设 abc 始终是类型兼容的。
VCS 在情况 1-3 中没有给出错误,但在情况 4 中给出错误。
问题:
拟议的 1800-2023 SystemVerilog LRM 最近澄清了这一点,作为允许函数调用链的增强功能的一部分。
如果没有括号,这是一个分层范围引用。这与传统 Verilog 向后兼容。允许对静态变量和网络进行分层引用。您不能从声明范围之外引用自动变量。该引用来自函数的范围内,而不是返回值的类型内。我在 EDAPlayground 上的所有模拟器上都遇到第 1 种情况的错误。如果
func_name
后面跟着括号,则始终是函数调用。
module top;
typedef struct {int A,B;} AB_t;
function AB_t foo;
static int B = 3;
foo = '{1,2};
endfunction
initial begin
void'(foo());
// $display(foo.A); // case 1 is an error
$display(foo.B); // case 2 & 3
end
endmodule