[转载]Systemverilog中DPI使用指南--2
(2014-02-21 16:39:30)
标签:
转载 |
第1章 任务和函数
1.1 导入的任务和函数
语法:
import "DPI" [c_identifier =] [pure][context] function type name (args);
import "DPI" [c_identifier =] [context] task name (args);
规则说明:
1.
使用context修饰的函数和任务,可以访问申明时的范围内的变量,而不仅仅局限在他的参数上。函数可以是pure,context或者其他类型的,任务只能是context或者non-context类型的。Context会导致仿真的效率变低,所以应当慎重使用。如果某个导出的函数或者任务,在C的环境中,需要通过PLI,VPI访问SV范围内的全局变量,或者调用EXPORT的函数或任务,那么需要Context修饰符。
// SystemVerilog side, test.sv
module top;
endmodule
module m1;
endmodule
module m2;
endmodule
#include <svdpi.h>
extern int sv_display();
这个TB的执行结果如下:
C: c_display
SV: m1
C: c_display
SV: m2
C: c_display
SV: top
// SystemVerilog side, test.sv
module top;
endmodule
module m1;
import "DPI" context function void c_display();
endmodule
module m2;
endmodule
#include <svdpi.h>
#include <vcsuser.h>
这个TB的执行结果如下:
C: c_display
SV: m1
C: c_display
SV: m1
C: c_display
SV: m1
显然,在C函数中修改了Scope,那么sv_display将使用这个Scope中的导出任务。
2.
使用Pure的函数能够提高仿真效率。当函数的结果仅仅依赖它的输入参数时,可以使用pure修饰符,这样的函数是non_void类型的,他的参数没有output和inout类型。这样的函数不能进行任何文件操作,访问任何其余的变量。
3.
可以是input,output,inout,不能是ref。
4.
必须是简单类型。
1.2 导出的任务和函数
语法:
export "DPI" [c_identifier =] function name;
export "DPI" [c_identifier =] task name;
1.3 示例
#include <svdpi.h>
extern void abp_write(int, int);
void c_test(int base) {
addr, data);
}
// SystemVerilog side, test.sv
import "DPI" context task c_test(input int base_addr);
program top;
endprogram

加载中…