c++ - 使用 DPI 从 C++ 函数中的 SV 读取值时出错

标签 c++ system-verilog system-verilog-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++ 方面,我将值(value)视为:

    extern "C" string mainsha(string input)
 {

    string output1 = sha256(input);

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

当我单独运行 C++ prog 时,我得到了正确的输出。但是在控制台我得到以下输出:

sha256(''):e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

有人可以建议我哪里出错了或者我遗漏了什么吗?

最佳答案

目前SystemVerilog标准中的DPI只支持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 原型(prototype),并且您可以在编译 C++ 代码时包含该文件。这样,如果存在不匹配并且不必调试运行时行为,您将收到编译器错误。

关于c++ - 使用 DPI 从 C++ 函数中的 SV 读取值时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46553673/

相关文章:

c++ - 如何(可移植地)使用 C++ 类层次结构和动态链接库

c++ - 如何从 QDataStream 中读取数组

Ruby 和 SystemVerilog DPI

verilog - 当 RTL 和 Goldenmodel 可能产生不同但正确的输出时,验证 HW 的标准方法是什么?

c - SystemVerilog DPI-C 指针

c++ - 如何通过具有 DPI 导入功能的开放数组在 SV 和 C++ 之间双向传递数据

c++ - 是否需要实现来诊断对同一TU中相同显式专业的重复定义进行ODR违规?

verilog - 从测试台访问子模块中的输入和输出

c++ - 返回多个值