ASIC设计:FIFO 深度设置基本规则

       一般情况下,设置一个fifo (同步或异步)的深度,主要是为了保证在fifo前级一直有东西要传输时,fifo的出口处不至于出现断流。

        对于同步fifo,假设当前Fifo为full状态,从pop的时刻开始算起(此时刻fifo就可以认为not full,但not full的信号不一定什么时刻拉高),到push一个新的数据且出口端可以看到为止,计算这个延时;fifo的深度必须大于等于这个延时。一般情况下,pop的下一拍not full信号拉高,not full为高的当拍push一个新的数据,push的新数据下一拍可以在出口处看到,延时总共2T,所以,一般情况下,一个FIFO最少需要设置2层。

      下面是一个2层同步fifo的时序图,0.5ns连续push两个request (要传输的数据),1ns,req0对下级模块可见,假设下级模块一直不接收,直到2ns才pop req0。2.5ns,Req1对下级模块可见,full信号在2.5ns拉低,当拍就能push进入Req2。 2.5ns和3ns 时pop Req1和Req2。2ns fifo 处于full状态,pop信号拉高,2.5ns  ~full为高,同时push信号拉高,3ns,Req2在出口可见,总共2T。

           对于异步FIFO,基本原理参考之前的博客https://blog.csdn.net/zgcjaxj/article/details/106306857

        如下图,为一个异步时钟FIFO在初始为full状态下的pop和push的时序图(clockA 为1GHz,clockB为1.2GHz)。图中省略了write /readptr的格雷码转换等过程。

        初始状态0时刻clock A侧的full信号为高;假设在clockB的第2拍时,pop拉高(下级模块可以接收了),clockB的下一拍,RPTR_Bin_clkB更新,此时从clockB端拉看,fifo就是not full了,但由于clockA端还未看到read ptr更新,所以clockA的full 信号依然为高。

       RPTR_Bin_clkB 会传递给clockA,先sync到clockA的上升沿3ns,然后再延时一定的拍数(此处假设为2拍 @ clock A),5ns时clockA的RPTR_Bin_clkA更新为3’b100,当拍full信号就可以拉低,进而push信号拉高,push一个新的数据。Push的下一拍WPTR_Bin_clkA更新,然后会传递给clockB,会先sync到clock B的上升沿,然后再延时一定的拍数(此处假设为2拍 @clock B),WPTR_Bin_clkB更新为3’b000。整个过程就是图中标注的时间段2,从clockB来看,为8T。也就是这种情况下,此异步FIFO深度最好设置为8层,而不是4层。

       进而总结一下 异步fifo上述的延时为 pop 1T @clkB + sync to (clkA) + delay @clk A + push 1T @clkA + sync to (clkB) + delay @ clk B。最好情况下,sync to (clkA) = 0ns,sync to (clkB) = 0ns;最坏情况下,sync to (clkA) = periodA,sync to (clkB) = period。上述延时范围:

        (1+delay T) * (period A + period B)  ----  (2+delay T) * (period A + period B)

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123axj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值