[转]怎样在systemverilog DPI中调用SV,C与C++(二)

有的时候需要交互struct,union数据类型,下面举个简单例子。

在SV里定义这个一个结构体:

typedef struct {    int     id;     string  name;} xaction; 

同样的,在C里定义同样的结构体,结构体名可以不一致:

typedef struct {    int     id;     char*   name;    } c_xaction;

下面把这个结构体传递给C,让C打印出来,SV中做好接口:

import "DPI-C" function void c_print(input xaction x);

C中实现打印函数:

void c_print (c_xaction* x) {                                                                                                                                                                    printf("id = %0d, name = %s\n", x->id, x->name);}

这里需要注意很重要的一点,SV中的形参类型是xaction, 而C中的形参类型是结构体指针,不可以搞错。

        xaction x;         x.id    = 2;        x.name  = "abc";         c_print(x);

打印出:id = 2, name = abc

下面再来看看union的情形,DPI只能传递packed union, 不熟悉packed概念的请参考SV LRM IEEE1800.

SV:

typedef union packed{ int i; bit[31:0] f; } num;

C:

typedef union { int i; float f; } num; 

这时和struct一样,C中的形参只能为指针类型。这里取个巧,把第二个数做成float类型。在sv中赋值:

n.i = 32’h3FFF_FFFF;

这时在C中printf n.f会得到2.000000.注意高低位

struct中套struct可以支持,只要是packed类型就可以,但是注意struct指定位宽是用不了DPI的:

typedef struct {    int     n0 : 10 ;     int     n1 : 6;} invalid_xaction;

---------------------
作者:seabeam
来源:CSDN
原文:https://blog.csdn.net/seabeam/article/details/42710223
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值