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

时间:2014-11-11 09:21:21

标签: c system-verilog synopsys-vcs system-verilog-dpi

我有以下文件:

带有功能的C文件:

// funcs.c

#include <stdio.h>

void something() {
    printf("something\n");
    sayHello();
}

系统verilog文件:

// hello_world.v

module kuku;
    export "DPI-C" function sayHello;
    import "DPI-C" function void something();
    initial something();
    function int sayHello ();
        $display("hello world");
        sayHello = 1;
    endfunction
endmodule

如何编译它并使其工作,所以当我从SV调用something()时,它将调用C函数,当我从C调用sayHello()时,它将调用SV函数?

4 个答案:

答案 0 :(得分:8)

回答自己:

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

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

因此我在C文件中做的更改是添加以下行:

#include "vc_hdrs.h"

然后,我刚刚将C函数文件添加到VCS编译命令:

> vcs -sverilog hello_world.v funcs.c

有效!

我得到的输出是:

something
hello world

答案 1 :(得分:2)

适用于IEEE Std 1800-2012后面的所有模拟器的解决方案是#include "svdpi.h"并在导出到C的所有方法前面加上extern关键字前缀。 funcs.c 应该如下:

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

extern int sayHello();

void something() {
    printf("something\n");
    sayHello();
}

来自IEEE Std 1800-2012

的示例
  • §H.10.2示例2 - 简单打包数组应用程序
  • §H.10.3示例3-具有复杂混合类型的应用程序

答案 2 :(得分:0)

我看到你将SystemVerilog文件命名为.v扩展名。不确定这是否有效。但是,让我们说它的hello_world.sv

您的命令行应如下所示(对于Questa Simulator),

qverilog hello_world.sv funcs.c

“qverilog”用于编译和运行SystemVerilog文件。

这就是全部。无需添加额外的头文件

答案 3 :(得分:0)

您好我在这篇文章中提供了一个很好的例子 https://stackoverflow.com/a/46441794/5842403

Synopsys VCS

1)您使用标志编译C代码并引入您要添加的定义。 我们的C代码需要定义PYTHON_PATH

ControlComboBox="{Binding ManageComboBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

2)你进行VCS阐述,将python lybrary链接到 -LDFLAGS&#39; -lpython2.6&#39;

#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 

3)运行创建的模拟文件。您可以调用 simv ,包括 -sv_lib keycontrol_C_code_wrapper 来导入C共享对象。

vcs -timescale=1ps/1ps -ntb_opts uvm -lca -kdb -full64 keycontrol_tb_top -debug_access+all+reverse  -LDFLAGS '-lpython2.6'