在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4161|回复: 10

[求助] 怎么在sv中通过dpi调用含有struct结构体的c函数

[复制链接]
发表于 2022-7-21 09:30:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
sm4.c函数的头函数sm4.h如下:
typedef struct
{
    int mode;
    unsigned long sk[32];
}sm4_context;

void sm4_setkey_enc(sm4_context *ctx,unsigned char key[16]);

求助:
我想使用dpi在sv中调用该函数的话,首先修改c函数的接口:
sm4_dpi.c

#include<svdpi.h>
typedef struct
{
  int mode;
  svBitVecVal sk;
}sm4_context;

void sm4_setkey_enc_dpi(sm4_context ctx,
                                    sonst svBitVecVal key[]16])
{
sm4_context *ctx = (sm4_context*) ctx;
sm4_setkey_enc(&ctx,key);
}

然后在sv中调用:
typedef struct{
  int mode;
  bit [31:0] sk[32];
}sm4_context;

inport "DPI-C" function void sm4_setkey_enc_dpi(output sm4_context ctx,
                                                                           input bit [7:0] key[16]);


运行到仿真阶段后,直接虚拟内存爆了,想问问,我是哪里数据类型映射出错了吗?

发表于 2022-7-21 17:42:42 | 显示全部楼层
svBitVecVal sk[32];
发表于 2022-7-22 09:12:42 来自手机 | 显示全部楼层
不用改c应该,struct在sv定义一个一样的,char用byte数组就好了
发表于 2022-8-2 21:21:07 | 显示全部楼层
本帖最后由 qsh123_123 于 2022-8-10 12:20 编辑

C侧的DPI只需要改造一下结构体指针的取地址即可:
========C 侧 =========
#include<svdpi.h>
void sm4_setkey_enc_dpi(sm4_context ctx,
                                    unsigned char key[16])
{
sm4_context *ctx_tmp = (sm4_context*) ctx;
sm4_setkey_enc(&ctx_tmp, key);

C接口的typedef结构体,可以直接在sv侧定义对应的同名结构体,数据结构反向排列一下:
======SV 侧 ========
typedef struct
{
    unsigned longint sk[32];
    int mode;
}sm4_context;

inport "DPI-C" function void sm4_setkey_enc_dpi(inout sm4_context ctx,
                                                                           input bit key[16]);

---------------------------------------
顺便补充回答一些可能产生的疑问,楼主的代码报的是内存溢出问题,这里面有两个地方都导致内存爆了:
1,原始的C函数sm4_setkey_enc的第二个参数key[16],声明的类型unsigned char在C侧映射到sv侧是svBit/svLogicVec32数据类型,虽然bit本身是个2值变量,但因为映射时为了跟logic/reg这类4值变量兼容的原因(需要存储0/1/x/z这4种状态,用aval和bval两个bit来存储;且4值变量的赋值还有强度/优先级的问题所以还需要额外的cval和dval来存储),所以在映射的时候,1位svBit映射需要一个字节来存储映射(内存存储以字节为单位),对应成C侧同样一个字节的unsigned char;你在sv侧使用了svBitVecVal改造成多个比特的svBit的向量,SV侧的input bit [7:0] key[16]这样的8个svBit的变量,映射到C侧是8*16字节的内存空间来存储,而C侧的unsigned char key[16]则只需要1*16字节来存储,所以内存爆了;
2,C侧的结构体里面的成员unsigned long sk[32], 其中unsigned long (int)在32位系统和64位系统分别是4字节和8字节,直接改造成bit[31:0] sk[32]是不对的,假如是32位系统或许不会报内存溢出(待定),但64位系统会报错;直接改造成对应的longint就可以了,加多个unsigned前缀即可;另外,C侧的结构体共享到SV侧的时候,是按照word/byte反方向来排列的。所以sv侧的结构体内部需要上下倒过来排列一下。
 楼主| 发表于 2022-8-3 11:55:07 | 显示全部楼层


qsh123_123 发表于 2022-8-2 21:21
C侧的DPI只需要改造一下结构体指针的取地址即可:
========C 侧 =========
#include


谢谢大哥!明白了!
 楼主| 发表于 2022-8-3 15:52:34 | 显示全部楼层


qsh123_123 发表于 2022-8-2 21:21
C侧的DPI只需要改造一下结构体指针的取地址即可:
========C 侧 =========
#include


顺便请问有哪份文档能查到结构体相关的DPI介绍吗?
发表于 2022-8-4 10:55:11 | 显示全部楼层


赵家铁憨憨 发表于 2022-8-3 15:52
顺便请问有哪份文档能查到结构体相关的DPI介绍吗?


中文的话,绿皮书,《Systemverilog验证--测试平台编写指南》,【美】克里斯·斯皮尔,最后一章节。。
英文的话,关于Systemverilog的都有,如《IEEE Standard for SystemVerilog--Unified Hardware Design, Specification, and Verification Language》


 楼主| 发表于 2022-8-5 13:38:13 | 显示全部楼层


qsh123_123 发表于 2022-8-4 10:55
中文的话,绿皮书,《Systemverilog验证--测试平台编写指南》,【美】克里斯·斯皮尔,最后一章节。。
英 ...


我这一章节看了好几遍了没咋看明白,你这么一说我再看,就懂了
发表于 2022-8-10 00:30:41 来自手机 | 显示全部楼层


qsh123_123 发表于 2022-8-2 21:21
C侧的DPI只需要改造一下结构体指针的取地址即可:
========C 侧 =========
#include


大佬,笔误么?
unsigned char在c一侧应该是8 bits才对吧
发表于 2022-8-10 14:36:12 | 显示全部楼层


seabeam 发表于 2022-8-10 00:30
大佬,笔误么?
unsigned char在c一侧应该是8 bits才对吧


噢,这里用bit来阐述是有歧义,这段我补充说明下。
sv侧的bit数据类型,映射到C侧应该用svBit来表示的,而C侧本身在计算机里面也有字节和bit的概念,但它们实际上并不一样。因为sv侧的bit数据类型虽然本身2值变量,但为了兼容logic/reg这类硬件描述语言才有的4值变量,这类4值变量除了0/1两种状态外,还需要存储x/z这两种状态,所以其存储不能用单个bit来存储。

所以systemverilog的bit类型,在映射到C侧的头文件svdpi.h里面时,用svBit/svLogicVec32表示,对应映射成单字节的unsigned char类型。
可以简单粗暴地理解为,SV的1个bit/logic/reg,在C/C++里面都需要1个字节(8个bit)来映射和存储。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 07:07 , Processed in 0.025052 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表