最近看到知乎上一个美女校友的文章很不错,转载学习一下,原文链接:https://zhuanlan.zhihu.com/p/508672494
一、前言
在芯片设计中,我们经常提到PPA权衡,即Power,Performance和Area。
低功耗设计的动机主要有以下几个方面:
- 功耗过大会导致便携设备的电池寿命变低,
- 芯片散热成本增高,
- 温度变高芯片的可靠性和电路的时序会受到影响,
- 电源网格设计难度加大,
- 以及产品竞争力降低。
为了缓解上述问题,我们会在系统、架构、前端、后端、生产、工艺以及量产各个阶段都采用相应的PPA设计技术。
1.功耗的来源分析:
正如我们所了解的,功耗主要分为静态功耗和动态功耗。其中,动态功耗占到80%左右。
1.1 动态功耗
动态功耗是由于门电路在输出切换时,逻辑转换引起的功耗。分为:
动态功耗 = 开关功耗 + 短路功耗
开关功耗是指coms电路输出发生翻转时对负载电容的充放电时所消耗的功耗。负载电容包括net电容和gate电容。
其中,A为电路翻转活动因子;C为电路负载电荷和固有电容;f为电路的工作频率;Vdd为供电电压。
1.2 静态功耗
2. 降低功耗的技术
2.1 不同层级降低功耗
降低功耗应当在多有设计层次上进行。包括:系统级、逻辑级、物理级。层次越高,收益越大。
2.3 体系结构级降低功耗
2.3.1 高级门控时钟
在开关功耗中,其绝大部分由时钟分布产生,因此可以通过门控时钟将绝大部分不使用的电路关闭掉,从而降低功耗。
门控时钟技术主要分为:组合门控时钟方案和时序门控时钟方案。
其中,时序门控新增了一个触发器,不适用于多位宽的数据,且相关文献表明:时序门控时钟转换只有在多余16个触发器的情况下才更有效率。
2.3.2 动态电压频率调整(Dynamic Voltage/Frequency Scaling, DVFS)
动态技术是根据芯片所运行的应用程序对计算能力的不同需要,动态调节芯片的运行频率和电压(对同一芯片,频率越高,需要的电压也越高),从而达到降低功耗的目的。具体步骤可归纳为:首先采集系统负载相关信号,计算当前系统负载;再根据当前负载预测系统下一时间段性能需求;计算出系统工作需要的频率;最后根据新的频率计算相应的电压,调整供电电压。
2.3.3 自适应电压调整(Adaptive Voltage Scaling, AVS)
自适应电压调整,根据不同芯片制造引入的工艺差别,为不同工艺角的芯片提供不同的电压,因此能够充分利用时序裕量来减少芯片功耗。
AVS的有点是可以在满足系统性能的前提下,补充工艺、时钟频率的变化,电源变换器偏移等对系统的影响,系统正确运行在所需要的最低电压下,从而达到节省功耗的目的。
2.3.4 电源门控 (Powering Gating)
电源门控也叫电源切断技术,是指在芯片上加入开关以根据应用要求选择性地切断供电电流。一方面,对于细粒度电源门控中,需要添加一些开关晶体管,因此需要与标准库单元配合。另一方面,对于粗粒度的电源门控中,晶体管是供电网络的一部分而不是标准单元的一部分。
收益:可以消除整个被关断模块的功耗;
实现:可以由板级控制上下电或者由片内的MTCOMS开关单元控制上下电。
2.3.4 多阈值电压 (Multi-Vth)
多阈值电压技术是指:在同一颗芯片中混合使用多种电压阈值的逻辑单元。在典型的多电源库中至少包含两组功能相同但是阈值电压不同的单元。multi-vdd会带来不同电压域的cell互连通讯的问题,需要使用特殊的单元:level shifter。
原理:MOS管导通需要一定的电压,低阈值电压的单元需要的导通电压更低,所以相比高阈值电压的单元,其导通的更快,漏电流也越多,功耗更多。
建议:在时序紧张的路径上使用低阈值单元,在时序宽松的路径上使用高阈值单元。
使用影响:不同阈值的逻辑单元面积\形状相同,因此可以在项目的多个阶段替换而不影响前\后端的其他工作。
使用方法:不同阈值逻辑单元的选择和替换在综合、后端通过设定指令由工具比较自动地完成,不需要前端代码的特殊处理。一方面,如果最终设计目标是满足性能,可以使用低阈值单元进行第一遍综合以达到最好的性能来满足时序要求,再对其中不需要高性能的部分进行高阈值电压单元替换,以减小整体的漏电流和功耗。另一方面,如果设计的主要目标是功耗,在进行第一次综合时使用高阈值电压单元更合适,再找出关键路径并用低阈值电压单元进行替换。
2.3.5 多电压供电(Multi-Vdd)
由于动态功耗与供电电压的平方成正比,因此降低电压值,功耗将获得较大收益;此外,静态功耗也与供电电压成正比,也会有收益。
实现方法:将设计分为独立的“电压导”或者“电压域”,根据每个区域对时序的要求使用不同的供电电压。比如,对时序要求严格的模块放在标准电压下操作(90nm工艺是1V);对时序要求不是那么严格的路径可安排在其他低电压区域,比如0.8V。
需要额外考虑的问题:跨电压域路径时序受到影响,在设计时需要考虑时序余量。
2.4 在寄存器传输级降低功耗
2.4.1 状态机编码和解码
状态机编码对信号的活动性具有重要影响,通过合理选择状态机状态的编码方式,减少状态机切换时电路的翻转,可以降低状态机的功耗。主要有以下三个原则:
-
1.对于频繁切换的相邻状态,尽量采用相邻编码状态机编码,比如优先使用格雷码(也能消除依赖于状态组合等式中存在的毛刺风险)。
-
2.小型状态机可以选择独热码编码,在状态比较时只需要关注1bit。
-
3.避免状态机中存在冗余的状态,识别等价状态。
2.4.2 自动门控时钟编码
按照一定的编码风格,综合工具可以根据RTL自动地综合出时钟门控电路,这样可以尽可能地提高门控的覆盖率。
书写风格:
-
1、在always语句中,最后一个else写成data_out<=data_out形式(或者不写else分支,时序逻辑中自带保持)。
always @(posedge clk or negedge rst_n) begin if(!rst_n) data_out <= 32'b0; else if (enable) data_out <= data_in; //else // data_out <= data_out; end
-
- 最后一个分支无法写成data_out<=data_out,并且是一个电平条件。那么可以把最后一个分支再细分为两个分支:一个分支是由这个有效电平信号形式的脉冲信号条件;另一个分支则是最后一个else保持行为。该种写法因为需要把电平信号转化为脉冲条件,所以需要增加一个DFF;因此需要权衡这种修改方式是否合算。
例如:
always @(posedge clk or negedge rst_n) begin if(!rst_n) data_out <= 32'd0; else if (enable) data_out <= data_in; else data_out <= 32'd0; end
改成如下写法:
always @(posedge clk or negedge rst_n) begin if(!rst_n) data_out <= 32'd0; else if (enable == 1'b1) data_out <= data_in; else if (enable_negedge_pulse == 1'b1) data_out <= 32'd0; end //enable_negedge_pulse信号是enable信号的下降沿脉冲 assign enable_negedge_pulse = ~enable & enable_dly; always @(posedge clk or negedge rst_n) begin if(!rst_n) enabel_dly <= 1'b0; else enable_dly <= enable; end
2.4.3 独热码多路器
对于多路器的产生,“case”语句,“if”语句和状态机都可以实现。但是采用二进制编码的话,data的频繁翻转会进入级联的mux,会产生明显的开关过程,从而使功耗增加。若采用独热码的编码方式,输出会更快和稳定,data的频繁翻转会被sel抑制,将没有被选中的线路掩藏掉,从而达到低功耗的效果。
2.4.4 操作数隔离技术
在进行算数运算的时候,将模块的输入打开,进行有效的逻辑运算;在不进行运算的时候,使模块的输入保持不变,不让新的操作数进来,避免无效的翻转。
如下图所示,以信号AS=SEL_0&!SEL_1为操作数隔离信号,只有在AS为1时,操作数data_0和data_1才能输入到add_0;而AS=0时,add_0不操作,输出结构也不翻转。
参考资料:
[1]《数字集成电路——电路、系统与设计》
[2]《硬件架构的艺术》
[3] 致远班课程内容(是不是美女去华子了)
很棒的内容,感谢!!!