面试必杀技:异步FIFO

上一篇介绍了异步FIFO的基础部分,包括为什么用Gray Code来同步read pointer, write pointer。这一篇咱们从头一起过一遍异步FIFO的具体设计,然后再讨论几个常见的问题。

有的面试官可能上来让你先画异步FIFO的框图,建议大家自己手画一下,能够记住。

要注意,wptr和rptr都是gray code,在上一篇我们已经讨论过gray code是可以直接利用2flop synchronizer来同步的。而用来读写实际的memory必须是binary address,在FIFO write control和FIFO read control里面我们进行binary to gray code的转换。

下面是上图中间fifo memory部分的简单实现

上面的code简化了rdata的逻辑,如果使用SRAM,可能需要加一级flop来存储SRAM读出来的值。

这里插一句,在设计异步FIFO或者使用异步FIFO的时候,需要计算清楚FIFO的深度,(如何FIFO的深度计算老李打算以后单独开一篇文章来讨论)然后要比较使用SRAM和flop array的cost。依据老李的经验,目前较新的7nm/5nm的工艺下,当存储位大于2k bit,使用vendor的compile memory在面积上开始划算起来,低于2k bit,使用flop array划算。这个部分需要大家在实际工作中自己去比较计算。

关于read pointer和write pointer的同步很简单,用2flop synchronizer即可,老李这里要强调一下,大家在实际工作中不要自作聪明去用verilog的behaivor code去实现2flop syncronzier(上面注释掉的行),而是要直接例化现成的cdc库元件。只要你不是在创立不到一个月的创业公司,这种cdc library一定是你们公司已经有的,轮子已经造出来了,千万别自己再造。

下面我们再看一下write control部分的RTL实现。

这里的满的判断用到了我们上一篇讲的判断逻辑,即高两位相反,低位都相同。下面是read side判断空的逻辑。

下面我们来讨论几个面试中常见的问题。

问题:假设wclk速度比rclk快,那么当raddr+1,再同步到wclk后,如果这期间有了push操作,那会不会使得wptr超过了rptr,造成FIFO overflow呢?

回答:不会,当rptr在传过去之前,如果wptr已经追上了rptr-1,那么wfull已经是1了,FIFO是不允许在FIFO满的时候进行push操作的(在实际工程中我们通常要利用assertion来check保证在wfull为1的时候push不能为1)。而如果这个时候有了pop操作,raddr+1,这个时候实际上FIFO有了一个free entry,但是push这一侧看到的FIFO依然是满的。这就是我们所说的异步FIFO的假满。相应的,FIFO的empty为1时,也可能FIFO此时有个push操作,导致FIFO为假空。假空和假满并不会影响FIFO的正确性,无非就是早一点告诉push side停止push,或者早一点告诉pop side停止pop,但是FIFO是不会产生overflow和underflow的。如果要说有什么缺点的话,就是在性能上有一些损失,当FIFO的深度很大的时候,这通常不是什么问题。

问题:如何判断FIFO是真空/真满呢?

回答:判断假空假满刚好相反,在push side我们来判断空,在pop side来判断满,为什么要这样留给大家自己思考。

问题:设计一个depth=1的异步FIFO

回答:这个大家就是要活学活用了,不能死板套用。只需要考虑一个问题,只有1个entry,那么需要几位的address或者pointer呢?当然是1位就够了,那我们真的还需要一个pointer吗?因为只有一个entry,当一次push,FIFO就满了,一次pop,FIFO就空了。1个bit用来表示满和空就足够了。其实这样的FIFO我们已经见过了,老李在多bit信号跨时钟域怎么办?-- CDC的那些事(4)里面讲到的带反馈的asynchronous load其实就是depth=1的异步FIFO!

问题:如何设计depth不是2的幂次的异步FIFO?

回答:我们在上一讲里面看到的gray code,只有当depth=2的幂次个数的时候,才能做到wrap around时继续保持gray code的性质:即连续两个码之间只有1位不同。下面这个图是表示depth=8的时候我们利用16个gray code来表示pointer。

比如从4‘d15到4’d0,也只有1位不同。但是如果不是2的幂次,比如DEPTH=7,那我们怎么样来利用Gray code呢?直接从4'b0000到4'b0101肯定是不行的,因为4'b0101变到4'b0000有两个bit发生了变化,这样我们就没法利用2flop synchronizer来同步了。解决这个办法的诀窍其实就是老李上一篇提到的gray code的第二个性质:gray code每一位是有个对称轴的。我们可以这样编码,addr==0的时候gray code不从4'b0000开始,而是从4‘b0001开始,直到4’b1001来wrap around,这样从4'b1001->4'b0001依然只有一个bit翻转。同理,如果是depth=6,那么我们继续往里收缩1位,只利用gray code关于对称轴两侧的部分编码,从4'b0011到4'b1011,我们可以看到,这样的编码依然可以保证相邻两个码之间只会有1位变化。

注意,利用这种编码,FIFO的满判断逻辑就不是简略的高两位取反,低位相同了,假如depth=7, rd_ptr=4'b0001, wr_ptr=4'b1100表示7个entry已经满了,如何得出正确的满判断逻辑就交给大家思考吧,欢迎大家在评论区留言探讨。

下一篇老李会带大家过一下工业界最常用的CDC tool Spyglass CDC的根本介绍,同时会奉上一些工程经历总结,敬请期待。

假如你觉得这篇文章对你有所帮助,不妨点赞分享。同7

?

?赞?回复?踩??举报

?

?

?

Byran Liu2021-08-13

?

我的了解,假如不满足2^n的深度,假如6深度,那么在比较空满的时候,先判断高位,假如高位相同,则直接比较,假如高位不同,则对一个进行减2后,再比较高2位

?

?赞?回复?踩??举报

?

?

?

信仰回复Byran Liu2021-09-02

?

您好,请问高位不同的话,对一个进行减2是什么意思哈?怎么了解呢?

?

【文章福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!

面试必杀技:异步FIFO相关推荐

  1. (93)异步FIFO结构,为什么用格雷码? ,面试必问(十七)(第19天)

    (93)异步FIFO结构,为什么用格雷码? ,面试必问(十七)(第19天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)异步FIFO结构,为什么用格雷码? ,面 ...

  2. verilog异步复位jk触发器_以不变应万变的异步FIFO面试宝典(二)

    异步FIFO面试宝典(二) 上一期为童鞋们带来了FIFO工作的基本原理,本期将继续与各位童鞋探讨FIFO类面试相关问题.首先让我们回顾一下上一期的课后思考题: 如果读时钟域速度较快.写时钟域速度较慢( ...

  3. 面试——异步FIFO详解

    1.异步FIFO简介及其原理 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序 ...

  4. 异步FIFO模块验证-面试总结

    首先介绍下自己,个人是材料专业转行IC验证,去年秋招也面试了许多场面试,最近临近毕业,想着有空分享一下自己的面试经验.个人面试经验来看面试官基本都会针对异步FIFO进行提问,虽然异步FIFO较为简单, ...

  5. FPGA/IC笔试面试(一):异步FIFO最小深度计算

    目录 突发数据长度(Burst Length) 常见FIFO深度计算情况 一.写时钟 > 读时钟(写比读快) 1.读写都没有空闲周期 2.读写有空闲周期 二.写时钟 = 读时钟(写读一样快) 1 ...

  6. 异步fifo_数字IC校招基础知识点复习(五)——跨时钟域涉及part2(异步FIFO)

    1.跨时钟域设计(CDC)-part 2 在上一篇中我们主要关注的是单比特的控制信号,而对于多比特信号的跨时钟域传输则需要一些其他的手段. 首先需要明确的是,一般不采用对多比特信号中的每个比特单独使用 ...

  7. 基于FPGA的目标颜色识别追踪三——FIFO(同/异步FIFO)、DDR3

    FIFO在数据处理过程中是十分重要的. 同步FIFO比较简单,面试过程中手撕代码可能会用到. module sFIFO #(parameter DATA_WIDTH = 8,ADDR_WIDTH = ...

  8. FPGA数字IC刷题58道Verilog题解代码及视频讲解【FPGA探索者】【同步/异步FIFO】【跨时钟】

    牛客 Verilog 刷题入门篇1~24 + 进阶篇1~34 题解代码,所有代码均能通过测试,配合视频讲解效果更佳.为避免内容冗余,本文只给出代码,部分题目给出必要说明. 很多题目本身出题有些问题,着 ...

  9. 数字IC笔面常考,跨时钟域神器。——异步FIFO(简介及手撕代码)

    异步FIFO 写在前面的话 异步FIFO相关知识点 FIFO简介 FIFO结构 应用场景(来源小梅哥 <FPGA 系统设计与验证实战指南> 章节4.4) 相关参数 异步FIFO 内部组成 ...

  10. 74ls390设计任意进制计数器_异步FIFO:设计原理及Verliog源码

    1.  异步FIFO的概念 异步FIFO为读取与写入采用不同的时钟,使用异步FIFO用于在不同的时钟域传输数据,主要用于跨时钟域传输多bit数据. 2.  异步FIFO的设计难点 同步异步信号,避免亚 ...

最新文章

  1. java一个点向着另一个点移动_java – 在线性路径中从一个点移动一个对象
  2. IOS开发笔记12-Object-C中的对象与内存
  3. 【数字信号处理】序列表示与运算 ( 序列乘以常数 | 序列相加 | 序列移位 | 序列尺度变换 )
  4. 面试题总结(21-40)
  5. JavaScript权威指南--window对象
  6. java没有释放内存_java – G1年轻的GC没有释放内存 – 空间耗尽
  7. php项目安装器,php服务器环境安装及项目搭建
  8. java中注解的使用与实例(一)
  9. Linux用户管理命令(第二版)
  10. 多目标跟踪——MOT数据集的学习笔记
  11. 【给你几个使用Xamarin的理由】
  12. JS获取HTML video标签视频第一帧
  13. 虚拟机环境下Centos6.5如何上网
  14. UVA12043 Divisors【欧拉筛法】
  15. try catch和if else
  16. 20141214--C#父类,子类
  17. 巴黎世家土味病毒营销,B端创业初期,如何用营销壮大你的种子用户?
  18. 大话C语言——优化结构控制(一)
  19. 2 第二章 集群环境搭建(kubeadm 方式)
  20. Linux应用程序后台运行

热门文章

  1. 怎么看计算机的硬盘容量,Win7怎么看硬盘大小 如何看电脑硬盘大小
  2. python表示倍数_python代表倍数
  3. 【CC2530入门教程-05】CC2530的串行接口原理与应用
  4. 大数据与云计算概论简介
  5. Windows照片图片便捷查看分类软件——照片分类猫
  6. neokylin linux s.iso,NeoKylin-Desktop-Personal-v6.0安装与基本应用实战
  7. 爬虫实战1:爬取哔哩哔哩主播的头像以昵称命名保存到本地文件
  8. Android报unable to instantiate application怎么解决
  9. shopee上架接口java_关于shopee平台接口(php)对接示例
  10. R语言manova函数稳健多元方差分析(Robust one-way MANOVA)、rrcov包中的wilks.test函数稳健单向MANOVA、vegan包的adonis函数非参数Manova等效