今天早上复习了DPI,发现cadence的sysverilog.pdf上gcc编译c语言少了个选项
今天又重新拾起cosim,却发现怎么编译都报错,找了之前的ppt,又仔细观摩了NC的systemverilog.pdf,就是不行,老是报这个错误:
icds:liawang@shaltc01:[~/nc_prj/nc_dpi_first]> ncsim -sv_lib hello hello
ncsim: 09.20-s016: (c) Copyright 1995-2010 Cadence Design Systems, Inc.
ncsim: *W,NOLDPI: Unable to load hello.
OSDLERROR: ./hello.so: cannot open shared object file: No such file or directory or file is not valid ELFCLASS32 library..
ncsim: *F,NOFDPI: Function pass_string_c not found in any of the shared object specified with -SV_LIB switch.
我简直头大,一切都是按照Cadence的sysverilog.pdf来的啊,怎么就能出错呢?
ncvlog -sv hello.sv
ncelab -access +RWC hello
gcc -fPIC -shared -o libdpi.so hello.c -I /tools/ius-9.20.016/tools/inca/include
ncsim -messages hello
显然是c语言文件生成的so文件没有被ncsim正确load,那么问题出在哪儿呢?问题大概出现在gcc的编译选项上。后来看了之前自己的笔记,发现这个gcc的编译选项漏了-m32,加上以后真的就好了!
icds:liawang@shaltc01:[~/nc_prj/nc_dpi_first]> ncsim -sv_lib hello hello
ncsim: 09.20-s016: (c) Copyright 1995-2010 Cadence Design Systems, Inc.
ncsim> run
DPI: pass it ON
Exported Verilog String=
string passed from C
Verilog: C: give up a string
Gimme String
Simulation complete via $finish(1) at time 0 FS + 0
./hello.sv:22
$finish;
ncsim> exit
下面两个文件分别是设计文件和c文件,后面还有在nc环境下的仿真命令:
//hello.sv
module hello();
import "DPI-C" context pass_string_c= task pass_string_sv(input string a);
import "DPI-C" context string_c2v_c= function string string_c2v_sv();
string some_string;
// This doesnt work in IUS583, will work in IUS6.0
export "DPI-C" print_string_c = function print_string_sv;
function void print_string_sv(input string aaa);
$display("Exported Verilog String=
%s", aaa);
endfunction
initial
begin
some_string = "pass it ON";
// enable when running IUS6.0
pass_string_sv(some_string);
// pass string to C
$display("Verilog: %s \n", string_c2v_sv() );
// get string from C
$finish;
end
endmodule
//hello.c
#include <stdio.h>
#include <svdpi.h>
// to use io_printf (prints to ncsim.log)
#include <veriuser.h>
void pass_string_c(const char* a) {
io_printf("DPI: %s\n", a);
// now call exported function
print_string_c("string passed from C");
// This wont work in IUS583
}
const char* string_c2v_c(void) {
io_printf("C: give up a string\n");
return "Gimme String";
}
//cmd
ncvlog -sv hello.sv
ncelab -access +RWC hello
gcc -m32 -fPIC -shared -o libdpi.so hello.c -I /tools/ius-9.20.016/tools/inca/include
ncsim -messages hello
我还没来得及看-m32选项的作用,希望大家能够顺利cosim
补充一句,sysverilog.pdf里还提供一种一步仿真的方法,就是这个命令:
irun hello.sv hello.c
这个对入门者比较简单,呵呵
谢谢你的文章,正在研究DPI,有机会多多讨论。
好东西啊 nice
pei fu ,pei fu
这里的.so文件应该是编译完的链表文件吧,是不是不能直接运行的那种?
.so是库文件
Cadence的sysverilog.pdf, 能上传一下吗?
研究DPI中,可以多多讨论。
nice good
不错。
我最早产生的也是这个问题。-m32的作用是在64位主机上编译产生32位的目标代码。
看看...
挺好。
高人,谢谢你的帖子,很有价值。
交流个问题:
我有很多C function,还有个main函数,main函数实现将C function调用,完成图像处理的某些功能;
我想在我的仿真环境中用DPI调用C,但是main函数做得很好,支持命令行参数,所以我想在SV环境中调用main函数,并传递适当的参数,这样做可以吗?
谢谢
抱歉,这么晚才看到你的疑问,我想你可能需要把这个main函数改写一下,命名成别的,应该照样可以传递命令行参数的