异步fifo的最小深度计算及指针同步
1.afifo的最小深度计算
1.1.asyncFifo深度指标
asyncFifo的读写两端的时钟是异步时钟,设读周期为Tr,写周期为Tw。那么aFifo所在的通路中性能受限于max(Tr, Tw)。如果aFIFO的深度不能保证当写带宽低时的写连续或者读带宽低时的读连续,那么就会造成通路的性能损失。
设aFifo的深度为D。
1.2.asyncFifo深度计算
当写带宽低时:
要保证写的连续性就是保证写不能full。那么最低要求我们从空开始写,写指针同步到读【读当拍判断not-empty】开始读,到读返回读指针在wr clk domain内判断出aFifo not full,我们设这段时间为T_interval_0。
当在写端判断出aFifo not full时,后续由于读比写快,那么写就不会受到反压,就保证了写性能。
从空开始写,在T_interval_0这段时间内写端向afifo写了T_interval_0/Tw笔数据,此时读端最少读走了1个数据【减1是读频率比写大的不多,也是比较critical的情况。这里没用同步过来的读地址,是因为读地址有可能采样的是前一个值,有可能采样的是正确值,这个不确定性我们加在Tr2w中】,那么写端看到的afifo数据量为T_interval_0/Tw-1,要保证not full则:
D-1 >= T_interval_0/Tw - 1.
也即:
D >= T_interval_0/Tw .
当读带宽低时:
要保证读的连续性就是保证读不能empty。那么最低要求我们从满开始读,读指针同步到写【读指针同步过来当拍判断not-full】,同时开始写,到写返回写指针在rd clk domain内判断出aFifo not empty,我们设这段时间为T_interval_1。
当在读端判断出aFifo not empty时,后续由于写比读快,那么读就不会受到反压,就保证了读性能。
从满开始读,在T_interval_1这段时间内读端读了T_interval_1/Tr笔数据,此时写端最少写了1个数据【加1是写频率比读大的不多,也是比较critical的情况。这里没用同步过来的写地址,是因为写地址有可能采样的是前一个值,有可能采样的是正确值,这个不确定性我们加在Tw2r中】,所以:
d-(T_interval_1/Tr) + 1 >= 1
也即:
D>=T_interval_1/Tr
读写带宽相等时:
很明显要满足上面两个条件。
这里先给个结论T_interval_0 == T_interval_1== T_interval,那么上面两种情况就可以用统一的公式表达:
综合起来就是:
D>=T_interval/max(Tr, Tw)=[n*(Tw+Tr)+Tw2r+Tr2w]/max(Tr,Tw).具体计算请见下节。
1.3.分析T_interval_0/1
从写端开始分析,对应写满读快。
wr_en当拍更新wpt_gray,经过锁存,延迟Tw
经过Tw2r时间被rd clk的n-sync_cell输入口正确采样,延迟Tw2r
经过后面n-1级rdclk的sync_cell ,延迟(n-1)Tr
经过组合逻辑到rdclk域的grayCode锁存,延迟Tr
经过Tr2w时间被wr clk的n-sync_cell入口正确采样,延迟Tr2w
经过后面n-1级wrclk的sync_cell ,当拍完成gray2bin并和wpt比较产生fifo_full信号,延迟(n-1)Tw
那么T_interval_0 = Tw+Tw2r+(n-1)Tr+Tr+Tr2w+(n-1)Tw=n*(Tw+Tr) + Tw2r+Tr2w
同理从读端开始分析,对应写快读慢。
rd_en当拍更新rpt_gray,经过锁存,延迟Tr
经过Tr2w时间被wr clk的n-sync_cell输入口正确采样,延迟Tr2w
经过后面n-1级wrclk的sync_cell ,延迟(n-1)Tw
经过组合逻辑到wrclk域的grayCode锁存,延迟Tw
经过Tw2r时间被rd clk的n-sync_cell入口正确采样,延迟Tw2r
经过后面n-1级rdclk的sync_cell ,当拍完成gray2bin并和rpt比较产生fifo_empty信号,延迟(n-1)Tr
那么T_interval_1 = Tr+Tr2w+(n-1)Tw+Tw+Tw2r+(n-1)Tr=n*(Tw+Tr) + Tw2r+Tr2w
所以T_interval_0==T_interval_1
1.4.说明Tw2r和Tr2w
Tw2r和Tr2w都包含两部分,一部分是grayCode的传输时延,一部分是传输到dstclk被正确采样的时间。
设传输时延分别为Tw2r_dly和Tr2w_dly,一般会约束在快时钟周期的0.7
被正确采样的时间分别为Tw2r_cap和Tr2w_cap
Tw2r=Tw2r_dly+Tw2r_cap,其中Tw2r_cap = 0(当拍采样)或者Tr(下拍采样),把Tw2r_dly取整为Tr则:
Tw2r ∈(1,2)Tr
同理:
Tw2r ∈(1,2)Tw
设用3级同步器,计算过程中Tw2r和Tr2w取最大值,带入afifo计算公式:
D>=[n*(Tw+Tr)+Tw2r+Tr2w]/max(Tr,Tw)=(5Tr+5Tw)/max(Tr,Tw)向上取整为10.
2.afifo的指针同步
开篇前先提几个问题:
1.格雷码虽然相邻地址指针只有1bit变化,这1bit变化经过同步也可能采样错误,会有什么影响?
2.理论上格雷码相邻地址指针只有1bit变化,但是从srcclk传输到dstclk由于多bit传输延迟的不同会造成同时有多个bit在变化怎么办?
3.如果快时钟指针同步到慢时钟,慢时钟漏了多个地址会怎样?由于漏了多个地址,对于慢时钟而言当次采样的数据和前次采样数据有多bit变化,为什么没有问题?
4.如果afifo深度不是2的幂次,grayCode该怎样做才能保证地址wrap时,grayCode的指针还能满足相邻地址只有1bit变化?
经过后面的解释之后,就能回答上面的问题。