前言【异步FIFO琐事2】异步FIFO中异步遍历延迟约束的几点思考
上一篇博客主要讨论的是不需要异步数据总线之间的路径延迟限制,但本文继续讨论以下问题: 线程延迟太大,影响性能。 为了避免异步fifo本身引起的数据反压断路,应该使用多深的fifo呢? 特别是在慢时钟从异步跨越到快时钟的情况下如何?
FIFO深度计算假设数据从慢时钟跨越到快时钟。 写入后,wr_ptr向本地端拍打1拍,向异步侧拍打3拍读取侧,相反侧识别后读取数据,读取指针向本地端拍打1拍,向异步侧拍打3拍,向写入侧读取了1个数据
(Twr Twr_sync 3Trd ) ) Trd Trd_sync Twr )如果这段时间太长,写入端的数据就会大量到来,必然导致fifo深度不够。 fifo填满书写方,慢命中加快,出现fifo将书写方推回去的奇怪场景。 因此,我们必须
FIFO_depth=(twr_sync3TRD ) TRD_synctwr ) )/Twr )4) twrTRD ) )/Twr其中,
Twr :写入时钟周期
Trd :读时钟周期
Twr_sync :写入指针的遍历延迟
Trd_sync :读指针的遍历延迟
OK,有了这个公式,在制定异步最小fifo深度规划时有一定的参考价值,同时也可以限制行驶延迟;
典型的应用场景很容易计算FIFO深度。 例如,现在1GHz从异步扩展到2GHz,下游的pcie几乎永远不会反向。 那么,有可能将前段模块反压吗?
可能。 例如,将FIFO深度设为4;
这个算起来,没有针的延迟也不行啊。
4(1) 0.5 )/1=6,因此必须施加逆压。 因此,必须仔细计算。 如果将指针的遍历延迟估计为慢70%的时钟延迟,则可以计算如下:
4(1) 0.5 )1*0.7*2)=6) 1.4=8因此,掌握复盖器的当前延迟情况,至少需要8深度的fifo;
走针延迟的计算相反,如果知道fifo的深度,也可以计算实际的走针延迟是多少。 一般来说,后端上升,可能会被70%的快表约束。 那样的话,跑pt可能会出现很多违规。 因此,可以计算实际的走针延迟是多少才没有问题。 如果1G仍然跨越2G,则fifo的深度设置为10个,可以计算如下:
因为twr _ sync TRD _ sync=(FIFO _ depth * twr )-4 ) twr TRD=10-6=4,所以两个指针异步跨越的时间总共不超过4ns,简单地说,单遍最大
继续查看上面的表达式,可以看到,如果前导时钟下降,则fifo可能存在深度不足的风险,或者指针走线延迟会更加紧张。 例如,1G跨越1.5G时:
由于指针twr _ sync TRD _ sync=(FIFO _ depth * twr )-4 ) twrTRD )=10 - 6.666=3.333的遍历延迟的裕量更小,因此FIFO在系统的本地