Vivado HLS 完整语法大全(C/C++ 扩展 + 综合指令 + 接口 + 优化 + 数据类型 + 函数 / 循环 / 数组)

📅 2026/6/27 1:06:23
Vivado HLS 完整语法大全(C/C++ 扩展 + 综合指令 + 接口 + 优化 + 数据类型 + 函数 / 循环 / 数组)
Vivado HLS 基于标准 C/C额外提供#pragma HLS综合专用指令、硬件限定语法、接口协议语法、定点类型、并行 / 流水 / 资源约束语法下文分模块全覆盖所有常用语法。一、基础数据类型HLS 硬件专用扩展1. 标准整数 / 浮点兼容 Cchar/short/int/long/unsigned char... float/double // 浮点会综合为DSP资源大2. 定点类型核心#include ap_fixed.h语法模板ap_fixed总位宽, 整数位宽, 舍入模式, 溢出模式 变量名; ap_ufixed总位宽, 整数位宽, 舍入模式, 溢出模式 // 无符号定点参数说明总位宽 W包含整数 小数I整数部分位数含符号位舍入模式可选AP_RND四舍五入 /AP_TRUNC截断 /AP_RND_ZERO向 0 取整溢出模式可选AP_WRAP循环溢出 /AP_SAT饱和限幅示例ap_fixed16,8 data; // 16位有符号8位整数默认截断循环溢出 ap_ufixed32,10,AP_RND,AP_SAT coeff;3. 任意位宽整数#include ap_int.h最常用硬件位宽ap_uintN // 无符号N位整数 N∈[1,1024] ap_intN // 有符号N位整数 N∈[1,1024]示例ap_uint8 byte; ap_int12 sensor_val; ap_uint1 flag; // 1位布尔替代bool4. 其他专用类型ap_bool1 位布尔等价ap_uint1hls::streamT数据流 FIFO接口 / 流水线必备complexT复数定点#include ap_complex.hap_complexap_fixed16,6 cpx;二、数据流 hls::stream 语法AXI-Stream 硬件 FIFO头文件#include hls_stream.h using namespace hls;定义语法stream数据类型 流名 DEPTH深度; // 综合深度约束 pragma 配套 streamap_uint32 data_in;读写 API 语法阻塞 / 非阻塞// 阻塞读写综合推荐自动同步流水线 stream.read(var); // 读1个数据 stream.write(val); // 写1个数据 // 非阻塞带状态返回 bool ok stream.read_nb(var); bool ok stream.write_nb(val); // 空/满判断 bool empty() stream.empty(); bool full() stream.full(); // 批量读写burst stream.read_block(buf, len); stream.write_block(buf, len);流深度约束 pragma 配套#pragma HLS STREAM variabledata_in depth64 #pragma HLS STREAM variabledata_in typefifo // fifo/shift_register三、核心综合指令#pragma HLS 全语法重中之重所有#pragma HLS必须放在函数内、循环上方、变量上方作用域分函数级、循环级、数组 / 变量级、接口级。一接口相关 pragma顶层函数 IO生成 AXI/IO 协议1. INTERFACE指定端口硬件协议通用语法#pragma HLS INTERFACE 协议类型 port端口名 [参数列表]ap_none普通寄存器 IO默认#pragma HLS INTERFACE ap_none portdinap_ctrl_hs握手控制信号valid/ready#pragma HLS INTERFACE ap_ctrl_hs portdinap_ctrl_chain链式流水线握手ap_fifo端口映射外部 FIFO#pragma HLS INTERFACE ap_fifo portstream_out depth128axisAXI4-Stream 数据流接口#pragma HLS INTERFACE axis portinput_stream register_modeboth // 参数register_modeoff/input/output/boths_axiliteAXI4-Lite 寄存器控制寄存器映射#pragma HLS INTERFACE s_axilite portreturn bundleCTRL #pragma HLS INTERFACE s_axilite portcfg bundleCTRL offset0x10 // bundle分组同一AXI-Lite总线offset寄存器地址偏移m_axiAXI4-Master 外部 DDR 读写数组 / 指针#pragma HLS INTERFACE m_axi portddr_buf offsetslave bundleMEM depth1024 // offsetslave偏移由AXI-Lite配置direct直接地址 // max_read_burst_length/max_write_burst_length突发长度完整带参示例#pragma HLS INTERFACE m_axi portoutput offsetslave bundleOUT_DMA max_write_burst_length2562. RESOURCE绑定端口到 IO 资源#pragma HLS RESOURCE variabledin coreAXI_STREAM二循环优化类 pragma流水、展开、重定时1. PIPELINE 流水线最常用II 启动间隔语法放在循环 / 函数开头#pragma HLS PIPELINE IIN [rewind] [flatten]II1最优无气泡流水线rewind循环首尾直通消除循环间隔flatten嵌套循环合并单一流水void top(){ #pragma HLS PIPELINE II1 rewind for(int i0;i1024;i){ ... } } for(int i0;i64;i){ #pragma HLS PIPELINE II2 }2. UNROLL 循环展开并行计算消耗更多硬件// 完全展开 #pragma HLS UNROLL // 部分展开每3次迭代一组并行 #pragma HLS UNROLL factor3 // 带偏移展开 #pragma HLS UNROLL factor4 skip_exit_check3. LOOP_FLATTEN 嵌套循环扁平化#pragma HLS LOOP_FLATTEN // 把两层for合并为单层方便统一流水4. LOOP_MERGE 合并多个独立循环#pragma HLS LOOP_MERGE force // force强制合并无依赖循环提升吞吐5. LOOP_TRIPCOUNT 指定循环迭代上限辅助时序分析#pragma HLS LOOP_TRIPCOUNT min16 max1024 avg5126. RESHAPE 循环迭代重排序#pragma HLS RESHAPE variablearr typeblock factor4 dim1三数组存储资源约束BRAM/LUTRAM/REG/ROM1. ARRAY_RESHAPE 数组分块 / 重组并行访问消除访存冲突// 一维数组拆分为4路并行数组块式分割 #pragma HLS ARRAY_RESHAPE variablebuf typeblock factor4 dim1 // 循环分割 cyclic #pragma HLS ARRAY_RESHAPE variablebuf typecyclic factor2 dim1 // 完整打散为独立寄存器 #pragma HLS ARRAY_RESHAPE variablecoeff typecomplete dim12. ARRAY_PARTITION 数组分区核心解决单端口 RAM 访存瓶颈#pragma HLS ARRAY_PARTITION variable数组名 type模式 factorN dim维度typecomplete全分区每个元素独立寄存器最高并行资源大typeblock块分区连续 N 个元素一组typecyclic交错分区元素循环分配到存储块 示例int coeff[16]; #pragma HLS ARRAY_PARTITION variablecoeff typecomplete dim1 ap_uint32 mat[8][8]; #pragma HLS ARRAY_PARTITION variablemat typeblock factor4 dim2 // 对二维第二维分区3. ARRAY_MAP 多数组合并到同一 RAM#pragma HLS ARRAY_MAP variable{a,b,c} instanceshared_ram latency14. RESOURCE 指定数组硬件载体// 绑定到Block RAM #pragma HLS RESOURCE variableram_buf coreRAM_2P_BRAM // LUTRAM分布式RAM #pragma HLS RESOURCE variablesmall_buf coreRAM_1P_LUTRAM // 常量数组映射ROM const int coeff[64]{...}; #pragma HLS RESOURCE variablecoeff coreROM_2P // 寄存器堆 #pragma HLS RESOURCE variablereg_buf coreREGRAM core 可选列表RAM_1P_BRAM / RAM_2P_BRAM / RAM_TDP_BRAM / RAM_1P_LUTRAM / RAM_2P_LUTRAM5. DEPENDENCE 消除虚假数据依赖允许并行 / 流水// RAW/WAW/WAR 依赖忽略 #pragma HLS DEPENDENCE variablebuf inter false #pragma HLS DEPENDENCE variablebuf intra false // inter不同迭代间依赖intra同迭代内依赖四函数级优化 pragma1. INLINE 函数内联消除函数调用层级// 强制内联 #pragma HLS INLINE // 禁止内联生成独立硬件模块 #pragma HLS INLINE off2. STREAM 流深度、存储类型约束#pragma HLS STREAM variabledata_fifo depth256 typefifo // typefifo / shift_register3. ALLOCATION 限制运算单元复用数量控制资源// 乘法器最多实例化2个 #pragma HLS ALLOCATION instancesmul limit2 function* // 自定义函数最多3个硬件实例 #pragma HLS ALLOCATION instancesfilter limit3 functionfilter4. LATENCY 约束函数最大延迟#pragma HLS LATENCY min10 max1005. RESHAPE 函数数组重塑同数组 reshape五常量 / ROM、全局变量、顶层专用CONSTANT常量强制映射 ROM#pragma HLS CONSTANT variabletableTOP指定顶层函数综合入口#pragma HLS TOP functionmain_processDATAFLOW多函数流水线并发模块间流传输无全局缓存 函数组语法void top(){ #pragma HLS DATAFLOW // 函数级dataflow stage1(in, mid); stage2(mid, out); }配套约束c运行#pragma HLS DATAFLOW #pragma HLS STREAM variablemid depth32dataflow 作用多个子函数并行流水依靠 stream 交互大幅提升吞吐。四、指针与数组语法HLS 硬件限制 扩展1. 一维 / 二维数组标准定义c运行ap_uint16 buffer[1024]; ap_fixed24,8 matrix[32][32]; // 常量ROM数组 const ap_uint8 lut[256] {0x01,0x02,...};2. 指针约束顶层指针默认映射 AXI-MASTERc运行void top(ap_uint32 *in, ap_uint32 *out){ #pragma HLS INTERFACE m_axi portin bundleDMA }HLS 不支持动态 malloc/free仅支持静态数组 / 顶层指针函数内部禁止动态内存分配3. 数组传参语法c运行// 定长数组 void filter(int buf[64]); // 未指定长度推荐搭配m_axi void dma_transfer(int buf[]);五、控制流扩展语法标准 C 兼容 HLS 硬件特性1. 分支 if /else if /else标准 C可搭配资源共享优化分支过多会增大 latencyc运行if(flag){ a b; }else{ a - b; }2. switch-case综合为多路选择器 MUXc运行switch(op){ case 0: res ab; break; case 1: res a-b; break; default: res 0; }3. 循环 for /while/do-while支持所有标准循环搭配 UNROLL/PIPELINE/LOOP_FLATTENc运行for(ap_uint10 i0;i1024;i){} ap_uint8 cnt0; while(cnt64){ cnt; }4. 条件运算符?:综合为 2 选 1 MUX适合流水线无分支c运行res en ? data : 0;5. goto不推荐综合时序差HLS 支持但强烈禁用破坏流水线分析六、定点 / 复数运算语法ap_fixed/ap_complex1. 基础四则运算c运行ap_fixed16,6 a,b,c; c a b; c a * b; // 乘法自动扩展位宽可手动截断 c a 2; // 移位缩放定点2. 定点类型转换c运行ap_fixed32,10 big a; // 高位宽接收低位宽自动扩展 ap_fixed8,2 small (ap_fixed8,2)big; // 强制截断3. 复数运算 ap_complexc运行ap_complexap_fixed16,5 x,y,z; z x y; z x * y; z.real() // 取实部 z.imag() // 取虚部七、函数语法与模块划分1. 普通子函数c运行ap_uint16 add(ap_uint8 a, ap_uint8 b){ #pragma HLS INLINE return a b; }2. 顶层函数硬件顶层模块必须无返回 / 返回 void 或 ap_ctrl 状态c运行void top_demo( streamap_uint32 din, streamap_uint32 dout, ap_uint8 cfg ){ #pragma HLS TOP #pragma HLS INTERFACE axis portdin #pragma HLS INTERFACE axis portdout #pragma HLS INTERFACE s_axilite portcfg bundleCTRL #pragma HLS PIPELINE II1 }3. 引用传参 流引用stream 必须传引用拷贝无法综合c运行void process(streamap_uint16 in, streamap_uint16 out);注意hls::stream不支持值拷贝只能引用传递4. 递归函数HLS不支持递归综合递归代码会报错必须展平为循环八、结构体 struct 语法打包多通道数据定义 流传输常用c运行typedef struct{ ap_uint16 data; ap_uint1 valid; } axi_pkt; streamaxi_pkt pkt_stream;结构体端口接口c运行void top(streamaxi_pkt in); #pragma HLS INTERFACE axis portinHLS 会自动把结构体打包为连续位宽总线输出 AXIS。九、仿真专用语法仅 C 仿真不综合到硬件1. 测试激励文件 tb.c 专用函数c运行#include hls_tb.h // 文件读写仅仿真有效综合时自动删除 FILE *fp fopen(input.txt,r); fread/fwrite/fprintf // 打印调试 printf(data %d\n, val); // 波形dump生成VCD hls_dump_wave(wave.vcd);2. 条件综合宏区分仿真 / 硬件综合c运行#ifdef __SYNTHESIS__ // 仅综合执行硬件代码 #else // 仅C仿真执行激励打印、文件IO #endif__SYNTHESIS__是 HLS 内置宏综合工具自动定义。十、位操作硬件专用语法ap_uint/ap_int1. 切片取位核心硬件操作c运行ap_uint32 word 0x12345678; ap_uint8 byte0 word.range(7,0); // [7:0]低8位 ap_uint4 nibble word.range(11,8); word.range(15,8) 0xAA; // 位域赋值 ap_uint1 bit3 word[3]; // 单bit读取 word[5] 1; // 单bit写2. 移位、按位运算c运行word 2; word 1; word mask; word | val; word ^ 0xFF; ~word;3. 拼接 concat ()c运行ap_uint16 high 0xABCD; ap_uint16 low 0x1234; ap_uint32 full concat(high, low); // 拼接高低位十一、全局变量语法限制全局数组默认生成共享 BRAM多读写端口会产生冲突必须加ARRAY_PARTITION全局 stream 不推荐优先函数局部 streamdataflow全局 const 数组自动映射 ROMc运行const ap_uint16 sine_lut[256] { ... }; #pragma HLS RESOURCE variablesine_lut coreROM_1P十二、完整语法速记分类表表格类别核心语法 / 关键字硬件位宽ap_uintN ap_intN定点小数ap_fixed ap_ufixed ap_complex数据流 FIFOhls::streamT .read() .write()综合指令#pragma HLS PIPELINE UNROLL ARRAY_PARTITION INTERFACE DATAFLOW INLINE ALLOCATION DEPENDENCE STREAM RESOURCE TOP数组优化ARRAY_PARTITION / ARRAY_RESHAPE / ARRAY_MAP接口协议axis m_axi s_axilite ap_fifo ap_ctrl_hs循环优化PIPELINE II LOOP_FLATTEN LOOP_MERGE LOOP_TRIPCOUNT UNROLL位操作.range() [] concat()综合宏__SYNTHESIS__并行架构DATAFLOW 多函数流水线存储资源RAM_BRAM RAM_LUTRAM ROM REG仿真专用printf fopen fread hls_dump_wave十三、高频易错语法规则必记stream只能引用传递不能值传递动态malloc/ 递归不支持综合#pragma HLS必须紧跟作用对象上方不能跨代码块顶层数组指针搭配m_axi接口实现 DDR 访问多端口同时读数组必须分区ARRAY_PARTITION completePIPELINE II1 要求消除所有迭代间数据依赖需配合DEPENDENCEDATAFLOW仅支持 void 子函数依靠 stream 交互定点乘法默认扩展位宽长乘后需手动截断避免位宽爆炸ap_uint1替代 bool综合仅 1 位寄存器循环变量尽量用ap_uint代替 int减少符号位硬件消耗。