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

问题描述 投票:3回答:4

我有以下文件:

带有功能的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函数?

c system-verilog synopsys-vcs system-verilog-dpi
4个回答
7
投票

回答我自己:

当使用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

2
投票

适用于跟随IEEE Std 1800-2012的所有模拟器的解决方案是在导出到C. funcs.c的所有方法前面都有#include "svdpi.h"和前缀extern前缀应该如下所示:

#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-具有复杂类型的应用程序

0
投票

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

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

qverilog hello_world.sv funcs.c

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

就这样。无需添加额外的头文件


0
投票

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

Synopsys VCS

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

#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)你做了VCS阐述,链接python lybrary和-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_lib keycontrol_C_code_wrapper来导入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
© www.soinside.com 2019 - 2024. All rights reserved.