Невозможно получить доступ к размерам svOpenArrayHandle

У меня есть многомерный динамический распакованный массив в моем тестовом стенде SystemVerilog, и я передаю его в код C в качестве аргумента, используя DPI-C. Я использую Questasim 10.4b. Следуя потоку Questa, я запустил -dpiheader для генерации заголовочного файла и включил его в мой C-код.

SystemVerilog:

// C function declaration
import "DPI-C" function void modulate_my_frame (input byte data[][]);

// multidimensional array
byte unsigned frame_packed[][];

// assume this is randomized in my testbench
int num_frames = 5;

// init 1st dimension
frame_packed = new[num_frames];

// iterate through num_frames
for (int num_frame = 0; num_frame < num_frames; num_frame++) begin

  // item
  noob_frame fr = noob_frame::type_id::create("noob_frame");

  // randomize
  if (!noob_frame.randomize()) `uvm_error(get_name(), "Cannot randomize noob_frame");

  // pack noob_frame
  // I am casting this to void to simplify this example
  // This can return a variable sized array for frame_packed[num_frame]
  void'(fr.pack_bytes(frame_packed[num_frame]);

end

// fr[][] now contains all 5 noob_frames packed into byte arrays

// call DPI-C function
modulate_my_frame( frame_packed );

Это мой код C:

void modulate_my_frame (const svOpenArrayHandle data)
{
  printf( "svLeft1       = %0d\n", svLeft      ( data, 1));
  printf( "svRight1      = %0d\n", svRight     ( data, 1));
  printf( "svLow1        = %0d\n", svLow       ( data, 1));
  printf( "svHigh1       = %0d\n", svHigh      ( data, 1));
  printf( "svIncrement1  = %0d\n", svIncrement ( data, 1));
  printf( "svSize1       = %0d\n", svSize      ( data, 1));

  printf( "svLeft2       = %0d\n", svLeft      ( data, 2));
  printf( "svRight2      = %0d\n", svRight     ( data, 2));
  printf( "svLow2        = %0d\n", svLow       ( data, 2));
  printf( "svHigh2       = %0d\n", svHigh      ( data, 2));
  printf( "svIncrement2  = %0d\n", svIncrement ( data, 2));
  printf( "svSize2       = %0d\n", svSize      ( data, 2));

  printf( "svDimensions  = %0d\n", svDimensions( data   ));
}

Распечатка, которую я получаю:

# svLeft1  = 0
# svRight1 = 2
# svLow1   = 0
# svHigh1  = 2
# svIncrement1 = -1
# svSize1 = 3
# svLeft2  = -1
# svRight2 = -1
# svLow2   = -1
# svHigh2  = -1
# svIncrement2 = 0
# svSize2 = -2
# svDimensions = 2

Я не понимаю, как получить размеры моих подмассивов?

Странная часть, я могу использовать svGetArrElemPtr2 чтобы получить доступ к элементам всего моего массива. Я просто не знаю, каковы размеры. На этом этапе мой обходной путь - передать другой массив int в код C, который содержит измерения подмассива.

1 ответ

Ваш двухмерный массив состоит из массивов (потенциально) разной длины. Если вы хотите получить второе измерение, вы должны сделать это поэлементно. Что-то вроде:

for (int i = 0; i < svSize(data, 1); i++) {

  // Each array element is itself an array
  svOpenArrayHandle* sub_array = (svOpenArrayHandle*) svGetArrElemPtr(data, i);

  printf( "sub_array size = %0d\n", svSize(sub_array, 1));
}

Я использовал 0 для начального значения i вместо svLeft(data, 1)потому что динамические массивы всегда начинаются с 0 и содержать size элементы.

Код не работает для меня, потому что sub_array всегда NULL, Это похоже на пример из LRM, и я не вижу в этом ничего плохого, поэтому это может быть связано с ошибкой инструмента. Может быть, это поможет вам начать, и вам повезет больше.

Другие вопросы по тегам