4

我有以下文件:

带有函数的 C 文件:

// 函数.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

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

4

4 回答 4

9

回答我自己:

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

.

于 2014-11-11T09:25:35.783 回答
2

一个适用于所有遵循IEEE Std 1800-2012的模拟器的解决方案是在导出到 C 的所有方法前添加关键字#include "svdpi.h"并为其添加前缀。funcs.c应如下所示: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——具有复杂类型混合的应用程序
于 2014-11-11T16:39:19.227 回答
0

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

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

qverilog hello_world.sv funcs.c

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

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

于 2015-11-01T05:50:27.013 回答
0

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

新思科技 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库与-LDFLAGS'-lpython2.6'链接起来

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

3) 您运行创建的模拟文件。您调用包含-sv_lib keycontrol_C_code_wrapper 的simv来导入 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
于 2017-09-27T07:27:54.217 回答