Как передать структуру SystemVerilog, содержащую динамический массив, через DPI-C? - PullRequest
1 голос
/ 12 апреля 2019

Вот минимальный рабочий пример проблемы:

Приведенный ниже пример прекрасно компилируется (используя Cadence Incisive / Xcelium) , если я закомментирую оператор import "DPI-C" и вызов print_object(s);.

Таким образом, это доказывает, что структура с динамическим массивом является допустимым синтаксисом SystemVerilog.

Но если я пытаюсь передать ту же структуру через DPI-C, я получаю ошибку:

xmvlog: * E, UNUSAG (tb.sv, 10 | 62): неподдерживаемый элемент в неупакованном типе структуры struct в формальном аргументе.

program top;

  typedef struct {
    int scalar_int;
    int dyn_arr_int[];
  } my_struct_s;

  import "DPI-C" function void print_object(input my_struct_s s);
  // Cannot pass a dynamic-array containing struct via DPI-C.

  //   import "DPI-C" function void print_object(input my_struct_s s);
  //                                                               |
  // xmvlog: *E,UNUSAG (tb.sv,10|62): unsupported element in unpacked struct datatype in formal argument.

  initial begin
    my_struct_s s;

    s.scalar_int = 100;
    s.dyn_arr_int = '{25, 35, 45};

    $display("Value of the struct printed from SV: %p", s);
    print_object(s);

    $finish;
  end

endprogram : top

Итаквопрос:

Есть ли обходной путь для передачи структур с динамическими массивами в сторону C?Есть ли способ передать структуры с «указателями» на эти динамические массивы?Или любым другим способом?

Один из обходных путей - передать структуру со статическим массивом некоторого «максимального» размера, а также передать скалярное целое число, хранящее длину фактических данных, которые являются подмножеством этого статического массива.,Но это очень уродливый обходной путь, требующий дополнительных затрат в SystemVerilog для вычисления длин и заполнения этого статического массива, а также, вероятно, неэффективный по сравнению с передачей только динамического массива.

...