咨询在Vitis HLS中使用C而非C++的局限性及hls类兼容性
在Vitis HLS中使用纯C的局限性及解决方案
核心结论
Vitis HLS提供的hls::task、hls::stream、hls::stream_of_blocks这类工具全部是C++专属特性,纯C语言完全无法识别和使用。如果要用到这些功能(尤其是实现AXIS接口这类需求),必须转用C++开发。
具体限制说明
hls::stream与AXIS接口:
实现AXIS接口的核心是用hls::stream定义端口的数据类型,这是一个C模板类,依赖C的命名空间、模板机制,纯C编译器会直接报语法错误。你提到的#pragma HLS interface axis depth=50 port=a offset=off编译指令,必须配合hls::stream类型才能生效,没有对应的C++类型,这个pragma无法完成AXIS接口的映射。其他
hls::类的使用限制:hls::task用于任务并行开发,hls::stream_of_blocks用于块数据流处理,二者都是基于C++类和对象设计的,纯C没有类的概念,根本无法实例化和调用这些工具。
关于转用C++的建议
你有多年C编码经验,转C++门槛很低:
- 不需要深入复杂的OOP特性(比如继承、多态),只需要掌握和Vitis HLS相关的基础C++语法:命名空间、类的基本使用、模板(主要是用现成的
hls::stream)。 - 大部分原有C代码可以直接复用,只需要把涉及HLS特性的部分改成C++写法。比如下面是一个简单的AXIS接口实现示例:
#include "hls_stream.h" // 定义AXIS数据结构 typedef struct { int data; bool last; } axis_pkt_t; void my_axis_ip(hls::stream<axis_pkt_t>& in_port, hls::stream<axis_pkt_t>& out_port) { #pragma HLS INTERFACE axis port=in_port depth=50 offset=off #pragma HLS INTERFACE axis port=out_port depth=50 offset=off #pragma HLS INTERFACE ap_ctrl_none port=return axis_pkt_t pkt; while (!in_port.empty()) { in_port.read(pkt); // 这里写你的C风格处理逻辑 out_port.write(pkt); } }
内容的提问来源于stack exchange,提问作者User626
相关产品推荐
相关产品推荐

