C++ HLS 综合警告

Posted

技术标签:

【中文标题】C++ HLS 综合警告【英文标题】:C++ HLS Synthesis Warnings 【发布时间】:2016-11-08 13:50:35 【问题描述】:

当我尝试使用 Vivado HLS 进行合成时,我在同一行收到以下错误:

严重警告:[SYNCHK 200-43] pcd_triangulation/pcd_triangulation.cpp:156:使用或分配 非静态指针'current.0.i.reg2mem'(这个指针可以指 不同的内存位置)。

严重警告:[SYNCHK 200-11] pcd_triangulation/pcd_triangulation.cpp:156:常量“开始”具有 不可合成的类型'lass.triangle.2.28.31 = type [3 x “lass.triangle.2.28.3 ...”(可能原因:指向指针的指针或 全局指针)。

严重警告:[SYNCHK 200-11] pcd_triangulation/pcd_triangulation.cpp:156:常量“开始”具有 不可合成的类型'^lass.triangle.2.28.31 = type [3 x “lass.triangle.2.28.3...”(可能原因:结构变量 由于(1)不支持的类型转换而无法分解; (2) 内存复制操作; (3) struct中使用的函数指针; (4) 不支持的指针比较)。

严重警告:[SYNCHK 200-42] pcd_triangulation/pcd_triangulation.cpp:156:指针比较不是 支持。

代码是 C++。所以这是给出上述警告的代码:

if(start->child[0]==NULL && start->child[1]==NULL && start->child[2]==NULL)

start 是指向类 (triangle *start) 的全局指针,child[i] 是指向类(成员)内同一类的数组(triangle *child[3])。

class triangle 
   public:
    triangle *child[3];
    ...


triangle *start;

inline triangle *mylocate(int p) 
    if (start->child[0] == NULL && start->child[1] == NULL &&
        start->child[2] == NULL) 
        return start;

        ...
    

谁能帮我解决这些问题?

【问题讨论】:

能否为您的问题添加一些上下文?事实上,您的问题无法回答。 你能不能也把你的代码整理一下? 对不起,我不能上传我所有的代码,太大了。我会尝试找到处理相同问题的人来帮助我。我是新来的,我不知道如何安排我的问题。 triangle类声明后加分号 【参考方案1】:

我对vivado一无所知,但它声称“不支持指针比较”。 你在比较指针。

所以不支持。所以你不能做指针比较:/

【讨论】:

【参考方案2】:

当您使用 Vivado HLS 时,您必须牢记一些重要的事情:您正在翻译硬件中的 C 或 C++ 代码。这是什么意思?好吧,不可能动态地分配内存,要合成的函数必须有一些 PHISICAL 端口(用于输入、输出和控制)和其他许多重要问题。一个指针,在这个特定的内容中,是一个端口的地址,只要在创建比特流后硬件保持不变,就永远不会改变。总结答案:如果你想用晶体管连接合成它,你必须以特定的方式重写 C 或 C++ 代码。如果您有编写 VHDL 或 Verilog 的经验,这是一个最佳起点。你应该重写你的函数,也许看看this document。

【讨论】:

以上是关于C++ HLS 综合警告的主要内容,如果未能解决你的问题,请参考以下文章

为啥 c++ 编译器不会警告返回对局部变量的引用?

C++:禁用隐式转换警告

为啥在返回右值引用时给出 C++ 编译器警告?

为啥 C++ 已弃用的警告会打印两次?

使用 -Wall 编译 c++ - 来自其他文件的警告

在 C++ 中显示“匿名”变量创建警告