Vitis HLS自定义中断与AXI主事务同步问题咨询
Vitis HLS m_axi接口总线拥塞时中断提前触发、设计阻塞问题
背景说明
- 日常开发中使用Vitis HLS完成设计综合,所实现的设计主函数单次调用对应1个时钟周期,采用流水线架构,绝大多数应用场景下运行正常;针对需要保证确定延迟、固定流水线深度的组件,会直接使用Verilog开发。
- 本次设计目标:实现DMA向Zynq-7000内存传输数据的逻辑,传输完成后触发中断,通知PS端DMA传输结束。
- 现有工程逻辑:PS端可通过组件s_axilite接口上信号的上升沿,触发组件启动uint32类型数据的DMA传输,对应实现代码如下:
#include <cstdint> void Example ( uint32_t *dmaRegion, bool &intrSig, volatile bool writeNow ) { #pragma HLS PIPELINE II=1 #pragma HLS INLINE RECURSIVE #pragma HLS INTERFACE s_axilite port=return bundle=registers #pragma HLS INTERFACE ap_ctrl_none port=return #pragma HLS INTERFACE m_axi port=dmaRegion offset=slave bundle=x #pragma HLS INTERFACE s_axilite port=dmaRegion bundle=registers #pragma HLS INTERFACE ap_none port=dmaRegion #pragma HLS INTERFACE s_axilite port=writeNow bundle=registers #pragma HLS INTERFACE ap_none port=writeNow #pragma HLS INTERFACE ap_none port=intrSig static bool lastWriteNow { false }; static uint32_t Ctr { 0 }; bool intr = false; if (!lastWriteNow && writeNow) { Ctr++; dmaRegion[10] = Ctr; intr = true; } intrSig = intr; lastWriteNow = writeNow; }
正常运行表现
- 当Zynq经SmartConnect向组件反馈高电平WREADY信号时,设计可正常产生宽度为1个时钟周期的中断脉冲,目前检索到的部分公开示例也采用了同类实现方式。
- 中断触发后,PS端可从DDR对应内存区域(该区域已禁用L2数据缓存)读取到正确数据,WREADY正常握手场景下功能完全符合预期。
异常场景表现
- 当多个AXI主设备同时访问SmartConnect造成总线拥塞,导致本组件对应的WREADY信号拉低时,功能出现异常。
- 测试中将AXI SmartConnect主接口的WREADY信号固定为低电平,模拟永久拥塞场景,可观测到中断信号与WVALID信号持续保持高电平。
- 该状态下AXI写事务始终无法完成,只要AXI总线处于拥塞状态,设计就会持续阻塞无法恢复。
待解答疑问
- 该异常现象的底层原理是什么?是否HLS设计在if语句块内发生了阻塞?该现象与Vitis HLS报告中已满足II=1约束的结论似乎存在矛盾。
- 按照AXI协议规则,WVALID在数据有效时必须拉高,且需保持电平直到WREADY为高完成握手,但无法解释为何在事务尚未完成时,中断线就会拉高并持续保持高电平。
- 基于Vitis HLS的m_axi接口是否可以为「DMA传输完成后触发中断」的需求提供可靠的时序保证,还是必须更换为其他实现方案?
内容的提问来源于stack exchange,提问作者philyg
相关产品推荐
相关产品推荐

