Verilog与C之间进行程序交互,PLI(Programming Language Interface)经过了TF,ACC,VPI等模式。
使用PLI可以生成延时计算器,来连接和同步多个仿真器,并可以通过波形显示等调试工具。
通过PLI方式连接一个简单的C程序,需要编写很多代码,并理解多仿真阶段的同步,调用段,实例指针等概念。
PLI方式给仿真带来了额外的负担,为了保护Verilog的数据结构,仿真器需要不断的在Verilog和C之间复制数据。
SystemVerilog引入了DPI(Direct Programming Interface),能够更简洁的连接C,C++或者其他非Verilog的编程语言。
只要使用import声明和使用,导入一个C子程序,就可以像调用SystemVerilog中的子程序一样来调用它。
SystemVerilog和C语言之间传递的最基本的数据类型是int,双状态的32位的数据类型,
通过import声明定义C任务和函数的原型,带有返回值的C函数被映射成一个systemverilog的函数(function),
void类型的C函数被映射为一个systemverilog的任务(task)或者void 函数(function)
通过“DPI-C”引入的C函数,可以直接在function中调用,但是只在该DPI被声明的空间内有效,
所以可以在package中将所有的DPI函数在做封装,打包为function。然后在需要的地方,import package。
使用关键字DPI-C表示,使用压缩值(packed)的方式来保存数据类型。
import "DPI-C" function int factorial(input int i);
program automatic test;
initial begin
for(int i=1;i<=10;i++)
$dispaly("%0d != %0d",i,factorial(i)); //像调用正常的function int一样。
end //凡是可以声明function的地方,module,program,interface,package都可以import DPI
endprogram
如果C函数名和SystemVerilog中的命名冲突,可以在import导入时,赋予新的函数名。
import "DPI-C