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