System verilog 导出实例化模块的任务

System verilog 导出实例化模块的任务,system-verilog,system-verilog-dpi,System Verilog,System Verilog Dpi,我正试图通过DPI-C将多个任务导出到C程序。这些任务在模块my_subm中定义为: module my_subm; task mytask1(...); ... endtask task mytask2(...); ... endtask endmodule 在我的主模块main_mod中,我的子模块被实例化: module main_mod; my_subm my_subm_i (); `include "dpic_expor

我正试图通过DPI-C将多个任务导出到C程序。这些任务在模块my_subm中定义为:

module my_subm;
    task mytask1(...);
    ...
    endtask
    task mytask2(...);
    ...
    endtask
endmodule
在我的主模块main_mod中,我的子模块被实例化:

module main_mod;
    my_subm my_subm_i ();
    `include "dpic_exports.svh"

    initial begin
        ...
    end
endmodule
其中dpic_exports.svh为:

`ifndef DPIC_EXPORTS
`define DPIC_EXPORTS

export "DPI-C" task my_subm_i.mytask1;
export "DPI-C" task my_subm_i.mytask2;

`endif
当试图编译它时,我得到一个错误,说在dpic_exports.svh my_subm_I是一个层次名称的非法位置

我做错了什么

我需要的是这些任务在main_mod的作用域中可用,因为将访问它们的C任务是从该模块调用的。

导出语句必须与要导出的任务/函数位于同一位置。两个建议:您可以在主模块中创建包装器任务并导出这些任务

task mytask1;
  my_subm_i.mytask1;
endtask
task mytask2;
  my_subm_i.mytask2;
endtask
export "DPI-C" task mytask1;
export "DPI-C" task mytask2;

另一个选项是将export语句放在my_subn_i中,并使用svsetscopesvgetscopefromname main_mod.my_subm_i;在您的C代码中。

在导出语句中似乎不允许层次结构引用

这是解决办法。如果我教你吃蛋,我道歉:

module my_subm;

    task mytask1(...);
    ...
    endtask
    task mytask2(...);
    ...
    endtask
endmodule

module main_mod;
    my_subm my_subm_i ();

    export "DPI-C" task mytask1;
    export "DPI-C" task mytask2;

    task mytask1(...);
        my_subm_i.mytask1(...);
    endtask

    task mytask2(...);
        my_subm_i.mytask2(...);
    endtask

    initial begin
        ...
    end

endmodule

这和我一小时前说的有什么不同吗:没有。但我发布我的答案时,你的答案不在那里。它只出现在发布我的完整的1小时前标签后。嘿-你得了10分,我不会抱怨的看到答案太晚了,但我最终是如何在子模块中解决它的,并在C代码中使用svSetScope导出语句的。现在就接受你的答案,这样可以帮助别人。非常感谢。