一、指令优化
C/C++ Algorithm
|
v
[1. 接口设计] -> #pragma HLS INTERFACE (m_axi, ap_fifo, ap_hs)
|
v
[2. 任务级并行] -> #pragma HLS DATAFLOW + hls::stream
|----------> 对sub_function必须要保证对立性,也就是sub_function要使用函数#pragma HLS inline
|----------> 对LOOP使用pipeline优化
v
[3. 循环级优化] -> #pragma HLS PIPELINE (核心) + UNROLL
|
v
[4. 存储级优化] -> #pragma HLS ARRAY_PARTITION (解决PIPELINE的RAM端口瓶颈)
|
v
[5. 位宽优化] -> ap_int<N> / ap_fixed<W,I>
|
v
RTL (Verilog/VHDL) + Co-sim Verification
二、代码结构修改
1.尽量写可并行化的代码
2.尽量写无依赖的代码
三、软件思维 & 硬件思维
1.c是顺序执行的,是在时间轴上运行
2.rtl是空间维度 + 时间维度上的,rtl是空间维度的并行
3.C的执行在不考虑多线程前提下,都是顺序执行的,只有逻辑顺序的先后,
rtl是有颗粒度的,引入了时钟周期和延迟。
4.关于存储模式,C访问可以是cache,内存,以及磁盘;
文件操作使用的是磁盘IO,或者内存,数据访问可以是CPU中的寄存器,也可以是
cache,或者内存中的堆和栈;但是RTL访问的是LUT,FF,REG,RAM,URAM,DDR
5.评估标准:
frequency & II & latency
LUT,FF,BRAM,DSP