我使用DPI将一个字符串从C函数返回到SystemVerilog。
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传播。 能帮我理解为什么会出现这个错误。
答案 0 :(得分:3)
你如此精心构建的字符串流在函数结束时超出范围,并返回到它来自的位。这些位被重用和覆盖,可能是由于cout打印所述位,导致损坏。说实话,你很幸运。它可能看起来工作正常,从下周二开始一周就崩溃了。
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();
}
答案 1 :(得分:0)
字符串流在函数末尾超出范围,并且相关的内存被覆盖。保持函数与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();
}