FPGA设计里经常遇到反常情况,写的计数器在仿真里时序完全符合预期,上板综合后莫名其妙多延迟一个时钟周期,反复核对代码逻辑也找不到问题。核心不是代码写错,是仿真和实际硬件的时序模型存在隐性差异。

1. 仿真忽略了IO输入延迟
仿真时直接把激励信号对齐时钟沿输入,没有考虑FPGA引脚的实际建立时间要求。
真实硬件中,外部输入信号到达寄存器的时间存在走线延迟,会被默认同步寄存器多打一拍,自然多出一个周期的延迟。
2. 综合工具自动插入了流水线
当计数器的位宽超过8位时,综合工具为了优化最高运行频率,会自动在计数进位链中间插入一级流水线寄存器。
这个自动插入的寄存器不会在仿真波形里体现,上板运行时就会多出一个周期的延迟。
3. 异步复位的同步释放问题
如果计数器用的是异步复位,复位信号释放时没有做同步处理。
复位释放的时刻刚好落在时钟沿附近,寄存器进入亚稳态,相当于计数器晚一个周期才开始正常计数,看起来就像多了一个周期。
4. 快速定位修复
在代码里显式标注计数器的keep属性,禁止综合工具自动插入额外寄存器。
给所有外部输入信号加一级手动同步寄存器,让仿真和硬件的时序完全对齐,就能消除这个额外的周期延迟。
本文凡亿教育原创文章,转载请注明来源!
暂无评论