system verilog — Ошибка чтения значения из SV в функции C ++ с использованием DPI

Я пытаюсь передать строку из SV в функцию C ++, но значение не передается должным образом в функцию C ++

Код на стороне SV:

    import "DPI" function string mainsha(string str);
class scoreboard ;
string text_i_cplus;
string text_o_cplus;
text_i_cplus="abc";
text_o_cplus=mainsha(text_i_cplus);

Вот как я посылаю значение в C ++. На стороне C ++ я принимаю значение как:

    extern "C" string mainsha(string input)
{

string output1 = sha256(input);

cout << "sha256('"<< input << "'):" << output1 << endl;
return output1;
}

Я получаю правильный вывод, когда я запускаю прогу C ++ в одиночку. Но в консоли я получаю следующий вывод:

sha256 ( »): e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Может кто-нибудь подсказать, пожалуйста, где я иду не так или я что-то упустил?

0

Решение

DPI в текущем стандарте SystemVerilog поддерживает только язык C, но не C ++. На самом деле вы должны использовать import "DPI-C", в C ++, string это класс, и C имеет только массивы char

  extern "C" const char * mainsha(const char * input)
{

string output1 = sha256(input); // not sure if you need a cast here

cout << "sha256('"<< input << "'):" << output1 << endl;
return output1.c_str();
}

Если вы используете Modelsim / Questa, вы можете использовать ключ -dpiheader, который автоматически генерирует прототипы DPI для вас, и вы можете включить этот файл при компиляции кода C ++. Таким образом, вы получите ошибку компилятора, если есть несоответствие и не нужно отлаживать поведение во время выполнения.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]