systemverilog与c之间字符串传递的DPI实现
0赞一、 sv与c之间字符串传递
sv和c之间,可以通过dpi接口,进行数据交互。对于字符串的传递,两边的dpi接口,要符合规范,才能进行正确传递。
1. sv传递字符串给c
如果sv要传递字符串给c,sv使用string类型,c使用char *类型,即可实现sv传递字符串给c。
比如:
sv中:
在调用c函数之前,需要使用import。声明该函数是外部函数。
import “DPI-C” function void hello(string name);
c中
执行结果:c中打印sv传递的信息。
2. c传递字符串给sv
如果c要传递字符串给sv,sv使用string类型,c使用char **类型,即可实现c传递字符串给sv。
比如:
c中,可以有三种传参方法。
局部传参:字符串地址在栈中分配
全局传参:字符串地址在代码中分配
malloc传参:字符串地址通过malloc函数分配
sv中
在调用c函数之前,需要使用import。声明该函数是外部函数。注意参数,要加output,说明这个参数是c输出,否则不能获取到c的结果。
import “DPI-C” function void hello(output string name);
执行结果:sv打印c返回的信息。
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。 |