寄存器阵列低功耗设计方案

芯片通常会用到一个寄存器阵列。用户通过spi, i2c 之类的接口对寄存器进行读写操作,实现各个模块的配置,状态查询等等。
如果不考虑功耗,cts时工具会插入一个类似下面这样结构的clock tree。不妨做个简单估算。
假设寄存器阵列有128个8-bit寄存器。每个8-bit寄存器由8个dff组成。总共1024个dff。
假设每8个dff工具插入一个ctb。128个8-bit寄存器就需要插入128个ctb。
假设每8个ctb又需要插入一个ctb来驱动。前一步插入的128个ctb需要再插入16个ctb驱动。
这16个ctb又需要再插入两个ctb来驱动。
总共需要插入128+16+2=146个ctb。
假设接口为spi,读写protocol是1位rw,7位地址,8位数据。每次读写都是16个spi clock。假设spi clock直接用做寄存器阵列时钟(通常有片子里有osc,需要spi clock domain 到osc clock domain transfer。那是另一个技巧了。这里就不展开了)。如果不插入icg,每次读写时1024个dff + 146个ctb都switch 16个spi clock,那可是不小的功耗,尤其是频繁读写的场景。
上述这种实现方法比较“蠢”。我们知道,每次读写只能对一个寄存器进行操作,没必要所有的寄存器都给时钟。基于这个朴素的想法,我们可以利用工具降低功耗。
寄存器阵列的结构有规律。综合工具可以根据地址解码插入icg。假设插入的icg驱动能力足够,整个寄存器的clock tree会变成类似下面这样的结构。
对寄存器阵列进行操作时,只有地址符合的寄存器icg才会被打开,该寄存器的dff才会得到时钟。而其他地址不符合的寄存器icg关闭,没有时钟,也就没有switching power。这样一来,每次写操作实际只有一个寄存器会switching,大大减少了switching power。美中不足的是,对任何寄存器操作时icg前面的ctb都会有时钟,这部分clock tree仍消耗switching power。
寄存器写操作的时候会改变寄存器内容,需要时钟锁入新的数据。但是,对寄存器进行读操作的时候,寄存器内容不改变,寄存器不需要时钟。这个特点工具是不知道的,但是designer可以利用起来。一个很自然的想法就是只在寄存器写操作放clock进来。
其次,虽然每个spi写操作需要16个spi clock。但是实际上寄存器阵列只需要在地址,数据都收到后给一个写时钟脉冲就可以了,不需要多个时钟反复写几次。
基于上面这两个想法,我们可以在寄存器阵列的时钟入口处加一个icg。这个icg只在写操作的时候打开,且只在地址数据都收到后打开一个时钟周期,放一个时钟脉冲过去。这样整个clock tree的switching power就大大降低了。
寄存器阵列时钟入口处的icg要在rtl里加。
写rtl的时候就考虑功耗并手动插入icg是实现低功耗的最有效手段。再加上工具辅助优化一下,就很完美了。


《超级电容器材料及结构形式-2020版》
红米品牌独立Redmi带着新使命向未来前进
印度正在倡议政府尽可能快地管制或禁止比特币
轻薄笔记本的代表作Air Book笔记本推荐!
高级ios工程师和初级工程师有什么区别
寄存器阵列低功耗设计方案
如何用AI打造线上社群的西部世界
百度超越Waymo 中国自动驾驶发展要认清自身
透光型编码器的结构是什么
第三届CIOC地产智能科技峰会已在上海圆满闭幕
如何将EB Tresos生成的代码集成到S32DS中?
2019年全球TOP10数控机床企业排名发布,前十被日本、德国和美国包圆
Zigbee无线传感器网络的评价指标和协议栈
引人遐想的未来智能汽车
单片机视频教程13:UART 通信深入学习
公网通:公网IP基于TCP连接调试
如何通过触发和同步数字化仪进行数据采集?
unix的shell命令是什么
华为畅享8评测 值不值得买
NE555制作的过压过流保护电路