weiqi7777

systemverilog与c之间字符串传递的DPI实现

0
阅读(4261)

一、            svc之间字符串传递

svc之间,可以通过dpi接口,进行数据交互。对于字符串的传递,两边的dpi接口,要符合规范,才能进行正确传递。

1.      sv传递字符串给c

如果sv要传递字符串给csv使用string类型,c使用char *类型,即可实现sv传递字符串给c

       比如:

       sv中:

clip_image001

       在调用c函数之前,需要使用import。声明该函数是外部函数。

              import “DPI-C” function void hello(string name);

 

       c

clip_image002

 

       执行结果:c中打印sv传递的信息。

clip_image004

 

2.      c传递字符串给sv

       如果c要传递字符串给svsv使用string类型,c使用char **类型,即可实现c传递字符串给sv

       比如:

       c中,可以有三种传参方法。

局部传参:字符串地址在栈中分配

全局传参:字符串地址在代码中分配

malloc传参:字符串地址通过malloc函数分配

clip_image005

 

       sv

clip_image007 就获取到了c中的字符串。

在调用c函数之前,需要使用import。声明该函数是外部函数。注意参数,要加output,说明这个参数是c输出,否则不能获取到c的结果。

              import “DPI-C” function void hello(output string name);

 

       执行结果:sv打印c返回的信息。

clip_image009

 

       sv中的string类型变量a,和c中二重指针**p,对比:

变量a,本身有一个地址值

变量p,本身也有一个地址值

a = “hello”

a指向字符串hello的首地址,也就是将hello首地址值保存在a中。

 

*p = “hello”

*p保存字符串hello的首地址,也就是将hello首地址保存在p变量中,p指向hello的空间

$display(“%s”,a),将a指向的空间的数据进行打印,也就是hello

printf(“%s”,*p),将p指向的空间的数据进行打印,也就是hello