最近在准备FPGA校招面试,发现很多大厂笔试和面试都会问异步FIFO深度计算,比如背靠背读写场景下FIFO要开多深。我之前做项目都是直接例化Xilinx FIFO IP核,从来没手动算过。现在刷题看到公式有点懵,想问问各位大佬,FIFO深度计算的核心思路是什么?有没有什么通俗易懂的推导方法能让我快速掌握?另外,面试官问这个问题到底想考察什么能力?
2026年了,FPGA工程师面试被问FIFO深度怎么算,只知道用IP核不懂公式推导,怎么补这块?
12 个回答

个人感觉你先别急着背公式,把「背靠背」这个场景想明白,深度计算就通了一半。面试官问这个,表面考数学,实际考的是你对数据流控制有没有直觉。所谓背靠背,就是写端连续两个突发周期都在满速写,而读端因为要处理别的事,这两个周期里可能一个字都不读。那FIFO里堆的数据量,就是这两个周期里写进来的总量减去读走的总量,这个差值就是理论最小深度。注意,这里的关键是「周期」不是「时钟个数」,因为读写时钟频率可能不一样,你得先统一到同一个时间基准上,比如都用写时钟的周期数来算。很多人的误区就在这里:直接拿突发长度除以频率差,那算出来的是平均情况下的余量,不是最坏情况。异步FIFO比同步FIFO多一层麻烦,就是格雷码跨时钟域会带来两个时钟周期的同步延迟,读指针同步到写时钟域有延迟,写指针同步到读时钟域也有延迟,所以实际深度要在理论值上再加几个拍,一般加2到4拍,具体看你的同步器级数。你从最简单的同步FIFO推导开始练,写时钟等于读时钟,突发长度是B,读写速率相同,那深度就是B,因为写B个、读B个,刚好平衡。再改成读比写慢一半,那写B个的时间读端只读了B/2个,深度就是B/2。把这些基础情况都推一遍,你会发现公式其实是从「写总量减读总量」这个恒等式变形来的,不是天上掉下来的。面试官真正想看的,是你能不能在纸上画个时间轴,把最坏情况标出来,然后说清楚为什么那里是峰值。如果你能画出来,哪怕最后数字算错一点,印象分也会高很多。建议你花一个晚上,把同步FIFO推导、异步FIFO推导、加上同步器延迟这三级都自己推一遍,别光看别人的推导,推完顺手写个Excel表格,把不同读写频率比下的深度列出来,感受一下趋势。对了,你手头有具体的笔试真题吗?还是现在只看了通用公式?如果有原题,发出来咱们对着题聊会更接地气。

你缺的不是公式,是「先画时间轴再写方程」的习惯。拿张纸,横轴是时间,把写使能和读使能的波形画出来,标出最坏的两个背靠背突发周期,然后数一数这两个周期内写进来多少个、读出去多少个,差值就是最小深度。异步FIFO就在这个基础上,把读写指针同步的延迟(一般2到3个周期)加进去,因为格雷码跨时钟域要等一拍才能稳定,读侧看到写指针的变化有延迟,写侧看到读指针的变化也有延迟,这两个延迟会同时压缩可用空间,所以实际深度要留余量。你推完这个,再回去看那些公式,会发现其实就是这个时间轴过程用代数表达式写了一遍。面试官问这个,核心是想确认你有没有把FIFO当成一个有延迟的异步存储系统来理解,而不是当成一个黑盒IP。建议你推完同步FIFO后,立刻用Verilog写个参数化的FIFO模型,自己改深度跑仿真,观察一下满空信号的实际时序,比看十篇推导都管用。你现在的FPGA开发板上有现成的FIFO IP核吗?如果有,直接把IP核的深度参数改小跑一下,看看什么情况下会丢数,感受会很直观。

个人感觉你缺的不是数学,是对「最坏情况」的直觉。面试官问这个,其实是想听你描述一个场景:写端在什么条件下会持续灌数据,读端在什么条件下会卡住不动,这两个条件叠加的那个瞬间,FIFO里堆了多少。你只要能把那个瞬间讲清楚,公式写不写都行。比如异步FIFO,你肯定会说读指针要同步到写时钟域,这个同步延迟意味着写侧看到的读指针是两拍之前的,所以它以为的剩余空间比实际多,反过来读侧也一样,那深度就得在这个「以为的剩余空间」上留出同步延迟对应的量。我建议你去找一篇讲异步FIFO深度推导的博客,把那个「写时钟周期数 突发长度 / 读时钟频率」的式子自己用时间轴推一遍,推完就发现其实就两个关键变量:突发长度和读写频率比。你准备的时候可以拿笔在纸上画个阶梯图,横轴是时间,纵轴是FIFO占用,标出最高点,那一点的高度加余量就是答案。面试时你可以主动画给面试官看,这比干说公式强很多。你最近刷题有没有遇到具体的深度数值题?发出来咱们可以对着算一遍。

面试官问这个,核心不是看你背没背过公式,而是看你能不能把一个突发场景翻译成「一段时间内进多少、出多少」的算术题。你先别管异步,拿同步FIFO练手:假设写时钟100MHz,读时钟50MHz,写端每100个时钟周期里连续发80个数据(突发长度80),读端每100个时钟周期里读40个,那你画一条时间轴,横轴是写时钟周期,从第0个周期到第79个周期写端都在灌数据,读端这80个周期里只能读走40个,所以FIFO里至少要存80减40等于40个。但这是理想情况,实际要再加余量,因为读端可能在突发开始前就已经有积压,或者读端响应有延迟。等你把这个同步场景推顺了,再去看异步FIFO,其实就是在这个时间轴基础上,把读写指针跨时钟域同步的延迟加进去。格雷码同步一般要2到3个写时钟周期,读侧看到的写指针会滞后,写侧看到的读指针也会滞后,这两个滞后会同时压缩FIFO的有效空间,所以深度要在同步计算的结果上再加几个深度,具体加多少取决于你同步器的级数和时钟频率比。我建议你亲手写一个参数化FIFO的Verilog模型,深度设成8、16、32分别跑仿真,把满信号拉高和空信号拉高的时刻打出来,对着波形看是不是和你算的边界吻合。这个过程比背十遍公式都管用。另外提醒一点,面试时如果被问到,你可以主动说「我先按最坏背靠背场景算一个理论值,然后根据同步延迟和余量加上4到8个深度」,这比直接报一个数显得更有工程判断力。你现在的项目里有没有实际遇到过FIFO溢出丢数据的case?有的话拿那个例子复盘一下,面试时讲出来比纯推公式加分得多。

说实话,你现在的状态和我去年准备秋招时一模一样,项目里全是例化IP核,一被问到底层就发虚。我的经验是别一上来就啃那个带log2的公式,先拿同步FIFO把「最坏情况」四个字嚼透。你想象一个场景:写端每100个周期连续灌80个数据,读端每100个周期才读走40个,那从第0个周期开始,FIFO里的数据就是80减40等于40个往上堆,到第79个周期时堆到最高点,这个最高点就是最小深度。你把这条时间轴画在纸上,标出读写使能波形,一切都清楚了。等你把同步场景推顺了,再看异步FIFO,其实就是在时间轴基础上加一个「跨时钟域同步延迟」的惩罚项——格雷码同步一般要2到3个周期,读侧看到的写指针变化会滞后,写侧看到的读指针变化也会滞后,这两个滞后同时压缩了可用空间,所以深度要在理论值上加余量。我建议你推完公式后,立刻用Verilog写个参数化FIFO模型,自己改深度跑仿真,观察满空信号的实际时序,比背十遍公式都管用。另外提醒一句,面试官问这个核心是想看你有没有「数据流控制」的直觉,而不是考你数学,所以回答时一定要讲出那个「读端卡住、写端狂灌」的瞬间,而不是只甩个公式。你现在是刚看完这个公式,还是已经推过一遍时间轴了?

这个问题我当年也栽过,后来在实习时被mentor点醒,他说你算深度前先回答一个问题:FIFO满了之后会发生什么?是写端暂停、读端继续,还是数据直接丢弃?这个答案决定了你算出来的理论值要不要再乘个安全系数。很多应届生只盯着读写频率比,却忽略了FIFO在真实系统里往往不是孤立的——它前面可能有个AXI总线仲裁,后面可能有个处理延迟不确定的模块,这些都会让突发长度变得不规律。我给你一条完整的推导路径:第一步,把突发场景拆成「一段时间内进多少、出多少」的算术题,假设写时钟100MHz、读时钟50MHz,写端连续两个背靠背突发各80个数据,读端在这段时间里只读了60个,那FIFO里至少要存160减60等于100个。第二步,考虑异步的同步延迟,格雷码跨时钟域要2到3拍,这意味着读侧看到的写指针变化会晚到,写侧看到的读指针变化也会晚到,两个延迟叠加,实际可用空间比理论值少几个周期,所以深度要加到110或115。第三步,也是最容易被忽略的,就是加余量——工程上一般会留20%到30%的余量,因为你要处理极端情况,比如读端被更高优先级的中断抢占,或者写端在突发前已经有残存数据。我建议你把这个推导过程写成一篇笔记,用时间轴图画出来,面试时直接展示这张图,比背公式有说服力得多。考官问这个问题的深层意图,其实是看你有没有能力把一个看似简单的问题放到系统里思考——FIFO深度不是孤立参数,它和上下游的流控策略、时序约束都有关。你如果能主动问到「这个FIFO的读端是轮询还是中断驱动」,面试官反而会觉得你经验老到。最后提个建议:别只看Xilinx的IP核文档,去读一读Clifford Cummings那篇异步FIFO的白皮书,虽然老但经典,读完后你对格雷码和同步延迟的理解会上一个台阶。你现在手里有具体的项目场景吗?比如某个接口的读写频率比大概是多少?

说实话,你项目里能例化IP核,说明基本操作没问题,面试官问推导就是想看看你愿不愿意往底层钻。我建议你别一上来就啃异步FIFO,先把同步FIFO吃透。核心就一句:算最坏情况下,一段时间内写进来多少、读出去多少,差值就是最小深度。比如写端每100个周期连续灌80个数据,读端这100个周期只能读走40个,那堆到最高点就是80减40等于40个。你把这张时间轴画在纸上,标出写使能和读使能的波形,最高点那一下的高度就是答案。异步FIFO就是在同步基础上,把格雷码同步的2到3拍延迟加进去,相当于读写两侧看到的指针都慢了两拍,深度得多留一点余量。你先推同步,再推异步,最后用Verilog写个参数化FIFO自己改深度跑仿真,比背公式管用多了。你现在的工程阶段是课设还是已经开始刷题了?

我去年秋招被问到这题时也懵,后来发现面试官真正想听的其实是一个「最坏情况的故事」。他不在乎你会不会背那个带log2的公式,而是想让你描述:写端在什么条件下会持续灌数据,读端在什么条件下会卡住不动,这两个条件叠加的那个瞬间,FIFO里堆了多少。你只要能把那个瞬间讲清楚,公式写不写都行。我推荐一个笨办法:拿张坐标纸,横轴是写时钟周期,把写使能画成一段一段的方块,读使能画成另一行方块,然后从第0拍开始数,每到一拍就更新一下FIFO占用数,画成阶梯图,最高那个台阶的高度就是理论最小深度。异步FIFO你就额外画两条虚线,表示读指针同步到写时钟域要延迟2拍、写指针同步到读时钟域要延迟2拍,这两条虚线会让两侧看到的剩余空间都比实际多,所以深度得在阶梯图最高点基础上再加几个周期的量。这个方法推完一遍,你就再也不会忘。另外面试时如果被追问,你可以主动说一句「实际工程里我还会在FIFO前后各加一个寄存器打拍,防止亚稳态」,这比单纯报答案加分。你手头有Vivado环境吗?有的话建议直接建个工程跑一下异步FIFO的时序仿真,看满信号和空信号的实际位置,比纯推导直观得多。

这个问题我当年也栽过,后来在实习时被mentor点醒,他说你算深度前先回答一个问题:FIFO满了之后会发生什么?是写端暂停、读端继续,还是数据直接丢弃?这个答案决定了你算出来的理论值要不要再乘个安全系数。很多应届生只盯着读写频率比,却忽略了FIFO在真实系统里往往不是孤立的——它前面可能有个AXI总线仲裁,后面可能有个处理延迟不确定的模块,这些都会让突发长度变得不规律。我给你一条完整的推导路径:第一步,把突发场景拆成「一段时间内进多少、出多少」的算术题。假设写时钟100MHz、读时钟50MHz,写端连续两个背靠背突发各80个数据,读端在这段时间里只读了60个,那FIFO里至少要存160减60等于100个。第二步,考虑异步的同步延迟。格雷码跨时钟域要2到3拍同步,这意味着读侧看到的写指针变化会晚到,写侧看到的读指针变化也会晚到,这两个滞后同时压缩了可用空间,所以深度要在理论值上加余量。第三步,也是最容易被忽略的,就是FIFO的读延迟。有些FIFO IP核读使能拉高后,数据要等一拍才出现在读数据总线上,这一拍在连续读场景下会累积,导致实际读速率低于理论值。我建议你推完公式后,立刻用Vivado例化一个异步FIFO,把深度设成你算出的理论值,然后写个testbench模拟最坏突发,看看满信号会不会提前拉高。如果提前了,就说明你漏了某个延迟项。这个调试过程比刷十道题都管用。面试时你把这个思路讲出来,面试官会觉得你不是在背答案,而是真的理解数据流控制。你准备面试时有没有画过这种时间轴波形图?如果没有,建议先从同步FIFO画起,画熟了再画异步的,不然容易绕晕。

你先别碰异步FIFO,拿同步的练手。想象写时钟100MHz,读时钟50MHz,写端每100个周期里连续灌80个数据,读端这100个周期只能读走40个。从第0个周期开始,FIFO里就是80减40等于40个往上涨,到第79个周期堆到最高点,这个最高点就是最小深度。你把这条时间轴画在纸上,标出读写使能波形,一切都清楚了。等你把同步推顺了,再看异步FIFO,其实就是在时间轴基础上加一个「跨时钟域同步延迟」的惩罚项——格雷码同步一般要2到3拍,读侧看到的写指针变化会滞后,写侧看到的读指针变化也会滞后,这两个滞后同时压缩了可用空间,所以深度要在理论值上加余量。面试官问这个,核心是想确认你有没有把FIFO当成一个有延迟的异步存储系统来理解,而不是当成一个黑盒IP。你推完公式后,建议立刻用Verilog写个参数化FIFO,自己改深度跑仿真,观察一下满空信号的实际时序,这样比死记硬背管用多了。你现在是课设阶段还是已经开始刷题了?
发表回答
登录后可在本页底部提交回答