免费入驻咨询热线:4001-027-270
做芯片的时候,在开始RTL coding之前,需要有很多的规划工作。比如用多高的时钟频率,有多少个时钟,吞吐量是多少,并行度是多少,乱序还是顺序。其中还有一个很关键的,就是用多大的SRAM。你的模块里面,需要多大的存储空间;多个模块中间如果有缓冲区的话,需要多大的缓冲。
之所以这么早就讨论需要多大的SRAM,还有另一个考虑就是可以尽早的预估芯片的面积,因为SRAM只要规格确定下来,面积就能确定下来。并且可以大致的评估芯片的布局,而且由于SRAM需要使用特殊的IP生成工具来生成,并且还需要专门的BIST(memory BIST,用于测试memory的良率),所以也需要尽早确定下来。
由于绝大部分SOC系统,都是多个模块互相独立运行,然后交互数据和命令。所以经常会需要缓冲区来平衡各个模块的带宽和延时。就像火车的相邻车厢,中间需要一截弹性区来缓冲两车厢的不一致运动。
我们希望的是,数据的传输,在跨越各个模块的时候,可以一刻不停留。多个模块不需要互相等待,紧凑运行。但是遗憾的是通常做不到。数据的滞留在一个复杂系统里面某些情况下总是不可避免。
实际设计的时候,搞架构的同事会咨询每个模块的设计者,你内部是否需要SRAM,需要多大的SRAM?有一些是很好确定的。但是有一些则不那么好确定。比如说,某系统最大支持同时执行64笔CMD,每个CMD是4个DW(一个32bit叫一个DW)。那么我们需要一个SRAM存储这些CMD,深度是64*4=256,位宽是32bit,这个很容易确定。
哪些是不容易确定的,通常就是各个模块间的灰色地带。你可以说缓冲区越大越好,但是也没说一定得是多少。但是小了,效率就会低。
考虑下面一个最基本的情况:
模块A工作在时钟CLK1下,模块B工作在时钟CLK2下。两者是异步时钟,各自独立工作。现在A发起一笔传输送给B,因为某些原因,B不能立即取数,需要等待一个条件才能取数,通常这个条件会在A发起传输之后t ns达成。现在问,在A模块和B模块之间的缓冲区最好多大?
首先要明白,为什么需要缓冲区?
缓冲区的存在,是为了让数据能够连续操作。假如说缓冲区太小,那么不等B来取,A很快就把缓冲区填满了,然后就会因为没有缓冲空间进入等待状态,数据流就断了。缓冲区过大,毫无疑问是浪费。
怎么样让数据流不断?能够连续起来?又不使用过多的SRAM?
这其实是个基本数学的追及问题。
A在往一个池子里面注水,池子的水位越升越高,过了时间t,B开始把池子里面的水往外排。假设A注水的速度的Va,B排水的速度是Vb,两者速度上接近或者Vb比较大。那么池子多深才能保证水不溢出,A的水流连续?
答案很简单。我们需要在B还没有排水的时间段里,A可以一直往缓冲区里面注水。所以缓冲区的大小,就等于B开始排水的延迟乘以A注水的速度。
有了这么大的缓冲区,就可以保证在B还没有开始排水的时候,A可以一直往池子里面注水,A接口就可以满吞吐量运行。
实际系统里面,因为能力问题,总是有的模块慢,有的快。这些慢的地方就是系统瓶颈,减小瓶颈的一大办法,就是让慢的部件可以一直有活干。什么时候只要他想干了,其他部分都得立即配合,让他最舒服。
同样的例子。比如说,CPU访问内存。我们知道内存是系统瓶颈,因为内存相对于CPU来说频率低,延迟也大,并且内存是有确定规范的,比如说DDR4接口2133Hz。所以你如果设计内存控制器,那么最基本的要求是保证内存的带宽用满。所以读写内存的数据都需要加一个大缓存。这个缓存的目的,就是保证内存的数据不论是读写,都可以连续操作,不能因为没有缓冲区拖了后腿。只有访存没有滞留,才算是达到了该系统的理论极限。
再比如说U盘,用的是USB接口。U盘内部可以通过增加Flash颗粒的并行度不断提高吞吐量。一个好的U盘,理论上速度瓶颈在USB接口上,因为接口是有明确规范的,比如说USB2.0可以到480Mb/s,最高也只能到这个速度。所以设计高质量U盘的时候,需要保证的就是USB接口满负荷运行,不能因为各种后续模块的延时拖了后腿,所以需要加大的buffer。
来源:半导学社,谢谢!
感谢每一位作者的辛苦付出与创作,"半导体商城"均在文中备注了出处来源。若未能找到作者和原始出处,还望谅解,如原创作者看到,欢迎联系“半导体商城”认领。如转载涉及版权等问题,请发送消息至公号后台,我们将在第一时间处理,非常感谢!