Verilog练习生
这个问题我也被问过好几次,后来我总结了一个从高到低、从粗到细的叙述框架,面试时按这个思路讲,显得逻辑清晰。
首先强调低功耗是贯穿整个流程的,不是某一个阶段的事。
系统级/架构级方法:
1. 硬件休眠与唤醒策略:设计系统级的低功耗状态机,如睡眠、待机、深度睡眠模式,并规划唤醒源。这是系统层面最核心的。
2. 电源域划分:根据功能模块的活跃时间,划分不同的电源域(Always-On, Switchable)。
3. 动态功耗管理(DPM):软件或硬件控制器根据任务调度关闭/开启子系统。
4. 片上电压调节器(VR)的使用,实现精细的电压控制。
RTL级方法(可综合的):
1. 时钟门控:这是RTL级最有效的手段。注意区分模块级门控和寄存器级门控。编码时,把使能信号(enable)做干净,工具才能很好推断。避免在使能路径上引入毛刺。
2. 操作数隔离:在乘法器、加法器等大功耗单元前加隔离逻辑,当输入无效时,锁住前级数据,避免其翻转传播。
3. 存储器功耗优化:使用存储器的时钟门控、按需读取(比如不要总是预取整个行)。
4. 低翻转率编码:比如总线上的地址可用格雷码,数据可用总线反码(Bus Inversion)技术,减少同时翻转的位数。
后端/物理级方法:
1. 多阈值电压(Multi-Vt)优化:标准流程,后端工具自动做。
2. 电源门控实现:包括插入电源开关、隔离单元(Isolation Cell)、保持寄存器(Retention Register)和电平转换器(Level Shifter)的布局布线。
3. 时钟树综合优化:降低时钟网络的负载和切换活动。
举例的话,可以说在某个通信协议处理芯片中,我负责的编解码模块在包间隙是不工作的。我在模块顶层加了一个来自系统控制器的“模块使能”信号,这个信号直接用于该模块所有时钟的使能控制(即模块级时钟门控)。在RTL中,我是通过将系统时钟和这个使能信号“与”操作后产生本地时钟(不推荐直接这样写),更规范的做法是使用综合工具的指令或标准的集成时钟门控单元(ICG)例化。这样简单有效,后端报告显示该模块的时钟网络功耗显著降低。
注意事项:面试时别光背名词,解释一下基本原理和为什么要用。比如时钟门控是切断时钟翻转,直接降低动态功耗;电源门控是切断电源,连漏电功耗都省了,但代价是唤醒延迟和状态保存问题。
