Я пытаюсь передать строку из 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
Может кто-нибудь подсказать, пожалуйста, где я иду не так или я что-то упустил?
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 ++. Таким образом, вы получите ошибку компилятора, если есть несоответствие и не нужно отлаживать поведение во время выполнения.
Других решений пока нет …