利用多位寄存器合并技术提升芯片设计功耗效率
利用多位寄存器合并技术提升芯片设计功耗效率
会议: SNUG TPC -- Multibit Register Banking
作者: Mandy Pant
页数: 5
源文件: SNUG_TPC_MultibitRegBank_Pant_DTTC_Template_paper.pdf
摘要 (Abstract)
低功耗设计 Low Power Design已成为SoC 系统级芯片的关键设计指标。本文讨论了由结构设计团队推动的一项减少SoC功耗的重要方法学--使用多位触发器 MBFF(Multibit Flip-Flop)。本文阐述了如何实现多位合并,分享了我们如何进行实验以及我们的 POR(Process of Record)实现方法。最后,我们将展示实际数据,证明可实现 10%-30% 的显著动态功耗节省。
关键词 -- Cdyn(动态电容)、动态功耗、multibit、MBFF
1. 引言 (Introduction)
随着 CMOS 工艺技术的进步,ASIC 专用集成电路设计的功能集成度进一步提高。这意味着需要更多的功能分区和更高的门数,随之而来的是亚阈值漏电流的增加,导致功耗显著升高。当 CMOS 工艺节点进一步微缩时,漏电流功耗 Leakage Power的影响变得越来越突出。产品的竞争力取决于其控制漏电流的能力。
降低动态功耗 Dynamic Power对大多数项目来说一直是一个热点话题,尤其是在强调改善PPA 功耗性能面积(功耗、性能、面积)的需求下。布局布线 PnR工具中的多位合并(multibit merging)功能引起了广泛关注,我们决定运行一些测试案例,并立即将其作为我们项目的 POR(标准流程)。
多位触发器 MBFF本质上是一组寄存器的集合,由多个放置在特定距离和层次内的相似单比特寄存器转换而来。当这些寄存器被合并为一个多位寄存器时,由于多位寄存器仅有一个时钟引脚,这有效地减少了为多个寄存器时钟引脚构建时钟树综合 CTS所需时钟缓冲器的数量。更少的时钟缓冲器意味着更好的动态功耗表现,以及更短的时钟布线长度,为其他布线释放出更多空间。
在本文中,我们将分享在最佳多位实现方面的测试成果,包括如何获得最佳的触发器转换率、最佳的动态功耗降低,以及在时序结果和影响方面的最佳表现。我们与工具供应商紧密合作解决了一些障碍,特别是转换率低于预期的问题。
在本文末尾,我们将展示一些研究发现的结果,以及为希望探索动态功耗节省的任何设计团队提供的最佳已知方法(BKM)。我们能够平均节省约 10%-15% 的动态功耗(取决于分区的复杂度),同时也成功降低了漏电流功耗 Leakage Power。
2. 正文 (Body)
2.1 多位触发器的基本描述
多位触发器 MBFF可以是 2 输入或 4 输入的触发器(图2),具有相同数量的输出。一个多位触发器由多个定制的触发器组成,旨在优化面积和功耗。[4]
主要的结构区别在于多位触发器中所有单比特触发器之间的共享时钟网络。由于这种实现方式,所有单比特元件物理上放置在附近,从而解决了许多物理设计实现挑战。
使用多位触发器相对于普通单比特触发器的优势:
- 使用多位单元实现SoC 系统级芯片可以减少时钟树综合 CTS工具所看到的时钟端点(sink)数量,从而减少时钟单元数量和功耗。 - 这也会减少时序门电路中的时钟偏差 Clock Skew,因为时钟路径在多位单元内部是平衡的。 - 使用多位触发器实现的 SoC 应该得到更小的 SoC 面积,因为时钟缓冲器的总数应有所减少。
2.2 综合中的多位寄存器实现
在我们的项目中,多位寄存器替换发生在两阶段流程中:综合阶段和布局布线 PnR(APR)阶段。在综合阶段,我们使用综合编译器命令来识别设计中能够合并为多位寄存器的寄存器。用户需要提供映射表来指定使用哪个库单元,以及对不希望合并的触发器进行排除。
Compile (所有寄存器为单比特寄存器)
v
识别不需要合并的单比特寄存器,通过用户属性排除
(可能存在对转换为多位寄存器不友好的寄存器,如某些DFT特性)
v
从最大位宽开始合并以获得最大可能的合并效果
4-bit 多位寄存器分组 -> 2-bit 多位寄存器分组
v
剩余寄存器尝试用更低位宽合并
图3:展示多位寄存器综合实现的流程图
2.3 APR中的多位寄存器实现
在布局布线 PnR(APR)流程中,将寻找额外的合并机会来合并更多的寄存器。然后我们运行不同的场景测试:仅在综合时进行合并(banking)、仅在布局布线 PnR时进行合并、或两者都进行。我们甚至尝试了解除合并(debanking)以及进一步的布局细化,以观察这些做法是否会进一步改善基线运行。基于所有这些场景,我们比较了动态功耗、漏电功耗以及时序影响,所有比较数据均来自布局工具本身。
2.4 多位寄存器的时序例外处理
设计的时序例外(Timing Exception)一次性编写并在综合(SYN)/布局布线 PnR(APR)/性能验证(PV)之间复用。然而,在多位寄存器的情况下,合并后的寄存器将改变寄存器名称,且每次运行的名称会发生变化,尽管设计保持不变。因此,全名不可预测,时序例外无法在流程之间复用。
为解决此问题,我们开发了一个"命令封装器"(command wrapper),该封装器能够自动搜索已经打包进多位寄存器的对应寄存器。
用户将此命令封装器与单比特寄存器名称一起使用,它将返回对应的多位寄存器名称。
示例:
1)
get_vector_cell hierA/hierB/C_reg
将返回:
hierA/hierB/auto_vector_C_reg_D_reg
2)
get_vector_pin cell hierA/hierB/C_reg/d
将返回:
hierA/hierB/auto_vector_C_reg_D_reg/d1
3. 结果 (Results)
下表展示了我们在一个拥有约 500k 单元数的分区上执行的不同实验。
表1:不同多位寄存器实验的结果
| 场景 | SYN | APR | SPG | 总单元数 | 利用率 | 触发器比例% | 动态功耗 | 漏电功耗 | WNS | TNS | 电容违例 | WCslack | 转换违例 | WTslack |
| 不合并 | NOBANK | NOBANK | NO | 553529 | 80.06 | 0.00% | 12.9 | 9560 | -173.77 | -34227.7 | 23217 | -23.191 | 4 | -40.226 |
| 只综合 | BANK | NOBANK | NO | 533032 | 79.28 | 94.45% | 10.5 | 8630 | -141.49 | -46461.7 | 92 | -5.289 | 1 | -5.207 |
| 只综合+SPG | BANK | NOBANK | YES | 534975 | 79.13 | 94.45% | 11.29 | 7770 | -98.93 | -9832.21 | 318 | -13.679 | 3 | -2.403 |
| 综合+APR 1次 | BANK | BANK 1 | NO | 515105 | 78.96 | 97.90% | 9.65 | 8640 | -150.49 | -48772.6 | 93 | -8.077 | 0 | 0 |
| 综合+APR 2次 | BANK | BANK 2 | NO | -- | -- | 97.92% | 9.22 | 9050 | -159.64 | -66761.6 | 514 | -10.936 | 2 | -24.166 |
| 只APR 1次 | NOBANK | BANK 1 | NO | 523600 | 80.25 | 97.92% | 9.87 | 10200 | -212.38 | -50293 | 78 | -6.704 | 0 | 0 |
| 综合+APR 1次+解合并 | BANK | BANK 1+DEBANK | NO | 516271 | 79.59 | 93.09% | 10 | 8630 | -150.49 | -55229.2 | 184 | -43.933 | 15 | -161.457 |
| 综合+APR 2次+解合并 | BANK | BANK 2+DEBANK | NO | -- | -- | 92.72% | 9.47 | 9040 | -179.65 | -91429.4 | 627 | -59.079 | 37 | -83.408 |
| 综合+APR 1次+解合并+细化 | BANK | BANK 1+DEBANK+REFINE | NO | 516271 | 79.59 | 93.09% | 9.84 | 8290 | -88.45 | -28159.2 | 257 | -18.23 | 7 | -12.836 |
| 综合+APR 2次+解合并+细化 | BANK | BANK 2+DEBANK+REFINE | NO | 538901 | 80.98 | 92.72% | 9.53 | 9380 | -87.98 | -36295.2 | 3120 | -11.871 | 25 | -12.169 |
| 综合+细化 | BANK | NOBANK+REFINE | NO | 517334 | 79.77 | 94.45% | 10.59 | 8740 | -84.88 | -34056.9 | 130 | -11.004 | 0 | 0 |
| 综合+细化+SPG | BANK | NOBANK+REFINE | YES | 541406 | 80.92 | 94.45% | 10.98 | 8740 | -47.27 | -20254.5 | 3231 | -9.228 | 29 | -25.196 |
| 综合+APR 1次+细化 | BANK | BANK 1+REFINE | NO | 515518 | 79.82 | 97.90% | 9.46 | 8590 | -91.37 | -28890.8 | 260 | -10.447 | 11 | -50.888 |
基于上述结果,绿色标记行是我们认为针对所有设计的最佳实现方案:通过在综合和布局布线 PnR中都执行合并(banking),我们获得了最佳的动态功耗节省,同时不降低时序,并且漏电流功耗 Leakage Power也更好。我们注意到,工具供应商推荐的布局布线 PnR中执行两次合并似乎对设计在功耗节省或触发器转换率方面并没有带来太多额外收益。
我们尝试在布局布线 PnR中进行解合并(debanking),以观察是否能让工具对某些时序关键路径解合并然后执行细化布局,但最终动态功耗节省更少,时序也没有太多改善。实际上,如果我们将单次合并运行的结果进行细化布局,确实可以看到全面更优的功耗节省。
表2:多位触发器在各分区的转换率
| 分区 | SYN | APR | 总VF数 | VF新增 | VF比例% |
| parA | BANK | NOBANK | 28090 | -- | 68.69% |
| parA | BANK | BANK | 30455 | 2365 | 74.48% |
| parB | BANK | NOBANK | 21707 | -- | 72.45% |
| parB | BANK | BANK | 27425 | 5718 | 83.05% |
| parC | BANK | NOBANK | 23985 | -- | 86.40% |
| parC | BANK | BANK | 25979 | 1994 | 93.58% |
| parD | BANK | NOBANK | 23395 | -- | 55.82% |
| parD | BANK | BANK | 38164 | 14769 | 91.07% |
在多个分区测试案例中,我们注意到仅综合合并的效果似乎偏弱,而布局布线 PnR中的额外合并可以将转换率提升至 80% 以上。通过将转换率提升到接近 80%,与仅在综合中进行单次合并相比,APR 中额外合并可以带来平均 2%-5% 的动态功耗节省。这些结果进一步证实了我们的理论:需要在 APR 中进行额外合并,以进一步提高转换率并获得更优的功耗节省。
表3:普通1-bit触发器与多位寄存器运行的对比
(见原文详细数据表格)
基于以上表格,我们可以肯定地得出结论:多位触发器 MBFF确实帮助我们显著改善了动态功耗,降低范围在 12%-20% 之间,同时略微改善了时序性能。
4. 总结 (Summary)
多位寄存器实现在不牺牲其他设计指标的情况下,带来了显著的动态功耗节省效果。多位触发器的优势因设计而异,某些分区在动态功耗节省和时序性能方面的收益优于其他分区。总的来说,对于一个 SoC 系统级芯片设计而言,12%-20% 的动态功耗节省是一项卓越的成就。
图片索引
本文共 3 张图片,存放于 _images/ 目录。
- 图1:漏电流--摩尔定律遇到静态功耗 - 图2:4位触发器 - 图3:多位寄存器综合实现流程图