带AXI Stream接口的FIFO Generator 13.2独立仿真异常求助
AXI-Stream接口FIFO Generator 13.2 IP独立仿真排错与实现指南
现有测试台代码的核心错误点
- 多驱动冲突(仿真异常的最直接原因)
测试台作为上层验证模块,绝对不能对IP核的输出端口进行赋值操作。当前代码中手动对s_axis_tready、m_axis_tvalid、m_axis_tdata三个IP输出信号赋值,导致同一信号存在测试台、IP核两个驱动源,触发仿真器的多驱动报错,IP核状态直接错乱。 - 复位时序完全不符合IP要求
AXI-Stream接口的FIFO Generator 13.2 IP要求低电平复位s_aresetn的保持时长至少覆盖2个以上时钟周期,且复位阶段所有输入信号需保持稳定已知态。当前代码中复位仅保持20ns(远短于设置的50ns时钟周期),且复位未结束就将所有信号拉高,会直接导致IP内部寄存器初始化失败。 - 忽略IP初始化状态判断
IP在复位释放后,需要数个时钟周期完成内部RAM的初始化,此阶段会持续拉高wr_rst_busy和rd_rst_busy,期间无法正常收发数据。当前代码完全没有判断这两个状态信号,复位一释放就开始发送数据,必然出现丢数、状态异常。 - AXI-Stream传输逻辑违背协议规则
AXI-Stream的有效传输必须满足tvalid(源端输出的有效指示)和tready(收端输出的准备指示)同时为高,在对应时钟沿完成数据交互。当前代码没有按协议做握手等待,甚至混淆了发送端、接收端的信号方向,完全无法形成有效传输。
独立仿真的标准实现流程
- 第一步:梳理端口驱动方向,从根源避免多驱动
- 测试台需主动驱动的信号(IP输入端口):
s_aclk、s_aresetn、s_axis_tvalid、s_axis_tdata、s_axis_tuser、m_axis_tready - 测试台仅观测、禁止赋值的信号(IP输出端口):
wr_rst_busy、rd_rst_busy、s_axis_tready、m_axis_tvalid、m_axis_tdata、m_axis_tuser
- 测试台需主动驱动的信号(IP输入端口):
- 第二步:按IP要求完成复位流程
- 初始化阶段将所有测试台驱动的信号拉至已知态:
s_axis_tvalid = '0',m_axis_tready = '0',数据类信号置0 - 将
s_aresetn拉低,保持至少2个完整时钟周期(按当前50ns时钟设置,至少保持100ns以上) - 释放复位为高电平后,等待
wr_rst_busy和rd_rst_busy全部拉低,确认IP完成内部初始化
- 初始化阶段将所有测试台驱动的信号拉至已知态:
- 第三步:编写发送端测试逻辑
待IP初始化完成后,拉高s_axis_tvalid,等待s_axis_tready(IP输出的收端准备信号)与s_axis_tvalid同时为高时,在时钟沿完成1次数据写入;逐次切换写入的测试值,覆盖预设的测试用例。 - 第四步:编写接收端测试逻辑
当观测到m_axis_tvalid(IP输出的发端有效信号)为高时,拉高m_axis_tready,在两者同时为高的时钟沿锁存输出的m_axis_tdata、m_axis_tuser信号,与之前写入的测试值做一致性比对。
仿真调试的实用建议
- 优先在仿真日志窗口搜索多驱动(Multiple Driver)类报错,快速定位端口赋值方向错误
- 观测波形时先检查时钟、复位的稳定性与时长,再检查
wr_rst_busy、rd_rst_busy的状态跳转,确认IP初始化流程正常 - 测试时可动态调整
m_axis_tready的电平(比如随机拉低几个周期),验证FIFO的流控功能,更贴合真实硬件的工作场景 - 不需要搭建任何外部模块,仅通过上述测试台逻辑即可完成IP的全功能验证
内容的提问来源于stack exchange,提问作者fuatkeles
相关产品推荐
相关产品推荐

