连接阶段内的 OVM 声明

OVM declarations inside connect phase

我正在寻找 explanation/documentation 特定的 systemverilog/OVM 行为。

我有一个带有连接阶段的 class。在连接阶段,我试图声明一个 ovm_object,尽管我遇到了一些问题。当我这样做时:

virtual function void connect();
    super.connect();

    `ifdef SOMETHING_ENABLE
        ovm_object some_object;
    `endif
endfunction : connect

我得到一个语法错误,说下面的 verilog 源有一个语法错误:"file.sv" token is 'some_object',它指向我声明为 [=30= 的代码行].

虽然,当我用 "begin" 和 "end" 包裹它时,我没有收到任何错误:

virtual function void connect();
    super.connect();

    `ifdef SOMETHING_ENABLE
    begin
        ovm_object some_object;
    end
    `endif
endfunction : connect

这是为什么?有人可以指出这方面的文档,and/or 解释为什么我看到编译器有这种行为吗?

SystemVerilog 的 BNF 要求声明出现在块中的任何过程语句之前(这来自 Pascal 编程语言中的 Verilog 根)。如果查看函数的 BNF(第 A.2.6 节),您会看到 {tf_item_declaration} 出现在 {function_statement_or_null} 之前.

在你的第二个例子中,虽然你没有语法错误,但你将无法在块外引用 some_object。所以把你的声明放在调用 super.connect();.

之前