DPI SystemVerilog, возвращающий строку из C ++ в verilog — ASCII-символы в конце?

Я возвращаю строку из функции C в SystemVerilog, используя DPI.

const char* print_input_dpi(int w, int h, int p, ......int mtail){
std::stringstream ss;

ss<<"w="<<std::hex<<w<<" ";
ss<<"h="<<std::hex<<h<<" ";
ss<<"p="<<std::hex<<p<<" ";
...
ss<<"mtail="<<std::hex<<mtail<<" ";

return (char*)ss.str().c_str();
}

На стороне SystemVerilog:

string formatted_string;
always @* begin
if(en) begin
formatted_string = print_input_dpi(w,h,p,...mtail)l
end

...
always @(nededge sclk) begin
$fdisplayb(log_file, "", formatted_string)
end

Результат:
иногда результат выглядит так:

w=1, h=3f, p=2f, ...mtail=0ã

иногда я получаю это:

w=1, h=3f, p=2f, ...mtailº

Я проверил осциллограммы на стороне Verilog, и они не являются распространением NO X.
Можете ли вы помочь мне понять, почему я получаю эту ошибку.

1

Решение

Поток строк, который вы так с любовью создали, вышел из области видимости в конце функции и был возвращен в биты, откуда он и пришел. Эти биты используются повторно и перезаписываются, вероятно, из-за того, что эти биты печатают эти биты, что приводит к повреждению. Если честно, тебе повезло. Может показаться, что он работал нормально и рухнул через неделю со следующего вторника.

const char* print_input_dpi(int w, int h, int p, ......int mtail)
{
std::stringstream ss; //<< local variable created here.
...
return (char*)ss.str().c_str();
} // out of scope and destroyed here, so the returned pointer now points to god knows what.

Быстрая починка:

string print_input_dpi(int w, int h, int p, ......int mtail)
{
std::stringstream ss; //<< local variable.
...
return ss.str();
}
3

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

Поток строки вышел из области видимости в конце функции, и связанная память была перезаписана. Правильное исправление, которое также поддерживает совместимость вашей функции с SV DPI — это просто изменить время жизни потока строк:

std::stringstream ss; // global variable
const char* print_input_dpi(int w, int h, int p, ......int mtail)
{
...
return ss.str().c_str();
}
0

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