我想用verilog与c沟通。我发现Verilog PLI可以解决我的问题。我阅读本网站了解http://www.asic-world.com/verilog/pli1.html#How_it_Works。但我仍然无法工作甚至printf功能。我使用ncverilog进行verilog编译。我所做的就是打击。我无法成功编译。它说它无法找到功能。谁能告诉我如何解决我的问题。谢谢=)
C代码:hello.c
#include<stdio.h>
void hello(){
printf("HELLO");
}
制作图书馆:
gcc hello.c -fPIC -shared -o hello.so
verilog代码:test.v
module test();
initial begin
$hello;
#10 $finish;
end
endmodule
verilog命令:
ncverilog test.v +access+r -v hello.so
答案 0 :(得分:2)
VPI (PLI 2.0)
hello_vpi.c:
#include<stdio.h>
#include <vpi_user.h>
void hello(){
printf("HELLO");
}
void register_hello()
{
s_vpi_systf_data data;
data.type = vpiSysTask; //vpiSysFunc;
// data.sysfunctype = vpiSysFuncInt; // return type if type is Func
data.tfname = "$hello";
data.calltf = hello;
data.compiletf = 0;
data.sizetf = 0;
data.user_data = 0;
vpi_register_systf(&data);
}
命令:
gcc hello_vpi.c -fPIC -shared -o hello_vpi.so
ncverilog test.v +access+r -loadvpi ./hello_vpi.so:register_hello
PLI 1.0 要求在s_tfcell veriusertfs[]
中定义verilog中使用的所有C方法。 Ncverilog需要一个返回类型p_tf_cell
的额外引导方法,此方法定义静态s_tfcell veriusertfs[]
。这是一个例子:
veriuser_nc.c:
#include "veriuser.h"
#include "acc_user.h"
extern void hello();
#define user_task 1
#define user_function 2
p_tfcell my_boot() {
s_tfcell veriusertfs[] = {
/* {user_function/usertask, (int)data, pli_checkp, pli_sizep, pli, ?, verilog_name, ? } */
{usertask, 0, 0, 0, hello, 0, "$hello", 1},
{0} // last entry must be 0
};
return(veriusertfs);
}
命令:
gcc hello.c veriuser_nc.c -fPIC -shared -o hello_pli.so
ncverilog test.v +access+r -loadpli1 ./hello_pli.so:my_boot
VCS需要选项卡文件而不是引导程序方法。这里略有介绍:http://www.asic-world.com/verilog/pli2.html#Linking_With_Simulator
另一种方法是使用 SystemVerilog DPI ,它没有与PLI / VPI相同的包装/翻译层。
将#include "svdpi.h"
添加到hello.c的头部。我只是更改共享对象名称以标识库类型(不是必需的)。 gcc hello.c -fPIC -shared -o hello_dpi.so
verilog代码:test.sv
module test();
import "DPI-C" pure function void hello();
// DPI methods are treated as verilog task/function after import, including scope access
initial begin
hello(); // dpi doesn't have a $
#10 $finish;
end
endmodule
verilog命令:
ncverilog -sv test.sv +access+r -sv_lib hello_dpi.so
有关DPI的文档位于IEEE std 1800-2012§35。直接编程界面。 PLI / VPI在第36节中介绍,但不包括模拟器的特定要求。有关DPI的更多说明和教程,请结帐http://en.wikipedia.org/wiki/SystemVerilog_DPI和http://www.doulos.com/knowhow/sysverilog/tutorial/dpi/