0

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

4

2 回答 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 回答