У меня есть код C (модель предиктора), который в результате может генерировать массив переменной длины. Перед вызовом кода C неизвестно, каков размер этого массива, и есть некоторая степень рандомизации (моделирование шума).
Мне нужно вызвать эту модель предиктора C из SystemVerilog и вернуть массив выходных результатов.
Как новичок в DPI-C, я столкнулся с 3 ограничениями:
- Массив результатов на стороне SV должен быть выделен до вызова кода C. Поскольку я не знаю, каков будет размер, у меня есть шанс перераспределить или недораспределить.
- Я не могу передать открытый массив из C -> SV в функцию экспорта.
- Функцию экспорта нельзя использовать для методов класса(!)
Чтобы обойти это, я создал хакерское жонглирование между двумя интерфейсами и глобальными переменными/задачами.
Я опубликовал свое решение, и оно отлично работает, но я хотел бы знать, есть ли у кого-нибудь более элегантное решение, чем это. Особенно мне не нравится использовать глобальные переменные.
СВ:
export "DPI-C" function allocate_mem;
export "DPI-C" function set_item;
import "DPI-C" context function void predictForMe (input int noiseA, input int noiseB);
int result[];
function void allocate_mem(int size);
result = new[size];
endfunction
function void set_item(int index, int item);
result[index] = item;
endfunction
class my_class;
// constructor etc etc - assume is valid
// my_func
function void my_func();
int noiseA = 10; // hardcode to simplify example
int noiseB = 20; // hardcode to simplify example
// call imported function
predictForMe( noiseA, noiseB );
endfunction
endclass
С:
extern void allocate_mem(int size);
extern void set_item(int index, int item);
void predictForMe(int noiseA, int noiseB)
{
// do some calcualation based on noiseA and noiseB
// generates an answer_array with num elements = X
allocate_mem(X);
for(i = 0; i < X; i++) set_item(i, answer_array[i]);
}
Любые лучшие решения приветствуются.
X
? - person meaning-matters   schedule 23.12.2017allocate_mem
выделяет буферное пространство в SV.set_item
копирует его в это пространство. Мне нравится твоя идея с дескрипторами. Однако вопрос в том, есть ли способ передать открытый массив обратно в SV со стороны C, используяsvOpenArrayHandle
- person noobuntu   schedule 23.12.2017