如何在verilog中制作VPI?
Posted
技术标签:
【中文标题】如何在verilog中制作VPI?【英文标题】:how to make a VPI in verilog? 【发布时间】:2015-12-24 05:52:22 【问题描述】:当我在网上遇到时,我发现了这个问题how to use verilog PLI communicate with c by ncverilog compiler
我遵循了最后一个答案,但它不起作用。 错误之一是 hello_vpi.c :“vpi_user.h 没有这样的文件或目录” hello_vpi.c 12 : error 's_vpi_systf_data' undeclared(第一次在这个函数中使用) ....
我应该解决什么问题?
更新
@Greg :: 我的模拟器是 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:'register_hello' 无效: hello_vpi.c :16: 警告:来自不兼容指针类型的赋值。
当我运行此命令时,我收到了一些错误消息,如下所示
ncverilog test.v +access+r -v hello_vpi.so
... *W.LIBNOU : 库 "hello_vpi.so 已提供但未使用。 ... $你好; 无法识别的系统任务或功能 ... libvpi.so 无法打开着色对象文件:没有这样的文件目录或文件无效 ELFCLASS64 库 ... *E, MSSYSTF : 用户定义的系统任务或函数($hello)在细化过程中注册并在模拟中使用,在模拟过程中没有被注册。
我不知道我该怎么办?
【问题讨论】:
模拟器是你PATH变量的一部分吗?如果没有,您可能需要添加带有模拟器路径的-I
(大写“i”)。一些模拟器将文件放在 lib 或 bin 目录中。
另外,有些模拟器自带的gcc在安装目录,一般在bin目录下。如果你用这个 gcc 编译,它应该已经包含了vpi_user.h
的路径。如果您需要更多帮助,您将需要更新您的问题并告知您使用的是什么模拟器和操作系统,以及您是否使用的是 IDE。
@Greg : 我已经更新了
【参考方案1】:
去掉-I
后面的空格
gcc hello_vpi.c -fPIC -shared -o hello_vpi.so -I/cadence/Incisive/Incisive15.10.002/tools.lnx86/include
你也可以试试:(注:我猜的是Incisive自带的gcc的路径)
/cadence/Incisive/Incisive15.10.002/tools.lnx86/bin/gcc hello_vpi.c -fPIC -shared -o hello_vpi.so
如果ncverilog test.v +access+r -v hello_vpi.so
不起作用,请尝试:
ncverilog test.v +access+r -loadvpi ./hello_vpi.so:register_hello
【讨论】:
除了最后一个之外,所有这些都不起作用。 “ ncverilog test.v +access+r -loadvpi ./hello_vpi.so:register_hello ”是有效的。谢谢,但我不知道为什么这些命令不起作用?我应该每次都像最后一个逗号一样使用吗? 创建另一个 void 函数(比如 register_all),并让该函数调用您想要注册的所有其他函数。然后在运行 ncverilog 时使用 register_all 而不是 register_hello。 这是题外话,我不确定在 DPI 和 VPI 之间我应该学习什么?我是新手,想开始一些界面语言。 VPI 真的死了(根据 surthelland 的说法)? 如果您仔细阅读 Sutherland 论文The Verilog PLI is Dead (maybe) -- Long Live the the SystemVerilog DPI!,您会在第 7 和第 8 节中看到 DPI 不能完全替代 VPI。 VPI(有时称为 PLI 2.0)确实取代了 PLI(又名 PLI 1.0),因为旧的 TF 和 ACC 文件在 2005 年被弃用。VPI 不会很快消失,除非 DPI 或未来的界面语言可以做同样的事情作为 VPI 的功能。 当我需要使用 Verilog/SystemVerilog 在 C/C++ 中完成某些事情时,我的一般经验法则:如果可以使用 DPI,则使用 DPI,否则如果无法在 DPI 中完成,则使用 VPI。如果可以的话,你应该同时学习,但我会更加强调 DPI,因为你可能会更频繁地使用它。以上是关于如何在verilog中制作VPI?的主要内容,如果未能解决你的问题,请参考以下文章
在 Verilog 模拟器和 VPI 代码中使用 make 的最佳实践是啥
如何使用 Icarus Verilog 在 Verilog 中转换 VHDL 代码?