目录
一、问题背景
我曾经设计过一个bug,经过一周的分析、总结、复盘,整理成这篇文章同大家分享。
二、提前预知结论
1、sfifo(同步fifo)empty为1不一定空,水线大于0不一定可读;
2、解决上述问题需要在fifo内增加1级或者2级寄存器存储数据;
三、sram读写时序
一般情况下,普通memory读数据“mem_rd_data”都至少延后读使能“mem_rden_n”一个cycle,这点很重要,因为它导致了当前预读fifo存在的问题。
图1、sram读写时序
四、sfifo的结构与逻辑
sfifo由SFIFO_CTRL+memory的结构构成,SFIFO_CTRL负责管理memory的读写。在非预读模式下,外部读写使能“fifo_wen”“fifo_ren”直连到memory的读写使能端口“mem_wren_n”“mem_rden_n”,此时SFIFO_CTRL只做地址管理;预读模式下,SFIFO_CTRL出了地址管理之外,需要自己产生memory读使能信号“mem_rden_n”
图2、目前的sfifo内部结构