怎样设计一个同步FIFO?(2)

上一篇介绍了利用flip flop来作为存储单元的同步fifo设计。这一篇咱们来看如何利用2 port sram来作为存储单元设计同步fifo。
开始往下读之前,老李先问一个问题,假如现在让你设计一个深度为n的基于2port sram的同步fifo,请问至少需要多大的sram? 假设sram的位宽就是你的数据宽度,那么问题就是问你需要的sram的行数至少是多少?如果你觉得答案是显而易见的n,那么你值得读完这一篇。
首先来说为什么要用sram设计fifo,很简单为了省面积。我们说存1bit的数据,sram里一个bit cell经典结构是6个晶体管,而一个flip flop需要的晶体管在20个左右,那么从面积上来说,肯定是sram小对吧?但是这里面有个平衡点,对于一块sram,算面积的时候不能仅仅算里面存储单元bit cell的面积,还要算外围的decode逻辑的面积。当sram的row size x column size比较小的时候,外围的decode逻辑占的比重比较大,反而这个时候sram的总面积不如row x column个flop的面积小。至于这个转折点要看工艺和memory compiler的data sheet,具体面积要拿sram的data sheet去比较。老李自己总结的一个经验,不保证完全准确,在5nm工艺下,这个转折点大概在2k bit,低于2k bit,比如16x32的大小,那还是flop划算,如果远大于2k bit,那么就用sram,差不多在2-3k bit量级的时候要根据memory datasheet里的area number来比较。
再来说说什么是2 port sram,2 port 通常也被称作dual port,一个端口为写端口,一个端口为读端口。这两个端口可以同时工作,同一个周期内既可以读,也可以写,简化的框图如下图所示
wcen:write chip enable neg,当这个信号为0的时候,要写入数据
wdata: 要写入的数据
waddr:要写入的地址
rcen:read chip enable neg,当这个 信号为0的时候,要读出数据
rdata: 读出的数据
raddr: 读出的地址
这里要注意,要写入的数据是指wcen为0那个周期的wdata,而读出的数据并不是rcen为0那个周期的rdata,而是下一个周期的rdata。
时序图如下图所示
可以看到,cycle 1进行写操作,在地址a0写入数据d0。在cycle 2进行读操作,要在cycle 3才能读出d0。那你一定好奇如果给同一个地址在同一个周期又读又写怎么办呢?这个不同的foundary的sram可以有不同的实现,这里表示的是一个较为常见的实现,看cycle 7,读写同时发生并且在同一个地址,在cycle 8读出的还是之前写入在这个地址的数据d0,而不是cycle 7写入的新数据d1。只有再读一次a0,你才能看到d1。
下面我们来考虑如何设计基于2port sram的同步fifo。既然fifo有push和pop端,也有wdata和rdata,那刚好对应sram的write port和read port,看起来我们大概只需要直接把sram包起来,用两个计数器来分别计算write pointer和read pointer就可以了,如下图所示
真的这么简单吗?我们来思考一个问题,用上面的fifo来存第一个数d0,利用上面的结构,q能够在push的下一个周期变为d0吗?
回顾一下我们想要的fifo的时序
在cycle1的时候我们push d0,我们期望q在cycle 2的时候就可以输出fifo最头上的数d0,而且注意,这个时候我们并没有进行pop操作。
可是从上面sram的时序图我们可以看到,要想让rdata输出d0,我们至少要让rcen为0一个周期,而且rcen为0必须得在wcen为0之后,让rdata拿到d0最快也到了wcen之后的2个周期,因而不满足在push之后下一个周期q就输出d0。
另外还有个问题,当我们push进去一个数之后,如果这个数写入了sram,那么我们必须要有一次读sram的操作,才能把数读出来,这在上面的框图里也就是要执行一次pop。这也和fifo的工作相背离,因为fifo可能并不是需要立刻pop。
那么我们怎么做才能让q在push的下一个周期输出d0呢?环顾四周,好像除了利用flip flop也没有别的办法了。也就是说 ,第一个数我们把数不写进sram,而是写到一个flop里,然后让q从flop输出 。
等等,说好了用sram来存数据的,怎么又把数据存到flop里面去了呢?
别急,这里确实是没有办法的办法,如果我们有可以和flop时序一样的sram,那么也可以不用这种办法,但是在接受sram的时序是这样的情况下,我们必须借助flop来实现第一个数在push之后下一个周期就能够出现在q上。
当然,我们不是说所有的数都要用flop来存,接下来push的数据我们还是要放在sram里面的,我们把上面的结构改一改,可以先设计出下面的fifo结构。
在这个结构中,我们从d可以直接把数据存到输出级的这个flop中,相当于bypass了sram,然后我们的想法是:当第二次push的时候,我们再把数据存到sram里,同时,当我们把第一个数据pop出来之后,我们就把数据从sram里拿到这个输出级的flop中,这样是不是就对了呢?
不好意思,其实还是有问题,我们假设fifo里面已经存了2个数据,d0存在输出级的flop里,d1存在sram里,如下图所示
那么当我们要pop一次之后,我们期望的fifo的时序是:在pop的下一个周期,q就应该是d1了,因为d0被弹出,fifo最头上的数是d1了。如下图所示
但是如果在pop为1的那个周期去读sram,则要在下一个周期rdata才能读出d1,再还需要一个周期才能把d1存到输出级的flop上,也就是pop之后两个周期才能看到d1, 这样就不满足fifo的时序了。
那怎么办呢?我们只好省去把d1从rdata存到flop上的那一步,而是把rdata当做q来直接输出。电路结构变成了下面
我们的设计思路就变成了
往fifo里push的第一个数要bypass sram,把数据直接存到输出级flop去。如果sram里面存了数,那么pop一次,就要把rdata直接输出到q端。看起来没有问题了吧?其实还有一个特殊情况没有考虑到,也就是当fifo里只有一个数据,而在push下一个数据的时候同时来了pop。如下图所示
那么这个时候要push的d1是不能往sram里写的,一旦写进去要读出来还得多花一个周期,所以这个时候也是要bypass sram。
所以更加严谨的条件是
往fifo里push的第一个数要bypass sram, 或者fifo里只有1个数据,而且在push新数据的同时pop ,那么把数据直接存到输出级flop去。当fifo里只有一个数据的时候,q端来自于输出级flop如果sram里面存了数,那么pop一次,就要把rdata直接输出到q端。至此,我们利用一级flip flop来实现了省去一个读sram的周期,可以实现fifo的时序。
现在可以回答文章开头的问题了,因为有了输出级flop来存第一个数据,那么sram其实并不需要存n个数据,只需要存n-1个数据就好了。但是在实际工作中,width x n 和width x (n-1)的面积其实没有差很多,你用width xn的sram完全没有问题。当然要注意,这个时候memory 的address pointer和我们上一讲里的wr_ptr, rd_ptr就不是完全一样了,因为第一个数据并不是存在sram里。
写到这里,是不是就完全搞定问题了呢?我们来分析一下,我们这样设计可行其实是有一个前提,即sram的rdata的timing是下面的。这里把开头的图再看一遍
我们说fifo的q在不pop的时候是稳定不变的,是利用了这里sram的特性,即读完一次之后,rdata的值会保持不变,一直到下一次读操作(图中的cycle 3-7),这样我们就可以直接把rdata输出到q。
但是并不是所有厂家的sram的时序是这样的,大家要看厂家的memory的datasheet来确认时序(tsmc家的是这样的, 但是可能别的厂家并不保证)如果sram时序是下面这样,那么我们的设计就不能满足fifo的要求了
而且上面的设计可能还有一个sta上的问题,因为q来自于rdata,那么sram内部的clock-to-rdata的timing可能比较大,这样给后面fifo输出的q后面所留有的空间就比较小了。如果q之后还要做逻辑运算,或者再下一级flop距离比较远,那么修timing的时候就比较挑战。
要解决上面两个问题,一个必然的思路是不能直接输出rdata到q,还是要把rdata给flop住,这样一方面使得输出q可以保持稳定,另一方面,这一级flop依然在fifo内部,从flop直接输出对于fifo后级的timing有帮助。你看,兜兜转转,似乎还是要回到我们前面要毙掉的方案。那么我们要怎么设计,才能解决前面那个方案不满足fifo时序要求的缺陷呢?大家可以自己先思考一下,老李下篇再带来更深入的讲解。

电流互感器的特性和使用要求
realme真我X7 Pro手机直降700元
取土钻的应用大大提高对土壤研究的效率
高压和特高压的区别和联系
“人工智能+”国际论坛在南京江宁区启幕
怎样设计一个同步FIFO?(2)
5G在新基建下的益和意
安路科技发布AI布局 人工智能领域再添新力量
24W适配器电源芯片U6107D推荐
需求疲软?智能家居正在强势上涨
苹果10.5英寸的iPad Pro将会被取消,新iPad Pro支持Face ID功能
TDA9332各引脚功能及电压
BOE(京东方)在2022CES 大放异彩 屏之物联创新领航
Google的Chrome网络浏览器首次失去了市场份额
电源中的过压过流保护模块有什么作用
Mindspeed扩展其突发模式互阻抗放大器(TIA)系列
空调能杀死新冠病毒 寄希望于歪门左道的企业必然会被抛弃
医疗健康数字化技术将会带来颠覆式创新
dfrobotGravityI2C数字功率计简介
飞跃时代的翅膀,华为云这款服务器可助力企业数字化升级的强大能力