马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 wenhuajianyuan 于 2021-3-21 16:25 编辑
上一期为童鞋们带来了FIFO工作的基本原理,本期将继续与各位童鞋探讨FIFO类面试相关问题。首先让我们回顾一下上一期的课后思考题:
如果读时钟域速度较快、写时钟域速度较慢(或者写、读时钟域速度相差较大)会出现什么情况?
背景知识补充:假设存在两个时钟域CLKA和CLKB,信号从CLKA时钟域传输到CLKB时钟域,CLKA时钟周期为CLKB时钟周期两倍,且此处电路为同步电路(即所有触发器的状态的变化都与所加的时钟脉冲信号同步)如下图所示。
此时不难发现CLKA时钟域的逻辑变化时间点1、2、3,在CLKB时钟域总有时钟上升沿能采样CLKA时钟域的1、2、3节点的变化。 如果CLKA时钟域与CLKB时钟域时钟周期相反,即CLKB时钟周期为CLKA时钟周期的两倍,如下图所示。
此时CLKA时钟域中的1、3、5节点信号值可以被CLKB时钟域采样,而2、4、6时钟节点的信号值被遗漏,出现了“漏采”。 由此可见,在跨时钟域数据同步时,使用快时钟域采样慢时钟域数据,数据可以被正确的采样,但是如果使用慢时钟域采样快时钟域数据,会出现“漏采”且该情形无法避免(注:此处指跨时钟域数据同步中使用两级D触发器的情形,异步FIFO中指针同步使用此方法)。 回到问题本身,如果读时钟域速度较快、写时钟域速度较慢(或者写、读时钟域速度相差较大)会出现什么情况? 情形一:读快、写慢。 由于读时钟域速度快,写时钟域速度慢,则当写时钟域指针同步到读时钟域时,数据同步正常,即判断读空状态时,判断正常;当读时钟域指针同步到写时钟域时,出现指针“漏采”,此时从数据同步图可以看出,当CLKA指针从1变到6的过程中,CLKB只会采样到1、3、5。取地址指向3的情形,当CLKB采样到指针3时,如果判断不为满,那此时FIFO必不为满。如果判断为满,则不一定真满(两级D触发器同步时会消耗两个周期,即读时钟域采样到3时,写时钟域指针已经到了5)。由此可见指针“漏采”并未对FIFO满空判断造成影响,而两级D触发器进行指针同步的滞后性,使得判断为满时,出现了假满,对FIFO的性能造成了影响。对满空进行保守判断的方法对性能造成损失,但不会出错。 情形二:读慢、写快。 请参照情形一类比。 极端情形:读、写速度相差数十倍或者数百倍时什么情形?(往年校招面试真题)
当读写时钟域速度相差极大时,假设写的速度极快,读的速度极慢,取极限,则一开始就会写满。同理,假设写的速度挤满,读的速度极快,取极限,则一开始就会读空。
异步FIFO设计核心:格雷码+指针同步 为了判断满空状态,引入最高位。 为了消除亚稳态,引入了格雷码。 为了判断满空状态,引入两级D触发器对指针进行同步。 在对异步FIFO的原理进行分析后,便可使用Verilog语言进行电路设计了,此处请各位童鞋自行设计哦,异步FIFO代码是各大公司笔试的必考题,童鞋们一定要慎重对待。 在异步FIFO设计完成后,新的问题又出现了: 如何验证一个异步FIFO?(紫光展锐2019校招面试题) 此处侧重于分析总结异步FIFO的功能点,考察对待验证设计的验证点提取能力。以基于UVM验证方法学对异步FIFO的验证为例,验证分为验证场景和验证平台。验证场景如表所示:
构建的UVM验证平台如下图所示:
注:在验证复位场景时,完整的复位验证应当包含以下情形的复位: 初始复位:在验证激励施加之前对读、写指针的复位,可以在driver中完成。 写复位:在FIFO写入过程中对写时钟域信号复位;在FIFO读出过程中对写时钟域信号复位。 读复位:在FIFO读出过程中对读时钟域信号复位;在FIFO写入过程中对读时钟域信号复位。 随机复位:任意情形下的随机复位。 在完成验证平台和验证场景的设计后,还需添加断言用于检查部分时序,所构建的断言应当包括以下点: (1)检查复位时所有指针和满/空信号是否都处于低电平状态。 (2)当fifo读计数为0时,检查fifo_empty是否被置位。 (3)当fifo写计数大于FIFO宽度时,检查fifo_full是否被置位。 (4)检查如果fifo已满,并且尝试写入时写入指针不会更改。 (5)检查如果fifo已空,并且尝试读出时读指针不会更改。 (6)有一个属性会在尝试fifo写满时发出警告。 (7)有一个属性会在尝试fifo读空时发出警告。
(8)确保在WRITE模式下,写输入指针处于已定义状态(0或1),它不应为X态.同样适用于READ模式。
关注公众号并回复关键字 “异步FIFO” 获取异步FIFO设计参考资料。
|