当前位置: 首页> 汽车> 维修 > systemverilog中的DPI-C用例介绍

systemverilog中的DPI-C用例介绍

时间:2025/7/11 7:51:53来源:https://blog.csdn.net/hh199203/article/details/117983313 浏览次数: 0次

文章目录

  • 前言
  • 一、dpi_longint
  • 二、dpi_packed_array
  • 三、dpi_structure
  • 四、相关参考
  • 总结


前言

本文主要基于VCS内置的三个关于DPI-C的使用用例,记录一下DPI-C的使用方法。测试用例的路径为$VCS_HOME/doc/examples/testbench/sv/。测试用例包括:dpi_longint,dpi_packed_array,dpi_structure。


一、dpi_longint

这个例子主要介绍,利用DPI-C,在C代码中,修改SV中一个长整型的数据。在SV中,利用DPI-C,将长整型数据,通过指针传递到C函数中,并在C函数中进行修改打印,返回到SV时,数据已经被C修改。

如下为SV代码。

program p1;longint i1;import "DPI" function void mydisplay(inout longint i1);initial begini1=64'h1234_5678_9abc_def0;$display("SV: i1 is %0h",i1);mydisplay(i1);$display("SV(after DPI call): i1 is %0h",i1);endendprogram

如下为C代码,函数的参数为指针类型,利用指针实现C代码与SV代码共享内存空间,从而实现C代码中,修改SV代码中的变量。

#include "svdpi.h"
#include "vcsuser.h"extern "C" {void mydisplay(long long *i1) {io_printf("C: size of long long is %0d bytes\n",sizeof(long long));io_printf("C: i1 is %llx\n",*i1);(*i1) = (*i1) * 2;	io_printf("C: change i1 to %llx\n",*i1);}
}

如下为仿真log,可以看到C代码中修改值后,回到SV中,该变量的值也发生了改变。

SV: i1 is 123456789abcdef0
C: size of long long is 8 bytes
C: i1 is 123456789abcdef0
C: change i1 to 2468acf13579bde0
SV(after DPI call): i1 is 2468acf13579bde0

二、dpi_packed_array

这个例子主要演示,将SV中的数组传递给C,并在C中进行使用。

下面为SV代码,对数组a进行初始化并打印,然后将a传递给C。

program p1;import "DPI" function void mydisplay(input bit[4:2] a[]);bit[4:2] a[8];initial beginfor(int i=0;i<8;i++) a[i]= 15+i;for(int i=0;i<8;i++) $display("SV: a[%0d]=%0d",i,a[i]);mydisplay(a);endendprogram

如下为C代码,利用svOpenArrayHandle接收SV传递过来的数组,通过svLow获取数组的最低索引,通过svHigh获取数组的最高索引,然后通过svGetBitArrElemVec32获取数组里边的值,并循环打印该数组。

#include "vcsuser.h"
#include "svdpi.h"extern "C" {void mydisplay(const svOpenArrayHandle a) {svBitVec32 c;int low = svLow(a,1);int high = svHigh(a,1);for(int i=low;i<=high;i++) {svGetBitArrElemVec32(&c,a,i);io_printf("C: a[%d]=%d\n",i,c);}}
}

如下为仿真结果。

SV: a[0]=7
SV: a[1]=0
SV: a[2]=1
SV: a[3]=2
SV: a[4]=3
SV: a[5]=4
SV: a[6]=5
SV: a[7]=6
C: a[0]=7
C: a[1]=0
C: a[2]=1
C: a[3]=2
C: a[4]=3
C: a[5]=4
C: a[6]=5
C: a[7]=6

三、dpi_structure

这个例子主要演示SV中的结构体,如何通过DPI-C传递到C代码中进行修改。

以下是SV代码,对SV中的结构体初始化打印后,传递给C。

program p1;typedef struct {int a;int b;} mystruct;import "DPI" function void mydisplay(inout mystruct s1);mystruct s1;initial begins1.a =10;s1.b =20;$display("SV: s1.a=%0d,s1.b=%0d",s1.a,s1.b);mydisplay(s1);$display("SV after DPI call: s1.a=%0d,s1.b=%0d",s1.a,s1.b);end endprogram

以下是C代码,参数传递是结构体指针。

#include "stdio.h"
#include "svdpi.h"extern "C" {typedef struct {int a;int b;}  mystruct;void mydisplay(mystruct *s1) {int s2;printf("C: gets values from SV, s1.a=%d, s1.b=%d\n",s1->a,s1->b);s1->a = 100;s1->b = 200;printf("C: set values,  s1.a=%d, s1.b=%d\n",s1->a,s1->b);}	
}

仿真结果如下:

SV: s1.a=10,s1.b=20
C: gets values from SV, s1.a=10, s1.b=20
C: set values,  s1.a=100, s1.b=200
SV after DPI call: s1.a=100,s1.b=200

四、相关参考

SV和C之间的参数索引表
SV和C之间的参数索引表
4状态类型SV与C之间的对应关系
4状态类型SV与C之间的对应关系

C中提供的队列访问函数。
在这里插入图片描述
在这里插入图片描述


总结

本文主要通过VCS自带的三个DPI-C测试用例,记录一下SV中DPI-C的使用方法。

关键字:systemverilog中的DPI-C用例介绍

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: