Можно ли привести структуру 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);
Я пытался использовать свечу в качестве аргумента:
import "DPI" function void send_sv_data(string port_name, chandle data);
Но я не нашел способа, как привести переменную типа struct к chandle.
Да, похоже, мне придется написать отдельную функцию DPI для каждого типа, который у меня есть.
В SystemVerilog нет указателей и приведения указателей. Проще всего упаковать ваши структуры SystemVerilog в массив байтов и распаковать их в ваши структуры C.
вы используете неправильный язык программирования :-(. нет способа сделать то, что вы хотите сделать.
chandle
это просто передача указателей от dpi к dpi через sv media.