为了方便与C、C++等语言的交互,uvm中引入了DPI接口,自定义的函数需要写函数主体,然后再import后声明和使用,验证环境中便可以像调用system verilog中的函数一样使用这些函数。
而且,对于C语言中内置的函数,不需要写函数主体,直接声明使用.
1.自定义的函数主体;需要注意的是导入不同c函数需要加入对应的.h文件例如svdpi.h、string.h
#include <svdpi.h>
void mul_test(
svBitVecVal *out_data,
const svBitVecVal *in_data)
{
*out_data = *in_data*2;
}
2.import声明
在import的时候需要函数的主体转化为system verilog可以识别的函数,如数据的类型:double ->real,svBitVecVal->bit;在转换的时候,要确保数据类型的一致性,否则,可能会导致函数结果与预期不一致;
import "DPI-C" function void mul_test(
output bit [7:0] out_data,
input bit [7:0] in_data
);
import "DPI-C" function real sin(input real in_data);
3.调用使用
initial begin
tan_data = 0.5;
o_tan_data = sin(tan_data);
$display("tan_data is %0f,o_tan_data is%0f",tan_data,o_tan_data);
in_data = $urandom_range(8'h5,8'hff);
mul_test(out_data,in_data);
$display("in_data is 0x%0h,out_data is 0x%0h",in_data,out_data);
4.执行效果
tan_data is 0.500000,o_tan_data is 0.479426
in_data is 0x49,out_data is 0x92
5.C与system verilog数据类型的对应关系
SystemVerilog C(输入) C(输出)
byte char char*
short int short int short int*
int int int*
longint long long int long int*
real double double*
string const char* char**
string[N] const char** char**
bit svBit/unsigned char svBit*/unsigned char
logic/reg svLogic/unsigned char svLogic*/unsigned char*
bit[N:0] const svBitVecVal* svBitVecVal*
reg[N:0] const svLogicVecVal* svLogicVecVal*
open array[] const svOpenArrayHandle svOpenArrayHandle
chandle const void* void*
6.封装
在定义时可以将定义函数实体时,可以将其存放到.c文件当中集中管理;用import导入时存放到.svh文件集中管理;在编译的时候调用此文件即可.