标签:
																				
                            杂谈 | 
					分类: 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
void svPutLogicArrElem2VecVal
void svPutLogicArrElem3VecVal
对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
void svGetLogicArrElem2VecVal
void svGetLogicArrElem3VecVal
对标量开放数组的访问。
svBit 
svBit svGetBitArrElem1(const svOpenArrayHandle s, int indx1);
svBit 
svBit 
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;
 
 
 
 
for(int j=3;j<8;j++) a[i][j]= i+j;
 
for(int i=1;i<6;i++)
 
 
endprogram
#include <svdpi.h>
int i,j;
void mydisplay(svOpenArrayHandle h) {
 
 
 
 
 
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 
// SystemVerilog side, test.sv
program p1;
 
 
 
 
 
 
 
endprogram
#include <svdpi.h>
int i;
void mydisplay(const svOpenArrayHandle a)
 
 
 
 
 
 
 
 
 
输出结果。
C: a[0]=7
C: a[1]=0
C: a[2]=1

加载中…