You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询在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++门槛很低:

  1. 不需要深入复杂的OOP特性(比如继承、多态),只需要掌握和Vitis HLS相关的基础C++语法:命名空间、类的基本使用、模板(主要是用现成的hls::stream)。
  2. 大部分原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:57:49