解决Vivado中AXI_Stream模版直接连接后的时序混乱问题

在搓一个IP核,用来实现AXI接口的路由。今天在测试Vivado中提供的AXI_Stream模版时,我简单的将主机和从机的AXIS模版在一个Testbench中连接起来,发现出现了时序错误,两个模版不能很好的衔接。

如图,在前8个时钟周期内,数据正常的读入了FIFO,但是,在第9个时钟周期,最后一个数据被覆盖到了第一个字节的位置。

按理说,由官方提供的模版是经过验证后有效的模版,但为什么会出现这样的问题呢?

在通过对两个模块单独仿真后发现,本应该传输8个的数据,在这样的连接中却传输了9个,这才导致了时序混乱。事实上,在官方提供的模版中,主机模版先在判断了从机信号READY有效后,才逐一将8个数据挂载在数据线上。这表明在从机没有发出READY信号时,主机挂载在数据线上的数据是无效信号。而从机模版在使用时,默认拉高自身的READY信号后,便会直接从主机读取数据。

在这种情况下,为了使从机对应主机的一个延迟,便要告诉从机延后一个时钟再读取数据。调整后的具体时序如图所示。

同样的,为了对齐两个模版的不同默认条件,我们也可以修改主机模版的默认条件,令第一个数据在VALID信号拉高时便挂载在主线上,而不是必须等待READY信号才进行数据变化。这里不再过多讨论。

这件事启示我们,在使用Xilinx提供的模版时,要着重注意隐含的默认条件,这些条件通常不会以注释的形式写在代码内。也正因此,需要我们多留意。

### AXI Stream 协议时序分析 AXI4-Stream 是一种高效的数据流传输协议,适用于芯片内部的高速数据流场景。其核心特点在于移除了地址线,简化了读写操作,专注于数据的发送与接收过程[^3]。 #### 数据传输流程与时序特性 在 AXI4-Stream 中,`TVALID` 和 `TREADY` 信号共同决定了数据的有效性和接收方的状态: - 当 `TVALID` 被置为高电平时,表示源端准备好了一个有效的数据帧。 - 当 `TREADY` 被置为高电平时,表示目标端已准备好接受该数据帧。 - 只有当两个信号均为高电平时,实际的数据传输才会发生。 以下是典型的时序描述: 1. **初始状态**: `TVALID` 和 `TREADY` 均处于低电平,无数据传输。 2. **准备阶段**: 源端将 `TVALID` 设置为高电平,并通过 `TDATA` 提供有效数据;同时设置其他辅助信号(如 `TLAST`, `TKEEP`, `TUSER`)。 3. **握手完成**: 如果目标端也将 `TREADY` 置为高电平,则当前周期内的数据被成功传递给目标端。 4. **结束标志**: 对于多字节数据包,在最后一个字节传输过程中,`TLAST` 将会发出一个单周期的高电平脉冲,表明此次传输已完成。 #### 时序约束考虑因素 为了确保 AXI4-Stream 的可靠运行,设计者需关注以下几个方面的时序约束: ##### 1. 配合延迟 (Setup Time & Hold Time) 对于同步电路而言,必须满足输入信号相对于时钟边沿的时间窗口要求。具体来说, - `TVALID` 到达时间应早于触发器采样时刻一定量级(setup time),并保持稳定直到下一个时钟到来(hold time)[^1]。 ##### 2. 最大频率支持下的路径延时计算 考虑到 FPGA 或 ASIC 实现中的布线资源有限以及负载变化的影响,应当仔细评估从源头到目的地之间最长可能存在的组合逻辑延迟是否小于半个工作周期(即 Tclk/2)。这通常涉及到静态时序分析工具的应用来验证整个链路能否达到预期的工作速度[^2]。 ##### 3. FIFO 缓冲区引入带来的额外考量 如果系统架构中加入了 AXI Data FIFO 来缓解上下游速率不匹配问题,则还需要特别注意以下几点: - 输入侧满条件(`full`)和输出侧空条件(`empty`)检测机制的设计; - 不同深度配置下对整体吞吐率造成的影响; - 特殊情况下溢出保护策略的选择等[^1]。 ```python def axi_stream_timing_analysis(clock_period, setup_time, hold_time): """ Perform basic timing analysis for an AXI Stream interface. Args: clock_period (float): Clock period in nanoseconds. setup_time (float): Setup time requirement relative to the clock edge in ns. hold_time (float): Hold time requirement after the clock edge in ns. Returns: dict: Summary of timing constraints and margins. """ max_comb_delay = clock_period / 2 results = { 'Clock Period': f'{clock_period}ns', 'Maximum Combinatorial Delay Allowed': f'{max_comb_delay:.2f}ns', 'Setup Margin': f'{setup_time - (clock_period - max_comb_delay):.2f}ns' if setup_time > (clock_period - max_comb_delay) else '>0ns', 'Hold Margin': f'{hold_time + max_comb_delay:.2f}ns' } return results ``` 上述函数提供了一种简单的方法来进行基本的 AXI Stream 接口定时分析。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值