Тип стирания в SystemVerilog / DPI - PullRequest
0 голосов
/ 19 июня 2019

Можно ли привести структуру SystemVerilog к какому-либо стертому указателю, например void *?

Мне нужно передать объекты различных структурных типов из SV в C. И я хочу иметь одну функцию DPI для обработки любого вида поддерживаемой структуры.

На стороне SystemVerilog у меня много типов:

typedef struct { ... } stype1;
typedef struct { ... } stype2;
typedef struct { ... } stype3;
typedef struct { ... } stype4;

stype1 var1;
stype2 var2;
stype3 var3;
stype4 var4;

На стороне C у меня есть одна функция, которая принимает любой тип:

void send_sv_data(const char* type_name, void *ptr);

Я надеялся использовать его на стороне SV:

send_sv_data("stype1", var1);
send_sv_data("stype2", var2);

И это работает в общем, с единственной проблемой, что SystemVerilog не поддерживает перегрузку. Поэтому я могу объявить это только для одного типа:

import "DPI" function void  send_sv_data(string port_name, stype1 data);

Я пытался использовать chandle в качестве аргумента:

 import "DPI" function void  send_sv_data(string port_name, chandle data);

Но я не нашел способа, как я приведу переменную типа структуры к чандлу.

1 Ответ

1 голос
/ 19 июня 2019

В SystemVerilog нет указателей и приведение указателей.Самое простое, что нужно сделать, это упаковать свои структуры SystemVerilog в массив байтов и распаковать их в свои структуры C.

...