是否可以在VPI回调中调用导出功能

时间:2018-01-10 14:18:28

标签: system-verilog system-verilog-assertions system-verilog-dpi vpi

我有以下情况:我有一个触发断言时触发的vpi回调。 在这个回调中,我想调用导出系统verilog函数 我试图在导出之前设置SVScope,但模拟器给了我一些错误。

2 个答案:

答案 0 :(得分:0)

通常当vpi调用回调函数时,此时没有可用的DPI内容。因此,您需要在调用导出的dpi之前查找它:

svScope scope = svGetScopeFromName("path.to.your.export.scope");
svSetScope(scope);

其中范围是导出函数的范围。对于全局范围的导出,$unit可用于范围名称。

答案 1 :(得分:0)

从未导入DPI的例程调用DPI导出的例程未被1800-2012 LRM定义(请参阅 35.5.3上下文任务和函数部分)

调用时导出的DPI例程需要两个关键信息,其行为与SystemVerilog而不是C调用的任何其他例程一样。它需要一个范围上下文和一个进程上下文。

对于范围,可以使用相同名称的多个DPI导出。实际上,可以在模块中具有DPI导入/导出对,并且该模块可以多次实例化。即使导入调用相同的C代码,其上下文也会从调用者的作用域设置,并且该作用域与导出的作用域匹配。如果隐式DPI导入的例程没有,则DPI提供svSetScope例程来明确地执行此操作。

对于此过程,您可以执行许多操作,例如disable,或暂停它。 DPI没有提供明确设置它的机制。

某些工具(如Questa)确实为一组有限的用例提供了一种机制。例如,您只能从非DPI导入的C / C ++代码中调用DPI导出的function。无法调用任务,因为它有可能阻塞,并且会干扰任何进程上下文。