0

我正在尝试通过 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 任务是从该模块调用的。

4

2 回答 2

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

于 2017-11-09T15:47:08.630 回答
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
于 2017-11-09T16:47:25.693 回答