ram,rom,fifo,stable,数组,axilite
一、ap_stableap_stable用于器件处于复位时候才可以修改。如下优化指令#pragma HLS INTERFACE ap_stable portcfg_mem#pragma HLS INTERFACE s_axilite portreturn bundleCONTROL_BUS#pragma HLS INTERFACE s_axilite portcfg_mem bundleCONTROL_BUS综合报告会出现WARNING: [XFORM 203-803] Dropped interface mode ap_stable on cfg_mem.V (xxx.cpp:82) as it is incompatible with its interface mode s_axilite.INFO: [HLS 200-111] Finished Pre-synthesis Time (s): cpu 00:00:02 ; elapsed 00:00:11 . Memory (MB): peak 242.629 ; gain 157.172综合报告的意思就是会忽略掉ap_stable指令优化因为ap_stable和s_axilte指令兼容性出现了问题。二、ap_stable axilite优化矛盾问题1.协议规定无法将使用 ap_stable I/O 协议指定的任何实参分配到 AXI4-Lite 接口。就是说你不能将axilite指定的接口使用ap_stable优化虽然你指令可以这样写但是综合工具会忽略你的优化防止用户乱用。2.为何ap_stable指令和axilite优化指令不能兼容呢axilite修饰寄存器空间分为块协议部分信号占用的寄存器部分还有就是用户信号占用的用户空间寄存器地址端。注意这些寄存器的访问都是在ap_rst_n拉高之后进行的但是stable不一样stable修饰的变量是在复位期间改变的复位释放之后是保持不变的这就矛盾了。3.vivado hls中无法将使用 ap_stable I/O 协议指定的任何实参分配到 AXI4-Lite 接口的原因是Vivado HLS中这个问题的核心原因在于你试图将两种互斥的硬件实现方式强加给同一个信号从而引发了底层RTL设计的根本性冲突。ap_stable和s_axilite接口在设计哲学、数据处理方式和时序行为上都无法兼容。ap_stable 是端口级协议它直接修饰某个输入参数描述的是该独立数据端口的行为最终被实现为简单的连线Wire。s_axilite 是块级协议它为整个模块添加一个AXI总线从接口将所有控制信号包括试图用ap_stable标记的信号都映射到该总线接口的内部寄存器中通过地址进行访问。他们之间的冲突在于一个信号无法同时被实现为“直接连线”和“总线寄存器”。4.冲突一“被动连线” vs. “主动控制”数据传递方式的冲突这两种协议背后是两种完全不同的数据传递方式被动连线模型ap_stableHLS工具假设信号在模块运行期间本身是稳定的因此只需一根导线被动地将电平传递进去无需任何握手确认也无需寄存器保存数据以最小化硬件开销。主动控制模型s_axilite处理器通过总线主动将数据写入模块内部寄存器。这个过程中写使能、地址译码、数据写入等都需要复杂的控制逻辑来保证。冲突在于两种截然不同的硬件实现方式让一个信号既“不需要控制”又“需要复杂控制”这在物理上是自相矛盾的。5.冲突二复位时 vs. 运行时数据更新时机的差异ap_stable 的时序要求该协议强制要求信号仅在复位期间或模块启动前由外部更改一旦工作就开始其值就必须保持稳定--32。s_axilite 的工作方式它允许处理器在模块运行的任何时刻通过总线随时更新寄存器中的值。冲突在于这对于ap_stable是致命错误因为它要求被标记的信号在工作期间绝对不能变而s_axilite完全打破了这一假设。三、stable修饰数组stable 编译指示可用于标记数据流区域的输入变量或输出变量。其作用是移除其对应的同步假定用户保证此移除行为确实正确无误。void dataflow_region(int A[...], ...#pragma HLS stable variableA#pragma HLS dataflowproc1(...);proc2(A, ...);}目前的工具暂时没有看到使用#pragma HLS stable variableA这个指令的这个是非法的。目前知道的指令只有ap_stable暂时没有看到stable指令。四、将参数的配置的ram改成FIFO能不能改变latency或者II关于cfg_param这个数组目前应用中被综合为RAM进行地址的访问如果改成FIFO会有一个问题就是FIFO的数据读取了就没有了所以FIFO必须每帧图像都做数据更新才行但是RAM不需要RAM只需要你确实CPU要更新参数的时候才会进行处理所以这个是RAM的优势了RAM中如果不更新始终保留原始存入的数据这样不影响流程。