导出实例化模块的任务

时间:2017-11-09 10:56:15

标签: system-verilog system-verilog-dpi

我试图通过DPI-C将几个任务导出到C程序。任务在模块“my_subm”中定义为:

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

在我的主模块“main_mod”中,“my_subm”被实例化:

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任务。

2 个答案:

答案 0 :(得分:1)

export语句必须与要导出的任务/功能位于同一位置。两个建议:您可以在main_mod中创建包装器任务并导出那些

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中,并在C代码中使用svSetScope(svGetScopeFromName("main_mod.my_subm_i");

答案 1 :(得分:0)

似乎在export语句中不允许使用分层引用。

这是解决方法。如果我教你吮吸鸡蛋,请道歉:

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