加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Systemverilog中DPI使用指南--5

(2011-11-15 13:11:00)
标签:

杂谈

分类: ASIC
 

1.1 Open Array Data Type Mapping

开放的数组就是在SV中定义这个参数时,没有指定数组的深度,仅仅像这样子定义a[]。在C中,使用svOpenArrayHandle进行变量申明。对于Scalar变量,可以直接得到其指针,再操作数据。对于Packed变量,可以使用特定的函数进行访问。

int svLeft(const svOpenArrayHandle h, int d);

int svRight(const svOpenArrayHandle h, int d);

int svLow(const svOpenArrayHandle h, int d);

int svHigh(const svOpenArrayHandle h, int d);

int svIncrement(const svOpenArrayHandle h, int d);

int svSize(const svOpenArrayHandle h, int d);

int svDimensions(const svOpenArrayHandle h);

 

void *svGetArrayPtr(const svOpenArrayHandle);得到数组的指针。

int svSizeOfArray(const svOpenArrayHandle);数组的体积,按照字节计数。

void *svGetArrElemPtr(const svOpenArrayHandle, int indx1,...);

 

packed array进行写操作的函数。

void svPutBitArrElemVecVal(const svOpenArrayHandle d, const svBitVecVal* s, int indx1, ...);

void svPutBitArrElem1VecVal(const svOpenArrayHandle d, const svBitVecVal* s, int indx1);

void svPutBitArrElem2VecVal(const svOpenArrayHandle d, const svBitVecVal* s, int indx1, int indx2);

void svPutBitArrElem3VecVal(const svOpenArrayHandle d, const svBitVecVal* s,int indx1, int indx2, int indx3);

void svPutLogicArrElemVecVal(const svOpenArrayHandle d, const svLogicVecVal* s, int indx1, ...);

void svPutLogicArrElem1VecVal(const svOpenArrayHandle d, const svLogicVecVal* s, int indx1);

void svPutLogicArrElem2VecVal(const svOpenArrayHandle d, const svLogicVecVal* s, int indx1, int indx2);

void svPutLogicArrElem3VecVal(const svOpenArrayHandle d, const svLogicVecVal* s, int indx1, int indx2, int indx3);

packed array进行读操作的函数。

void svGetBitArrElemVecVal(svBitVecVal* d, const svOpenArrayHandle s, int indx1, ...);

void svGetBitArrElem1VecVal(svBitVecVal* d, const svOpenArrayHandle s, int indx1);

void svGetBitArrElem2VecVal(svBitVecVal* d, const svOpenArrayHandle s, int indx1, int indx2);

void svGetBitArrElem3VecVal(svBitVecVal* d, const svOpenArrayHandle s, int indx1, int indx2, int indx3);

void svGetLogicArrElemVecVal(svLogicVecVal* d, const svOpenArrayHandle s, int indx1, ...);

void svGetLogicArrElem1VecVal(svLogicVecVal* d, const svOpenArrayHandle s, int indx1);

void svGetLogicArrElem2VecVal(svLogicVecVal* d, const svOpenArrayHandle s, int indx1, int indx2);

void svGetLogicArrElem3VecVal(svLogicVecVal* d, const svOpenArrayHandle s, int indx1, int indx2, int indx3);

对标量开放数组的访问。

svBit  svGetBitArrElem  (const  svOpenArrayHandle  s,  int  indx1, ...);

svBit svGetBitArrElem1(const svOpenArrayHandle s, int indx1);

svBit  svGetBitArrElem2(const  svOpenArrayHandle  s,  int  indx1, int indx2);

svBit  svGetBitArrElem3(const  svOpenArrayHandle  s,  int  indx1, int indx2, int indx3);

svLogic svGetLogicArrElem (const svOpenArrayHandle s, int indx1, ...);

svLogic svGetLogicArrElem1(const svOpenArrayHandle s, int indx1);

svLogic svGetLogicArrElem2(const svOpenArrayHandle s, int indx1, int indx2);

svLogic svGetLogicArrElem3(const svOpenArrayHandle s, int indx1, int indx2, int indx3);

void svPutLogicArrElem (const svOpenArrayHandle d, svLogic value, int indx1, ...);

void svPutLogicArrElem1(const svOpenArrayHandle d, svLogic value, int indx1);

void svPutLogicArrElem2(const svOpenArrayHandle d, svLogic value, int indx1, int indx2);

void svPutLogicArrElem3(const svOpenArrayHandle d, svLogic value, int indx1, int indx2, int indx3);

void svPutBitArrElem (const svOpenArrayHandle d, svBit value, int indx1, ...);

void svPutBitArrElem1(const svOpenArrayHandle d, svBit value, int indx1);

void svPutBitArrElem2(const svOpenArrayHandle d, svBit value, int indx1, int indx2);

void svPutBitArrElem3(const svOpenArrayHandle d, svBit value, int indx1, int indx2, int indx3);

 

1.1.1 示例1  Two-Dimensional Open Array

// SystemVerilog side, test.sv

program p1;

   int a[6:1][8:3];

   import "DPI" function void mydisplay(inout int h[][]);

   initial begin

      for(int i=1;i<6;i++)

for(int j=3;j<8;j++) a[i][j]= i+j;

   mydisplay(a);

for(int i=1;i<6;i++)

   for(int j=3;j<8;j++) $display(a[i][j]);

   end

endprogram

#include <svdpi.h>

int i,j;

void mydisplay(svOpenArrayHandle h) {

   int lo1 = svLow(h,1);int hi1 = svHigh(h,1);

   int lo2 = svLow(h,2);int hi2 = svHigh(h,2);

   int *a;

   for(i=lo1;i<=hi1;i++)

      for(j=lo2;j<=hi2;j++) {

a =(int*)svGetArrElemPtr2(h,i,j);

printf("[%d][%d]=%d\n",i,j,*a);

*a = i*j;

      }

}

输出结果:这个例子,我有个疑问,当参数增加一个long long *p,这时的再对这个两维的数组进行访问就会出现奇怪的问题。C中维数变成1了,数组的大小还是正确的。目前不知道原因。

[1][3]=4

[1][4]=5

...

1.1.2 示例2

Example 26-16  Another Packed Array

// SystemVerilog side, test.sv

program p1;

   import "DPI" function void mydisplay(input bit[4:2] a[]);

   bit[4:2] a[8];

   initial begin

      for(int i=0;i<8;i++) a[i]= 15+i;

      for(int i=0;i<8;i++) $display("SV: a[%0d]",i,a[i]);

      mydisplay(a);

   end

endprogram

#include <svdpi.h>

int i;

void mydisplay(const svOpenArrayHandle a)

   {

      svBitVec32 c;

      int low = svLow(a,1);

      int high = svHigh(a,1);

      for(i=low;i<=high;i++) {

         svGetBitArrElemVec32(&c,a,i);

         printf("C: a[%d]=%d\n",i,c);

      }

   }

输出结果。

C: a[0]=7

C: a[1]=0

C: a[2]=1

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有