System verilog 连接阶段内的OVM声明

System verilog 连接阶段内的OVM声明,system-verilog,verification,System Verilog,Verification,我正在寻找有关特定systemverilog/OVM行为的解释/文档 我有一个连接阶段的类。在连接阶段,我试图声明一个ovm_对象,尽管我遇到了一些问题。当我这样做时: virtual function void connect(); super.connect(); `ifdef SOMETHING_ENABLE ovm_object some_object; `endif endfunction : connect 我得到一个语法错误,说下面的ve

我正在寻找有关特定systemverilog/OVM行为的解释/文档

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

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

    `ifdef SOMETHING_ENABLE
        ovm_object some_object;
    `endif
endfunction : connect
我得到一个语法错误,说下面的verilog源代码有一个语法错误:“file.sv”标记是“some_object”,它指向我的代码行,其中声明了some_object

尽管如此,当我用“开始”和“结束”来包装它时,我没有得到任何错误:

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

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

为什么会这样?有人能指出这方面的文档和/或解释我为什么看到编译器出现这种行为吗?

BNF for SystemVerilog要求声明位于块中任何过程语句之前(这来自Pascal编程语言中的Verilog根)。如果您查看函数的BNF(第a.2.6节),您将看到{tf_item_declaration}位于{function_statement_或{u null}之前


在第二个示例中,虽然没有语法错误,但您将无法引用块外的
某些对象。因此,将声明放在调用
super.connect()之前

所以,当我添加开始和结束块时,BNF的哪个部分是相关的?这是否属于A.2.8区块项目声明?A.6.3 seq_区块和A.6.4 statement_项目