我有以下文件:
带有功能的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函数?
答案 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();
}
的示例
答案 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'