SystemVerilog:如何在VCS模拟器中使用DPI调用连接C函数?

SystemVerilog:如何在VCS模拟器中使用DPI调用连接C函数?,c,system-verilog,synopsys-vcs,system-verilog-dpi,C,System Verilog,Synopsys Vcs,System Verilog Dpi,我有以下文件: C文件及其函数: //funcs.c #include <stdio.h> void something() { printf("something\n"); sayHello(); } 我如何编译它并使其工作,这样当我从SV调用something()时,它将调用C函数,当我从C调用sayHello()时,它将调用SV函数?回答我自己: 使用VCS编译SV代码时,首先将其转换为C代码 从SV导出函数时,它会生成一个C头文件vc_hdrs.h,该文件

我有以下文件:

C文件及其函数:

//funcs.c

#include <stdio.h>

void something() {
    printf("something\n");
    sayHello();
}
我如何编译它并使其工作,这样当我从SV调用
something()
时,它将调用C函数,当我从C调用
sayHello()
时,它将调用SV函数?

回答我自己:

使用VCS编译SV代码时,首先将其转换为C代码

从SV导出函数时,它会生成一个C头文件
vc_hdrs.h
,该文件应包含在C文件中

所以我在C文件中做的一个更改是添加以下行:

#include "vc_hdrs.h"
然后,我刚刚将C函数文件添加到VCS编译命令中:

> vcs -sverilog hello_world.v funcs.c
它起作用了

我得到的结果是:

something
hello world

.

一种适用于以下所有模拟器的解决方案是在导出到C的所有方法前面添加
#包括“svdpi.h”
和前缀
extern
关键字。funcs.C应该如下所示:

#include <stdio.h>
#include "svdpi.h"

extern int sayHello();

void something() {
    printf("something\n");
    sayHello();
}
#包括
#包括“svdpi.h”
extern int sayHello();
使某物无效{
printf(“某物”);
你好;
}
来自

  • §H.10.2示例2-简单压缩阵列应用
  • §H.10.3示例3-复杂混合类型的应用

我看到您将SystemVerilog文件命名为.v扩展名。不确定这是否有效。但是如果是hello_world.sv

您的命令行应该如下所示(对于Questa模拟器)

“qverilog”是编译和运行SystemVerilog文件


就这些。不需要添加额外的头文件

嗨,我在这篇文章下面提供了一个很好的例子

Synopsys VCS

1) 使用标志编译C代码,并引入要添加的定义。 在本例中,我们的C代码需要define PYTHON_路径

#GCC in two steps for shared object
gcc -g -D 'PYTHON_PATH="'$PYTHON_DIR'"'  -fPIC -Wall -I${VCS_HOME}/include -I/usr/include/python2.6/ -lpython2.6 -c ${PROJECTDIR}/verification/PVE/keycontrol/tb/keycontrol_C_code_wrapper.c 
gcc -fPIC -shared -o keycontrol_C_code_wrapper.so  keycontrol_C_code_wrapper.o 
2) 您可以使用-LDFLAGS'-lpython2.6'

vcs -timescale=1ps/1ps -ntb_opts uvm -lca -kdb -full64 keycontrol_tb_top -debug_access+all+reverse  -LDFLAGS '-lpython2.6'
3) 运行创建的模拟文件。调用simv包括-sv\u lib keycontrol\u C\u code\u包装器来导入C共享对象

#RUN C CODE
./simv -gui -ucli +DVE +UVM_NO_RELNOTES  -l simv.log  +UVM_TESTNAME=keycontrol_basic_test -do ../../verification/PVE/keycontrol/tools/keycontrol_ucli_init.synopsys -sv_lib keycontrol_C_code_wrapper

我必须在import语句中添加“context:
import“DPI-C”上下文函数void something()
vcs -timescale=1ps/1ps -ntb_opts uvm -lca -kdb -full64 keycontrol_tb_top -debug_access+all+reverse  -LDFLAGS '-lpython2.6'
#RUN C CODE
./simv -gui -ucli +DVE +UVM_NO_RELNOTES  -l simv.log  +UVM_TESTNAME=keycontrol_basic_test -do ../../verification/PVE/keycontrol/tools/keycontrol_ucli_init.synopsys -sv_lib keycontrol_C_code_wrapper