是否可以在 VPI 回调中调用导出函数
Is it possible to call export function in VPI callback
我有以下情况:我有一个 vpi 回调,它在触发断言时触发。
在此回调中,我想调用导出系统 verilog 函数
我尝试在导出前设置 SvScope,但模拟器给了我一些错误。
通常vpi调用回调函数时,此时没有可用的DPI内容。因此,您需要在调用导出的 dpi 之前查找它:
svScope scope = svGetScopeFromName("path.to.your.export.scope");
svSetScope(scope);
其中范围是导出函数的范围。对于全局范围的导出,$unit
可用于范围名称。
1800-2012 LRM 未定义从尚未导入 DPI 的例程调用 DPI 导出的例程(参见 35.5.3 上下文任务和函数部分 )
导出的 DPI 例程在调用时需要两条关键信息,才能像 SystemVerilog 而不是 C 调用的任何其他例程一样运行。它需要范围上下文和进程上下文。
对于示波器,可以有多个同名的 DPI 导出。事实上,一个模块中可能有一个 DPI import/export 对,并且该模块被多次实例化。即使导入调用相同的 C 代码,它的上下文也是从调用者的范围设置的,并且该范围与导出的范围相匹配。 DPI 提供了一个 svSetScope
例程来显式执行此操作,如果隐式 DPI 导入例程没有。
对于这个进程,有很多事情可以做,比如disable
,或者暂停它。 DPI 没有提供明确设置的机制。
一些工具(如 Questa)确实提供了一种机制来针对一组有限的用例执行此操作。例如,您只能从非 DPI 导入的 C/C++ 代码中调用导出的 DPI function
。无法调用任务,因为它有可能阻塞,并且会干扰任何进程上下文。
我有以下情况:我有一个 vpi 回调,它在触发断言时触发。 在此回调中,我想调用导出系统 verilog 函数 我尝试在导出前设置 SvScope,但模拟器给了我一些错误。
通常vpi调用回调函数时,此时没有可用的DPI内容。因此,您需要在调用导出的 dpi 之前查找它:
svScope scope = svGetScopeFromName("path.to.your.export.scope");
svSetScope(scope);
其中范围是导出函数的范围。对于全局范围的导出,$unit
可用于范围名称。
1800-2012 LRM 未定义从尚未导入 DPI 的例程调用 DPI 导出的例程(参见 35.5.3 上下文任务和函数部分 )
导出的 DPI 例程在调用时需要两条关键信息,才能像 SystemVerilog 而不是 C 调用的任何其他例程一样运行。它需要范围上下文和进程上下文。
对于示波器,可以有多个同名的 DPI 导出。事实上,一个模块中可能有一个 DPI import/export 对,并且该模块被多次实例化。即使导入调用相同的 C 代码,它的上下文也是从调用者的范围设置的,并且该范围与导出的范围相匹配。 DPI 提供了一个 svSetScope
例程来显式执行此操作,如果隐式 DPI 导入例程没有。
对于这个进程,有很多事情可以做,比如disable
,或者暂停它。 DPI 没有提供明确设置的机制。
一些工具(如 Questa)确实提供了一种机制来针对一组有限的用例执行此操作。例如,您只能从非 DPI 导入的 C/C++ 代码中调用导出的 DPI function
。无法调用任务,因为它有可能阻塞,并且会干扰任何进程上下文。