在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3455|回复: 4

[原创] 万变不离其宗的异步FIFO面试(二)

[复制链接]
发表于 2021-3-21 16:24:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 wenhuajianyuan 于 2021-3-21 16:25 编辑

上一期为童鞋们带来了fifo工作的基本原理,本期将继续与各位童鞋探讨FIFO类面试相关问题。首先让我们回顾一下上一期的课后思考题:

如果读时钟域速度较快、写时钟域速度较慢(或者写、读时钟域速度相差较大)会出现什么情况?

   背景知识补充:假设存在两个时钟域CLKA和CLKB,信号从CLKA时钟域传输到CLKB时钟域,CLKA时钟周期为CLKB时钟周期两倍,且此处电路为同步电路(即所有触发器的状态的变化都与所加的时钟脉冲信号同步)如下图所示。
image.png


此时不难发现CLKA时钟域的逻辑变化时间点1、2、3,在CLKB时钟域总有时钟上升沿能采样CLKA时钟域的1、2、3节点的变化。

如果CLKA时钟域与CLKB时钟域时钟周期相反,即CLKB时钟周期为CLKA时钟周期的两倍,如下图所示。

image.png



此时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的验证为例,验证分为验证场景和验证平台。验证场景如表所示:

image.png

构建的UVM验证平台如下图所示:
image.png

注:在验证复位场景时,完整的复位验证应当包含以下情形的复位:
初始复位:在验证激励施加之前对读、写指针的复位,可以在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设计参考资料。
                                                                      image.png

发表于 2021-3-27 12:05:16 | 显示全部楼层
您好 请问能分享一下 异步fifo的dut和uvm验证平台的源码么
发表于 2021-11-3 10:54:19 | 显示全部楼层
写的很详细,给lz点个赞
发表于 2022-4-13 11:06:38 | 显示全部楼层
lz牛批,FIFO的确时面试官经常问到的题目
发表于 2022-4-13 11:08:15 | 显示全部楼层
读写时钟相差较大,导致同时产生满空状态,该如何处理
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-29 00:04 , Processed in 0.021652 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表