Вот минимальный рабочий пример проблемы:
Приведенный ниже пример прекрасно компилируется (используя 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 для вычисления длин и заполнения этого статического массива, а также, вероятно, неэффективный по сравнению с передачей только динамического массива.