如何在verilog中制作VPI?

如何在verilog中制作VPI?,verilog,Verilog,当我在网上偶然发现这个问题时 我遵循了最后一个答案,但它不起作用。 其中一个错误是hello_vpi.c:“vpi_user.h没有这样的文件或目录” hello_vpi.c 12:错误的_vpi_systf_数据未声明(此函数首次使用) 我应该解决什么问题 更新 @格雷格:我的模拟器是Incisive15.10.002和Linux6.0 我遇到了一个问题,当我像这样运行时,gcc hello_vpi.c-fPIC-shared-o hello_vpi.so-I/cadence/Incisiv

当我在网上偶然发现这个问题时

我遵循了最后一个答案,但它不起作用。 其中一个错误是hello_vpi.c:“vpi_user.h没有这样的文件或目录” hello_vpi.c 12:错误的_vpi_systf_数据未声明(此函数首次使用)

我应该解决什么问题

更新 @格雷格:我的模拟器是Incisive15.10.002和Linux6.0

我遇到了一个问题,当我像这样运行时,
gcc hello_vpi.c-fPIC-shared-o hello_vpi.so-I/cadence/Incisive/Incisive15.10.002/tools.lnx86/include
,我得到了如下消息

hello_vpi.c:Infunction“register_hello”:
hello_vpi.c:16:警告:来自不兼容指针类型的赋值

当我运行这个命令时,我得到了如下错误消息
ncverilog test.v+access+r-v hello\u vpi.so


*W.LIBNOU:Library“hello_vpi.so给定但未使用。

$hello;
无法识别的系统任务或功能

libvpi.so无法打开shaed对象文件:没有这样的文件目录或文件不是有效的ELFCLASS64库

*E、 MSSYSTF:在细化过程中注册并在模拟中使用的用户定义系统任务或函数($hello)在模拟过程中尚未注册


我不知道该怎么办?

删除
-I

gcc hello_vpi.c -fPIC -shared -o hello_vpi.so -I/cadence/Incisive/Incisive15.10.002/tools.lnx86/include
您也可以尝试:(注意:我在猜测使用Incisive的gcc的路径)

如果
ncverilog test.v+access+r-v hello\u vpi.so
不起作用,请尝试:

ncverilog test.v +access+r -loadvpi ./hello_vpi.so:register_hello

模拟器是PATH变量的一部分吗?如果不是,您可能需要添加
-I
(大写“I”)带有指向模拟器的路径。一些模拟器的文件位于lib或bin控制器中。此外,一些模拟器在安装控制器中有自己的gcc,通常位于bin目录中。如果使用此gcc编译,它应该包含指向
vpi_user.h
的路径。如果需要更多帮助,您需要更新您的任务离子并告诉用户您正在使用什么模拟器和操作系统,以及您是否正在使用IDE。@Greg:我已经更新了它,除了最后一个以外,所有的都不工作。“ncverilog test.v+access+r-loadvpi./hello\u vpi.so:register\u hello“这是工作。谢谢,但我不知道为什么那些命令不起作用?我应该每次都像最后一个命令一样使用吗?创建另一个void函数(比如register\u all),并让这个函数调用您想要注册的所有其他函数。然后在运行ncverilog时使用register_all而不是register_hello。这是一个离题的问题,我不确定在DPI和VPI之间我应该学习什么?我是新手,想开始一些界面语言。VPI真的死了(根据苏瑟兰的说法)?如果你仔细阅读萨瑟兰的论文,你会在第7节和第8节中看到DPI不能完全取代VPI。VPI(有时称为PLI 2.0)确实取代了PLI(又名PLI 1.0),因为旧的TF和ACC文件在2005年被弃用。VPI不会很快消失,除非DPI或未来的接口语言可以实现与VPI相同的功能。当我需要用C/C++与Verilog/SystemVerilog一起完成某项工作时,我的一般经验法则是:如果它可以使用DPI,那么就使用DPI,否则如果不能使用DPI,那么就使用VPI。如果可以的话,你应该学习这两个方面,但我会更强调DPI,因为你可能会更频繁地使用它。
ncverilog test.v +access+r -loadvpi ./hello_vpi.so:register_hello