异步FIFO相关面试问题

又到了一年一度的招聘季节,有粉丝私信问了一个问题,一个关于以前流传出来的大厂面试的题目,个人觉得算是比较经典的题目,也是工作中经常遇到的一个问题,所以准备写一篇回答下。
题目内容有一个数据需要从a时钟域同步到b时钟域,数据位宽是512bit的,但是考虑到其他原因,目前只允许使用256bit异步fifo(已经考虑空度满写的保护),因此设计了一个方案,如下图所示,请问该方案有什么问题?如何优化?
分析通过上图我们可以看到,512bit的数据,被分成了2组256bit的数据,采用同一个写使能信号写入到2个不同的异步fifo中。在读这一侧,通过一个fifo的空信号,同时将2个fifo中的数据读出来。乍一看起来好像没有什么问题,且仿真的话,也不会有问题。但是在实际芯片中却不是这么回事。主要的错误就是误认为完全相同的异步fifo在空、满信号状态上表现也一样。
我们知道异步fifo的空满信号是通过格雷码地址经过转换后比较得到的,而格雷码在穿越异步时钟域的时候,由于亚稳态,有可能造成穿越的结果出现延迟。如下图所示,在t1时刻,写地址的格雷码已经由00变成01,即写入了一个数据。读时钟r_clk在采样的过程中,由于亚稳态写地址同步后,可能得到01,或者00,如果得到01,那么在t2时刻empty信号就可以拉低了,如果是00,那么在t2时刻empty不会拉低,需要在t3时刻拉低。
一句话总结,对于2个完全一样的异步fifo,即使同时写入数据,在读时钟域,empty信号的产生也是不一样的,同样,在写时钟域,full信号的产生也是不一样的。
解决方案这个问题的解决方案其实很简单,写入测,ready_o信号的产生不能只使用fifo_1的满信号,也要使用fifo_2的满信号,即ready_o = full1_n & full2_n(full低电平有效)。同理,在读数据的时候,不能只看fifo_1是否空,必须是2个fifo都不空的时候才可能读数据。
总结其实上面这个题目在实际项目是经常用到的。2个fifo被同时写入的时候,默认为2个fifo是同时不空的,通过上面的分析,我们知道异步fifo不是这么回事,那同步fifo呢?理论上来讲,同步fifo是同时不空的。但是不同厂家设计的fifo,其特性可能也有差异,从代码的可移植性和可靠性来讲,也不建议采用一个fifo为空就推断另一个fifo也为空的方案,必须严格遵守:使用哪个fifo,就要使用它的空、满信号。

中国区块链的监管哪里还需要完善
华为星闪技术是什么意思 华为星闪技术板块怎么样
普诺飞思PureSentry系统在污染物检测发挥潜力
提升机智能监控运维系统解决方案
红米卢伟冰宣布明天公布Redmi旗舰命名
异步FIFO相关面试问题
fireflyAIO-3399J主板电源适配器介绍
“上市公司金牛奖”榜单揭晓,紫光国微荣膺董秘大奖
步进电动机如何实现通电
佳能医疗希望通过快速检测系统的落地应用
谈电机上增加变频器的好处
微软通过股票回购计划提高自己的股价
软件无线电在手机和测量仪器中的应用及示例
物联网技术可望降低发电厂带来的污染
云网融合将构筑运营商差异化竞争力,中国电信七方面攻关云网融合
为什么GaN FET是LLC转换器设计的最佳选择
意外风险直升?利尔达燃气智能解决方案助力安全过冬
三星晶圆代工一季度将大降价,欲与对手抢单
图像传感器迎来了黄金时代
纬创iPhone代工厂被打砸的背后竟是克扣工资