オープン配列でSVとシェアするには?
 
 
SV とC++間で、配列のインターフェースには、二つの方法があります。
 
(1)オープン配列を用いない方法
 
ひとつは、次のようにSVで宣言している配列をそのまま引き渡す方法です。次の例は、アンパックド構造体配列の例です。1次元、2次元、3次元の例です。
 
SVソースです。  
 
module test;
 
 
 typedef struct   {
		byte red;
		byte green;
		byte blue;
	} RGB_TYPE;
 
 
 
 
	import "DPI-C" function void set_fixed1(inout RGB_TYPE mem [10:1  ]);
	import "DPI-C" function void set_fixed2(inout RGB_TYPE mem [10:1][3:2  ]);
	import "DPI-C" function void set_fixed3(inout RGB_TYPE mem [10:1][3:2][4:3  ]);
 
	RGB_TYPE m1[10:1];
	RGB_TYPE m2 [10:1][3:2];
	RGB_TYPE m3 [10:1][3:2][4:3];
 
         initial begin
//1-D
		for (int i=1;i<=10;i++) begin
			m1[i].red=i;
			m1[i].green=i+1;
			m1[i].blue=i+2;
		end
		set_fixed1(m1);
 
 
//2-D
		for (int m=1;m<=10;m++) 
			for (int n=2;n<=3;n++) begin
				m2[m][n].red=m<<3 | n;
				m2[m][n].green=m<<3 |  n+1;
				m2[m][n].blue= m<< 3| n+2;
			end
		set_fixed2(m2);
 
//3-D
		for (int m=1;m<=10;m++) 
			for (int n=2;n<=3;n++) 
				for (int i=3;i<=4;i++) begin
					m3[m][n][i].red=m<< 4 | n<<3 | i;
					m3[m][n][i].green=m<<4 | n<<3 | i+1;
					m3[m][n][i].blue= m<< 4 | n<<3 | i+2;
			end
		set_fixed3(m3);
 
 
	end
 
 
 
endmodule
 
 VeritakSVが出力したCヘッダファイルです。配列の最初の要素の構造体配列の先頭アドレスだけが渡される点に注意してください。
(つまり、配列の次元や大きさの情報は失われC側では、判りません。)
 
 
 
 

 /* Copyright 2011 www.sugawara-systems.com
* Note:
* This file is automatically generated.
* Please do not edit this file - you will lose your edits.*/

 
#ifndef INCLUDED_DPIHEADER
#define INCLUDED_DPIHEADER
#ifdef __cplusplus
#define DPI_LINK_DECL extern "C"
#else
#define DPI_LINK_DECL
#endif
#include "svdpi.h"

 
typedefstruct {
 char red;
 char green;
 char blue;
} RGB_TYPE;
 
DPI_LINK_DECL DPI_DLLESPEC
void set_fixed1(RGB_TYPE*);
 
DPI_LINK_DECL DPI_DLLESPEC
void set_fixed2(RGB_TYPE*);
 
DPI_LINK_DECL DPI_DLLESPEC
void set_fixed3(RGB_TYPE*);

 
 
 C++ソースファイルです。配列のインデックスは、0ベースで正規化した値になっていることに注意してください。C構造体配列の生ポインタがそのまま渡されるので、余計なオーバヘッドが
なく高速にアクセスできます。 構造体配列は、下表のようにC上の配置と同じになります。
 
↓m1構造体配列の先頭








0 1 2 3 4 5 6 7 8 9 C++
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] SV
red red red red red red red red red red
green green green green green green green green green green
blue blue blue blue blue blue blue blue blue blue











↓m2構造体配列の先頭








0 1 2 3 4 5 6 7 8 9 C++
[1][2] [1][3] [2][2] [2][3] [3][2] [3][3] [4][2] [4][3] [5][2] [5][3] SV
red red red red red red red red red red
green green green green green green green green green green
blue blue blue blue blue blue blue blue blue blue











↓m3構造体配列の先頭








0 1 2 3 4 5 6 7 8 9 C++
[1][2][3] [1][2][4] [1][3][3] [1][3][4] [2][2][3] [2][2][4] [2][3][3] [2][3][4] [3][2][3] [3][2][4] SV
red red red red red red red red red red
green green green green green green green green green green
blue blue blue blue blue blue blue blue blue blue
 
 
しかし、配列の次元や、配列の大きさがSVソース側で変わってしまうと、こちらのDLLもそれに合わせて(ソースで記述している次元や大きさの数字を変更して)再コンパイルする必要があります。SV側に設計変更があったとき、C側もメンテナンスする必要があります。でないと不正なアクセスとなりクラッシュや再現しづらいエラーを招く可能性があります。メンテナンス性が悪いことがこの方式の欠点です。
 
void set_fixed1(RGB_TYPE *mem){
    for (int m=0;m<10;m++){
     printf("mem1[%3d]={%2x,%2x, %2x}\n",m,mem[m].red,mem[m].green,mem[m].blue);
    }
 
}
void set_fixed2(RGB_TYPE *mem ){
    for (int m=0;m<10;m++){
        for (int n=0;n<2;n++){
            printf("mem2[%3d][%3d]={%2x,%2x, %2x}\n",
                        m,n,mem[m*2+n].red,mem[m*2+n].green,mem[m*2+n].blue);
        }
    }
 
}
 
void set_fixed3(RGB_TYPE *mem){
  for (int m=0;m<10;m++){
   for (int n=0;n <2;n++){
    for (int i=0;i<2;i++){
        printf("mem3[%3d][%3d][%3d]={%2x,%2x, %2x}\n",
        m,n,i,mem[m*4+2*n+i].red,mem[m*4+2*n+i].green,mem[m*4+2*n+i].blue);
    }
   }
  }
}

 
 
結果は次のようになります。
***** Veritak SV Engine Version 0.417 Build Apr.18.2011 *****
mem1[  0]={ 1, 2,  3}
mem1[  1]={ 2, 3,  4}
mem1[  2]={ 3, 4,  5}
mem1[  3]={ 4, 5,  6}
mem1[  4]={ 5, 6,  7}
mem1[  5]={ 6, 7,  8}
mem1[  6]={ 7, 8,  9}
mem1[  7]={ 8, 9,  a}
mem1[  8]={ 9, a,  b}
mem1[  9]={ a, b,  c}
mem2[  0][  0]={ a, b,  c}
mem2[  0][  1]={ b, c,  d}
mem2[  1][  0]={12,13, 14}
mem2[  1][  1]={13,14, 15}
mem2[  2][  0]={1a,1b, 1c}
mem2[  2][  1]={1b,1c, 1d}
mem2[  3][  0]={22,23, 24}
mem2[  3][  1]={23,24, 25}
mem2[  4][  0]={2a,2b, 2c}
mem2[  4][  1]={2b,2c, 2d}
mem2[  5][  0]={32,33, 34}
mem2[  5][  1]={33,34, 35}
mem2[  6][  0]={3a,3b, 3c}
mem2[  6][  1]={3b,3c, 3d}
mem2[  7][  0]={42,43, 44}
mem2[  7][  1]={43,44, 45}
mem2[  8][  0]={4a,4b, 4c}
mem2[  8][  1]={4b,4c, 4d}
mem2[  9][  0]={52,53, 54}
mem2[  9][  1]={53,54, 55}
mem3[  0][  0][  0]={13,14, 15}
mem3[  0][  0][  1]={14,15, 16}
mem3[  0][  1][  0]={1b,1c, 1d}
mem3[  0][  1][  1]={1c,1d, 1e}
mem3[  1][  0][  0]={33,34, 35}
mem3[  1][  0][  1]={34,35, 36}
mem3[  1][  1][  0]={3b,3c, 3d}
mem3[  1][  1][  1]={3c,3d, 3e}
mem3[  2][  0][  0]={33,34, 35}
mem3[  2][  0][  1]={34,35, 36}
mem3[  2][  1][  0]={3b,3c, 3d}
mem3[  2][  1][  1]={3c,3d, 3e}
mem3[  3][  0][  0]={53,54, 55}
mem3[  3][  0][  1]={54,55, 56}
mem3[  3][  1][  0]={5b,5c, 5d}
mem3[  3][  1][  1]={5c,5d, 5e}
mem3[  4][  0][  0]={53,54, 55}
mem3[  4][  0][  1]={54,55, 56}
mem3[  4][  1][  0]={5b,5c, 5d}
mem3[  4][  1][  1]={5c,5d, 5e}
mem3[  5][  0][  0]={73,74, 75}
mem3[  5][  0][  1]={74,75, 76}
mem3[  5][  1][  0]={7b,7c, 7d}
mem3[  5][  1][  1]={7c,7d, 7e}
mem3[  6][  0][  0]={73,74, 75}
mem3[  6][  0][  1]={74,75, 76}
mem3[  6][  1][  0]={7b,7c, 7d}
mem3[  6][  1][  1]={7c,7d, 7e}
mem3[  7][  0][  0]={ffffff93,ffffff94, ffffff95}
mem3[  7][  0][  1]={ffffff94,ffffff95, ffffff96}
mem3[  7][  1][  0]={ffffff9b,ffffff9c, ffffff9d}
mem3[  7][  1][  1]={ffffff9c,ffffff9d, ffffff9e}
mem3[  8][  0][  0]={ffffff93,ffffff94, ffffff95}
mem3[  8][  0][  1]={ffffff94,ffffff95, ffffff96}
mem3[  8][  1][  0]={ffffff9b,ffffff9c, ffffff9d}
mem3[  8][  1][  1]={ffffff9c,ffffff9d, ffffff9e}
mem3[  9][  0][  0]={ffffffb3,ffffffb4, ffffffb5}
mem3[  9][  0][  1]={ffffffb4,ffffffb5, ffffffb6}
mem3[  9][  1][  0]={ffffffbb,ffffffbc, ffffffbd}
mem3[  9][  1][  1]={ffffffbc,ffffffbd, ffffffbe}
 
(2) オープン配列による方法
 
 こちらは、宣言の配列指定に[] を使います。背景色の箇所が上のソースからの変更部です。
配列の次元や、大きさによらず同じインポート関数を呼んでいます。
 
 
 

module test;
 
 
typedefstruct {
 byte red;
 byte green;
 byte blue;
} RGB_TYPE;
 
 
 
 
import "DPI-C" function void set_rgb1(inout RGB_TYPE mem []);
 
 
RGB_TYPE m1
[10:1];
RGB_TYPE m2 [10:1][3:2];
RGB_TYPE m3 [10:1][3:2][4:3];
 
initial begin
//1-D
 for (int i=1;i<=10;i++) begin
  m1[i].red=i;
  m1[i].green=i+1;
  m1[i].blue=i+2;
 end
 set_rgb1(m1);
 
 
//2-D
 for (int m=1;m<=10;m++)
  for (int n=2;n<=3;n++) begin
   m2[m][n].red=m<<3 | n;
   m2[m][n].green=m<<3 | n+1;
   m2[m][n].blue= m<< 3| n+2;
  end
 set_rgb1(m2);
 
//3-D
 for (int m=1;m<=10;m++)
  for (int n=2;n<=3;n++)
   for (int i=3;i<=4;i++) begin
    m3[m][n][i].red=m<< 4 | n<<3 | i;
    m3[m][n][i].green=m<<4 | n<<3 | i+1;
    m3[m][n][i].blue= m<< 4 | n<<3 | i+2;
   end
 set_rgb1(m3);
 
 
end
 
 
 
endmodule

 
VeritakSVが出力したCヘッダファイルです。svOpenArrayHandleは、svdpi.hでvoid* と定義されています。
 
 
/* Copyright 2011 www.sugawara-systems.com 
* Note:
*   This file is automatically generated.
*   Please do not edit this file - you will lose your edits.*/
 







#ifndef INCLUDED_DPIHEADER#define INCLUDED_DPIHEADER#ifdef __cplusplus#define DPI_LINK_DECL  extern "C" #else#define DPI_LINK_DECL#endif#include "svdpi.h"
 
 typedefstruct {
        char red;
        char green;
        char blue;
} RGB_TYPE;
 
DPI_LINK_DECL DPI_DLLESPEC
void set_rgb1(svOpenArrayHandle );
 
 
C++ソースです。オープン配列では、ハンドル渡しになります。(VeritakSVでは、シミュレータ内部のクラスオブジェクトのポインタ)
配列の次元、大きさ、データポインタ等は、このハンドルに問い合わせをしながら得ることになります。このことは、DLLコンパイル時に確定していなくてもよいことになります。
SVソース側で配列の大きさに変更があった場合でもDLLの再コンパイルは、必要がありません。このようにメンテナンス性はよいのですが、アクセスは、かならずハンドルを介したものとなり、速度が犠牲になります。
 
 
void set_rgb1(svOpenArrayHandle handle){
 RGB_TYPE * data;
 data=reinterpret_cast<RGB_TYPE*>(svGetArrayPtr(handle));

 int unpacked_dim=svDimensions(handle);
 
        printf("Declared Dimensions are ");
        for (int i=1;i<=unpacked_dim;i++){
                printf("[%d:%d]",svLeft(handle,i),svRight(handle,i));
 
        }
        printf("\n");
        printf("sizeofarray =%dbytes\n",svSizeOfArray(handle));
 
        if (unpacked_dim==1){
                for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
                        RGB_TYPE *a;
                         a=reinterpret_cast<RGB_TYPE*>(svGetArrElemPtr(handle,m));
                         printf("[%3d]==[%x,%x,%x]\n",m,a->red,a->green,a->blue);
                        }
        } elseif (unpacked_dim==2){
         for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
                for (int n=svLow(handle,2);n <= svHigh(handle,2);n++){
                  RGB_TYPE *a;
                  a=reinterpret_cast<RGB_TYPE*>(svGetArrElemPtr(handle,m,n));
                  printf("[%2d][%2d]=[%x,%x,%x]\n",m,n,a->red,a->green,a->blue);
               }
          }
   } elseif (unpacked_dim==3){
        for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
          for (int n=svLow(handle,2);n <= svHigh(handle,2);n++){
           for (int i=svLow(handle,3);i <= svHigh(handle,3);i++){
                RGB_TYPE *a;
                a=reinterpret_cast<RGB_TYPE*>(svGetArrElemPtr(handle,m,n,i));
                printf("[%2d][%2d][%2d]=[%x,%x,%x]\n",m,n,i,a->red,a->green,a->blue);
           }
            }
         }
   }
}
 
 
 結果です。配列のインデックス、次元、大きさは、SVで宣言した通りのものがクエリ(Query問い合わせ)によって得られます。また、占有するメモリバイト数も得られています。

***** Veritak SV Engine Version 0.417 Build Apr.18.2011 *****
Declared Dimensions are [10:1]
sizeofarray =30bytes
[  1]==[1,2,3]
[  2]==[2,3,4]
[  3]==[3,4,5]
[  4]==[4,5,6]
[  5]==[5,6,7]
[  6]==[6,7,8]
[  7]==[7,8,9]
[  8]==[8,9,a]
[  9]==[9,a,b]
[ 10]==[a,b,c]
Declared Dimensions are [10:1][3:2]
sizeofarray =60bytes
[ 1][ 2]=[a,b,c]
[ 1][ 3]=[b,c,d]
[ 2][ 2]=[12,13,14]
[ 2][ 3]=[13,14,15]
[ 3][ 2]=[1a,1b,1c]
[ 3][ 3]=[1b,1c,1d]
[ 4][ 2]=[22,23,24]
[ 4][ 3]=[23,24,25]
[ 5][ 2]=[2a,2b,2c]
[ 5][ 3]=[2b,2c,2d]
[ 6][ 2]=[32,33,34]
[ 6][ 3]=[33,34,35]
[ 7][ 2]=[3a,3b,3c]
[ 7][ 3]=[3b,3c,3d]
[ 8][ 2]=[42,43,44]
[ 8][ 3]=[43,44,45]
[ 9][ 2]=[4a,4b,4c]
[ 9][ 3]=[4b,4c,4d]
[10][ 2]=[52,53,54]
[10][ 3]=[53,54,55]
Declared Dimensions are [10:1][3:2][4:3]
sizeofarray =120bytes
[ 1][ 2][ 3]=[13,14,15]
[ 1][ 2][ 4]=[14,15,16]
[ 1][ 3][ 3]=[1b,1c,1d]
[ 1][ 3][ 4]=[1c,1d,1e]
[ 2][ 2][ 3]=[33,34,35]
[ 2][ 2][ 4]=[34,35,36]
[ 2][ 3][ 3]=[3b,3c,3d]
[ 2][ 3][ 4]=[3c,3d,3e]
[ 3][ 2][ 3]=[33,34,35]
[ 3][ 2][ 4]=[34,35,36]
[ 3][ 3][ 3]=[3b,3c,3d]
[ 3][ 3][ 4]=[3c,3d,3e]
[ 4][ 2][ 3]=[53,54,55]
[ 4][ 2][ 4]=[54,55,56]
[ 4][ 3][ 3]=[5b,5c,5d]
[ 4][ 3][ 4]=[5c,5d,5e]
[ 5][ 2][ 3]=[53,54,55]
[ 5][ 2][ 4]=[54,55,56]
[ 5][ 3][ 3]=[5b,5c,5d]
[ 5][ 3][ 4]=[5c,5d,5e]
[ 6][ 2][ 3]=[73,74,75]
[ 6][ 2][ 4]=[74,75,76]
[ 6][ 3][ 3]=[7b,7c,7d]
[ 6][ 3][ 4]=[7c,7d,7e]
[ 7][ 2][ 3]=[73,74,75]
[ 7][ 2][ 4]=[74,75,76]
[ 7][ 3][ 3]=[7b,7c,7d]
[ 7][ 3][ 4]=[7c,7d,7e]
[ 8][ 2][ 3]=[ffffff93,ffffff94,ffffff95]
[ 8][ 2][ 4]=[ffffff94,ffffff95,ffffff96]
[ 8][ 3][ 3]=[ffffff9b,ffffff9c,ffffff9d]
[ 8][ 3][ 4]=[ffffff9c,ffffff9d,ffffff9e]
[ 9][ 2][ 3]=[ffffff93,ffffff94,ffffff95]
[ 9][ 2][ 4]=[ffffff94,ffffff95,ffffff96]
[ 9][ 3][ 3]=[ffffff9b,ffffff9c,ffffff9d]
[ 9][ 3][ 4]=[ffffff9c,ffffff9d,ffffff9e]
[10][ 2][ 3]=[ffffffb3,ffffffb4,ffffffb5]
[10][ 2][ 4]=[ffffffb4,ffffffb5,ffffffb6]
[10][ 3][ 3]=[ffffffbb,ffffffbc,ffffffbd]
[10][ 3][ 4]=[ffffffbc,ffffffbd,ffffffbe]

 

 
オープン配列に関するAPIを下にまとめます。
/*
 * Open array querying functions
 * These functions are modeled upon the SystemVerilog array
 * querying functions and use the same semantics.
 * 
 * If the dimension is 0, then the query refers to the
 * packed part of an array (which is one dimensional).
 * Dimensions > 0 refer to the unpacked part of an array.
 *//* h= handle to open array, d=dimension */
XXTERN int svLeft(const svOpenArrayHandle h, int d);
XXTERN int svRight(const svOpenArrayHandle h, int d);
XXTERN int svLow(const svOpenArrayHandle h, int d);
XXTERN int svHigh(const svOpenArrayHandle h, int d);
XXTERN int svIncrement(const svOpenArrayHandle h, int d);
XXTERN int svSize(const svOpenArrayHandle h, int d);
XXTERN int svDimensions(const svOpenArrayHandle h);
 
/*
 * Pointer to the actual representation of the whole array of any type
 * NULL if not in C layout
 */
XXTERN void* svGetArrayPtr(const svOpenArrayHandle);
 
/* total size in bytes or 0 if not in C layout */
XXTERN int svSizeOfArray(const svOpenArrayHandle);
 
/*
 * Return a pointer to an element of the array
 * or NULL if index outside the range or null pointer
 */
XXTERN void* svGetArrElemPtr(const svOpenArrayHandle, int indx1, ...);
 
/* specialized versions for 1-, 2- and 3-dimensional arrays: */
XXTERN void* svGetArrElemPtr1(const svOpenArrayHandle, int indx1);
XXTERN void* svGetArrElemPtr2(const svOpenArrayHandle, int indx1, int indx2);
XXTERN void* svGetArrElemPtr3(const svOpenArrayHandle, int indx1, int indx2,
        int indx3);

(3)  Packed オープン配列
 
DPIにおいては、多次元のパック配列は、0ベースで正規化した一次元配列になります。
 
たとえば、
bit[0:3][7:0] mem2  [10:1][3:2] ;
 
import "DPI-C" function void set_bitvecval_mem(inout bit[31:0] mem[10:1][3:2]);

 

として扱われます。どちらの形式で書いても等価です。これをオープン配列とする場合には、
 
import "DPI-C" function void set_bitvecval_mem(inout bit[31:0] mem[][]);
あるいは、
import "DPI-C" function void set_bitvecval_mem(inout bit[] mem[][]);
と書いてもOKです。
 
それでは、パック配列を含んだオープン配列の例です。
 
 
module test;
 
 
 
	import "DPI-C" function void set_bitvecval_mem( inoutbit[] mem[]);
	import "DPI-C" function void set_logicvecval_mem( inoutlogic[] mem[]);
	import "DPI-C" function void set_byte_mem( inoutbyte mem[]);
	import "DPI-C" function void set_shortint_mem( inoutshortint mem[]);
	import "DPI-C" function void set_longint_mem( inoutlongint mem[]);
	import "DPI-C" function void set_float_mem( inoutshortreal mem[]);
	import "DPI-C" function void set_double_mem( inoutreal mem[]);
 
//1-D
	bit[7:0] 			mem[10:1];
	logic[7:0]		mem_logic[10:1];
	byte			mem_byte [10:1];
	shortint			mem_shortint [10:1];
	int				mem_int [10:1];
	longint			mem_longint [10:1];
	shortreal		mem_shortreal [10:1];
	real				mem_real [10:1];
//2-D
	bit[0:3][7:0] 		mem2  [10:1][3:2] ;
//3-D
	bit[1:0][0:3][7:0]  mem3 [10:1][3:2][4:3];
 
	 initial begin
//1-D
		for (int i=1;i<=10;i++) mem[i]=i;
 		set_bitvecval_mem(mem);
 
		for (int i=1;i<=10;i++) mem_byte[i]=i;
 		set_byte_mem(mem_byte);
 
		for (int i=1;i<=10;i++) mem_shortint[i]=i;
  		set_shortint_mem(mem_shortint);
 
		for (int i=1;i<=10;i++) mem_int[i]=i;
  		set_bitvecval_mem(mem_int);
 
		for (int i=1;i<=10;i++) mem_longint[i]=i;
  		set_longint_mem(mem_longint);
 
		for (int i=1;i<=10;i++) mem_shortreal[i]=i;
 		set_float_mem(mem_shortreal);
 
		for (int i=1;i<=10;i++) mem_real[i]=i;
 		set_double_mem(mem_real);
 
		for (int i=1;i<=10;i++) mem_logic[i]=i;
 		set_logicvecval_mem(mem_int);
 
 
//2-D
		for (int m=1;m<=10;m++) 
			for (int n=2;n<=3;n++) 
   				mem2[m][n]=(m << 8) | n;
  		set_bitvecval_mem(mem2);
 
//3-D
		for (int m=1;m<=10;m++) 
			for (int n=2;n<=3;n++) 
				for (int i=3;i<=4;i++) 
   					mem3[m][n][i]=  (m<<16)| (n<<8) | i;
 		set_bitvecval_mem(mem3);
	end
 
 
 
endmodule
 
 
VeritakSVが出力したCヘッダファイルです。
 
 
 
#ifndef INCLUDED_DPIHEADER
#define INCLUDED_DPIHEADER
#ifdef __cplusplus
#define DPI_LINK_DECL  extern "C" 
#else
#define DPI_LINK_DECL
#endif
#include "svdpi.h"
 
DPI_LINK_DECL DPI_DLLESPEC
void set_bitvecval_mem(svOpenArrayHandle );
 
DPI_LINK_DECL DPI_DLLESPEC
void set_byte_mem(svOpenArrayHandle );
 
DPI_LINK_DECL DPI_DLLESPEC
void set_double_mem(svOpenArrayHandle );
 
DPI_LINK_DECL DPI_DLLESPEC
void set_float_mem(svOpenArrayHandle );
 
DPI_LINK_DECL DPI_DLLESPEC
void set_logicvecval_mem(svOpenArrayHandle );
 
DPI_LINK_DECL DPI_DLLESPEC
void set_longint_mem(svOpenArrayHandle );
 
DPI_LINK_DECL DPI_DLLESPEC
void set_shortint_mem(svOpenArrayHandle );

C++ソースです。
 template <typename X>
void set_mem(svOpenArrayHandle handle )
{
        X * data;
        data=reinterpret_cast<X*>(svGetArrayPtr(handle));
        //data[0]=0xdeadbeaf;
        int unpacked_dim=svDimensions(handle);
 
        printf("Declared Dimensions are [%d:0] mem",svSize(handle,0)-1);
        for (int i=1;i<=unpacked_dim;i++){
                printf("[%d:%d]",svLeft(handle,i),svRight(handle,i));
 
        }
        printf("\n");
        printf("sizeofarray =%dbytes\n",svSizeOfArray(handle));
 
        if (unpacked_dim==1){
                for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
                        X *a;
                        a=reinterpret_cast<X*>(svGetArrElemPtr(handle,m));
                        if (typeid(X)==typeid(float) || typeid(X)==typeid(double))                         printf("[%3d]=%f\n",m,*a); 
                        else printf("[%3d]=%x\n",m,*a);
                }
        }else if (unpacked_dim==2){
                for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
                        for (int n=svLow(handle,2);n <= svHigh(handle,2);n++){
                            X *a;
                            a=reinterpret_cast<X*>(svGetArrElemPtr(handle,m,n));
                            printf("[%2d][%2d]=%x\n",m,n,*a);
                        }
                }
        }else if (unpacked_dim==3){
                for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
                        for (int n=svLow(handle,2);n <= svHigh(handle,2);n++){
                                for (int i=svLow(handle,3);i <= svHigh(handle,3);i++){
                                    X *a;
                                    a=reinterpret_cast<X*>(svGetArrElemPtr(handle,m,n,i));
                                    printf("[%2d][%2d][%2d]=%2x\n",m,n,i,*a);
                                }
                        }
                }
        }
 
}
 
void set_byte_mem(svOpenArrayHandle handle)
{
                return set_mem<char>(handle);
}
void set_shortint_mem(svOpenArrayHandle handle)
{
                return set_mem<short>(handle);
}
void set_longint_mem(svOpenArrayHandle handle)
{
                return set_mem<__int64>(handle);
}
void set_float_mem(svOpenArrayHandle handle)
{
                return set_mem<float>(handle);
}
void set_double_mem(svOpenArrayHandle handle)
{
                return set_mem<double>(handle);
}
void set_bitvecval_mem(svOpenArrayHandle handle)
{
                return set_mem<svBitVecVal>(handle);
}
void set_packed_struct_mem(svOpenArrayHandle handle)
{
                return set_mem<svBitVecVal>(handle);
}
void set_logicvecval_mem(svOpenArrayHandle handle)
{
                return set_mem<svLogicVecVal>(handle);
}

 

出力です。
bit [7:0] は、自体は、1バイトですが、svBitVecValとして見ると占有バイト数は、4バイトになることに注意してください。 
 
***** Veritak SV Engine Version 0.417 Build Apr.18.2011 *****
Declared Dimensions are [7:0] mem[10:1]
sizeofarray =40bytes
[  1]=1
[  2]=2
[  3]=3
[  4]=4
[  5]=5
[  6]=6
[  7]=7
[  8]=8
[  9]=9
[ 10]=a
Declared Dimensions are [7:0] mem[10:1]
sizeofarray =10bytes
[  1]=1
[  2]=2
[  3]=3
[  4]=4
[  5]=5
[  6]=6
[  7]=7
[  8]=8
[  9]=9
[ 10]=a
Declared Dimensions are [15:0] mem[10:1]
sizeofarray =20bytes
[  1]=1
[  2]=2
[  3]=3
[  4]=4
[  5]=5
[  6]=6
[  7]=7
[  8]=8
[  9]=9
[ 10]=a
Declared Dimensions are [31:0] mem[10:1]
sizeofarray =40bytes
[  1]=1
[  2]=2
[  3]=3
[  4]=4
[  5]=5
[  6]=6
[  7]=7
[  8]=8
[  9]=9
[ 10]=a
Declared Dimensions are [63:0] mem[10:1]
sizeofarray =80bytes
[  1]=1
[  2]=2
[  3]=3
[  4]=4
[  5]=5
[  6]=6
[  7]=7
[  8]=8
[  9]=9
[ 10]=a
Declared Dimensions are [31:0] mem[10:1]
sizeofarray =40bytes
[  1]=1.000000
[  2]=2.000000
[  3]=3.000000
[  4]=4.000000
[  5]=5.000000
[  6]=6.000000
[  7]=7.000000
[  8]=8.000000
[  9]=9.000000
[ 10]=10.000000
Declared Dimensions are [63:0] mem[10:1]
sizeofarray =80bytes
[  1]=1.000000
[  2]=2.000000
[  3]=3.000000
[  4]=4.000000
[  5]=5.000000
[  6]=6.000000
[  7]=7.000000
[  8]=8.000000
[  9]=9.000000
[ 10]=10.000000
Declared Dimensions are [31:0] mem[10:1]
sizeofarray =40bytes
[  1]=1
[  2]=2
[  3]=3
[  4]=4
[  5]=5
[  6]=6
[  7]=7
[  8]=8
[  9]=9
[ 10]=a
Declared Dimensions are [31:0] mem[10:1][3:2]
sizeofarray =80bytes
[ 1][ 2]=102
[ 1][ 3]=103
[ 2][ 2]=202
[ 2][ 3]=203
[ 3][ 2]=302
[ 3][ 3]=303
[ 4][ 2]=402
[ 4][ 3]=403
[ 5][ 2]=502
[ 5][ 3]=503
[ 6][ 2]=602
[ 6][ 3]=603
[ 7][ 2]=702
[ 7][ 3]=703
[ 8][ 2]=802
[ 8][ 3]=803
[ 9][ 2]=902
[ 9][ 3]=903
[10][ 2]=a02
[10][ 3]=a03
Declared Dimensions are [63:0] mem[10:1][3:2][4:3]
sizeofarray =320bytes
[ 1][ 2][ 3]=10203
[ 1][ 2][ 4]=10204
[ 1][ 3][ 3]=10303
[ 1][ 3][ 4]=10304
[ 2][ 2][ 3]=20203
[ 2][ 2][ 4]=20204
[ 2][ 3][ 3]=20303
[ 2][ 3][ 4]=20304
[ 3][ 2][ 3]=30203
[ 3][ 2][ 4]=30204
[ 3][ 3][ 3]=30303
[ 3][ 3][ 4]=30304
[ 4][ 2][ 3]=40203
[ 4][ 2][ 4]=40204
[ 4][ 3][ 3]=40303
[ 4][ 3][ 4]=40304
[ 5][ 2][ 3]=50203
[ 5][ 2][ 4]=50204
[ 5][ 3][ 3]=50303
[ 5][ 3][ 4]=50304
[ 6][ 2][ 3]=60203
[ 6][ 2][ 4]=60204
[ 6][ 3][ 3]=60303
[ 6][ 3][ 4]=60304
[ 7][ 2][ 3]=70203
[ 7][ 2][ 4]=70204
[ 7][ 3][ 3]=70303
[ 7][ 3][ 4]=70304
[ 8][ 2][ 3]=80203
[ 8][ 2][ 4]=80204
[ 8][ 3][ 3]=80303
[ 8][ 3][ 4]=80304
[ 9][ 2][ 3]=90203
[ 9][ 2][ 4]=90204
[ 9][ 3][ 3]=90303
[ 9][ 3][ 4]=90304
[10][ 2][ 3]=a0203
[10][ 2][ 4]=a0204
[10][ 3][ 3]=a0303
[10][ 3][ 4]=a0304

(4) DPI配列に関する注意事項
 
・配列は、すべてSV側で確保されていることに注意してください。C/C++側で確保し、SV側でそれを使うような手続き、方法は、SV言語として備えていません。
・構造体中のメモリのアラインは、特にSV LRMで規定されている訳ではありません。アンパック構造体中の各メンバとアラインについては、SVシミュレータとC/C++間で一致を確認された方がよいでしょう。(SV側でsvSizeOfArray 、C側で sizeof で一致を確認しておく。)
同じ、要素でも宣言順で、バイト数が変わることがあります。参考 http://www.g-ishihara.com/c_st_01.htm