Verilog实现低功耗设计?

Verilog如何实现低功耗设计?

做芯片第一应该关注的是芯片的PPA(Performance, Power, Area),本篇浅显的部分讨论,第二个 P,Power功耗,在RTL设计中如何做到低功耗设计,对于移动设备续航的十分重要,不要让你的芯片徒增功耗。

数据通路寄存器打拍不加复位

数据寄存器打拍带上vld,不加复位逻辑,这样会省去寄存器复位电路的布线面积,而且工具还会给寄存器插自动插时钟门控,还达到了降低功耗的效果。

至于寄存器不复位,一些刚学习的朋友可能会感觉有些刷新认知,寄存器怎么能不复位,不复位不就是x态了,系统不就紊乱了。是的,寄存器不复位是会产生x态,不过这里说的是数据通路,控制通路的所有信号都是必须带复位逻辑。数据通路因为这里是带着vld进行打拍,只需要保证在你使用的时候,它不是x态就行了。控制通路的信号控制系统的运行,出现x态,必然挂死。而数据通路只要保证在vld的有效,也就是我踩这个数据的时候它是正确的就行了,不管它是x态还是其他无效的数据。

当然如果数据有作为判断逻辑用于控制,那这个数据一定要进行复位。

代码示例,时序逻辑可以省略else,寄存器默认保持,组合逻辑必须写else。vld是一个脉冲将这个数据踹一脚直接踹进这个寄存器存储,在下一脚来临之前,这个寄存器都将保持这个数据。

1
2
3
4
always @(posedge clk)begin
if(data_vld)
dout[63:0] <= din;
end

手动插入时钟门控

手动插入时钟门控,根据控制场景的不同自动关掉部分模块的时钟,留有软件的控制通道,由软件关闭。可以有效的减少动态功耗。

举例,比如一块运算电路配置全开的时候需要四个相同的计算模块同时工作,最少的情况只需要一个模块工作,这时根据配置的不同可以将其他三个模块的时钟关掉,减少动态功耗。

整个Top模块掉电

整个二级Top模块掉电休眠,掉电后将所有需要保存的数据写到memory中,等下一次模块唤醒上电启动时再重新写回到硬件中。ASIC中的RAM可以自己生成是否需要掉电保存数据的功能,不需要的专门存储的RAM也一起掉电。

需要使用和保存的数据寄存器较少,可以从模块伸出接口到顶层,让软件读走,等下一次模块唤醒上电启动时再通过软件配置寄存器配置回模块。这就是低功耗模式。

静态功耗和动态功耗

静态功耗只要电路供电就有,除非掉电休眠,否则无法避免,动态功耗只要存在高低电平切换就有。在rtl设计时,良好的代码风格也可以降低动态功耗,乘法器、加法器等运算单元,通过减少组合逻辑的翻转,从而达到降低动态功耗的效果。

动态功耗

输入到输出,组合逻辑的a、b端值不变,没有电平翻转,所以不会有动态功耗,只存在静态功耗。在设计中考虑组合逻辑无效翻转问题,某段时间这部分数据无效,通过使能信号选择这部分逻辑保持,得到避免动态功耗的效果。

最后

本篇先记录这几点,更多、更详细的讨论,感谢大家的关注以及三连(分享、点赞、好看),我们下一篇再见。

NingHeChuan wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!