卢骏 · 2020年07月12日

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

一、sv与c之间字符串传递

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

1.sv传递字符串给c

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

比如:

sv中:
1.png

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

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

c中

2.png

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

3.jpg

2.c传递字符串给sv

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

比如:

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

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

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

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

4.png

sv中

5.jpg

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

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

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

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

6.jpg

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。
image.png

#### 更多相关阅读
system verilog变量定义编译失败
systemverilog的process类
systemverilog的参数化类

原文首发于骏的世界博客
作者:卢骏
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。

推荐阅读
关注数
10974
内容数
1216
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息