我有以下文件:
带有功能的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函数?
回答我自己:
当使用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
适用于跟随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的例子
我看到你已将SystemVerilog文件命名为.v扩展名。不确定这是否有效。但是,让我们说它的hello_world.sv
您的命令行应如下所示(对于Questa Simulator),
qverilog hello_world.sv funcs.c
“qverilog”是编译和运行SystemVerilog文件。
就这样。无需添加额外的头文件
嗨,我在这篇文章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