我正在使用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传播的。
您能否帮助我了解为什么会出现此错误。

最佳答案

您如此精心构建的字符串流在函数末尾超出范围,并从其返回的位返回。这些位被重用和覆盖,可能是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();
}

关于c++ - SystemVerilog DPI将字符串从C++返回到verilog-结尾是ASCII字符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30903292/

10-10 21:22