首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在VPI回调中调用导出函数?

是否可以在VPI回调中调用导出函数?
EN

Stack Overflow用户
提问于 2018-01-10 14:18:27
回答 2查看 743关注 0票数 0

我有以下场景:我有一个vpi回调,这个回调是在触发断言时触发的。在这个回调中,我想调用一个导出系统verilog函数,我在导出之前尝试过setSvScope,但是模拟器给了我一些错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-10 16:04:43

从未被DPI导入的例程中调用DPI导出的例程在1800-2012年LRM中没有定义(见35.5.3节上下文任务和函数)

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

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

对于这个过程,您可以做很多事情,比如disable,或者挂起它。新闻部没有提供明确设置这一点的机制。

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

票数 0
EN

Stack Overflow用户

发布于 2018-01-10 15:30:25

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

代码语言:javascript
复制
svScope scope = svGetScopeFromName("path.to.your.export.scope");
svSetScope(scope);

其中,作用域是导出函数的作用域。对于来自全局范围的导出,可以使用$unit作为作用域名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48189425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档