【问题标题】:SystemVerilog DPI-C pointersSystemVerilog DPI-C 指针
【发布时间】:2014-11-22 13:46:13
【问题描述】:

我对 SystemVerilog 和 C 之间的 DPI 连接有疑问。具体来说,我有一个 C 函数,如下所示:

unsigned short C_FUN(unsigned char* data)

我想传递给它的是bit[7:0] my_darray[];

最好的方法是什么? 提前致谢。

【问题讨论】:

    标签: c system-verilog system-verilog-dpi


    【解决方案1】:

    混合的打包/解包动态数组在 DPI 的 C 层中作为svOpenArrayHandle 处理。您将不得不创建一个包装函数,将 SystemVerilog 类型转换为您的类型:

    #include "svdpi.h"
    
    unsigned short c_fun_wrapper(const svOpenArrayHandle a) {
      unsigned char* data;
      // convert 'a' to your type
      // ...
    
      // call your function
      return c_fun(data);
    }
    

    有关如何转换的更多信息,请查看IEEE 1800-2012 standard,第 35 节和附件 H。

    您基本上拥有一些不错的函数,可用于对数组进行操作(在svdpi.h 文件中定义):

    int svLength(const svOpenArrayHandle h, int d);
    void *svGetArrElemPtr1(const svOpenArrayHandle, int indx1);
    

    您可以使用这些函数循环遍历所有元素并填充char 将由data 指向的数组。

    【讨论】:

    • 如果你在SV端使用byte unsigned ,在C端使用char,效率会更高。编码数据中的长度或使用特殊的终止字符,如 。那么就不需要使用 sv 方法了。
    • @Alessandro 就像 StackOverflow 的提示一样,在撰写评论时,您可以使用 @ 字符来解决它。在您的情况下,您可以写@dave_59 或直接开始写@dave,然后会弹出一个工具提示来选择全名。这样,当您发表评论时,收件人会收到收件箱消息。
    • 我一直在寻找有关所有这些函数(svLength、svGetArrElemPtr1 等)的文档以及我找不到的其他函数。我只是不断地看到论坛帖子通过传递提到它们,但没有什么“官方”或“完整”可以说。它们是 SystemVerilog 标准的一部分吗?它们是由供应商定义的吗?有人可以帮忙找到一些关于他们的文档吗?
    • @viterbi 它们在 LRM 中有描述(在答案中链接,可免费下载)。
    • 感谢@TudorTimi 我找到了。我注意到,在我的模拟中,从我的 C 代码编写一个在 SV 中分配的开放数组将不起作用,除非我在调用 C 函数之前在 SV 中向数组写入了一些东西......我用 data = new[size] 分配数组;然后调用 C 方法“get_data(data)”。在 C 中,我使用“p = (unsigned int*)svGetArrayPtr(data_handle);”获取指向数组的指针然后用 mempcy(p, source, svSize(data_handle)*4); 编写它。如果我先在数组中写了一些东西,同样的代码可以正常工作......所以我很确定代码是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多