本帖最后由 yaya126 于 2017-9-9 15:11 编辑
1.a block level clock gating 如果某个模块或者功能可以打开或关闭,且logic相对独立,则可以在这部分logic的时钟上加手动插入一个ICG,用模块是能控制ICG的开关,这样能最大限度的提升gating效率。 1.ICG最好选取驱动能力较大的,以便于驱动足够多的DFF。 2.ICG建议加一个wrapper,这样当需要替换其他工艺时,只需要将wrapper里的instance 换掉。 3.综合时对此类ICG设置don’t touch
1. b RTL clock gating. Lowpower RTL综合的精髓就是把本该综合在D端的enable信号,综合到CLK端,这样只有enable有效才能释放一个clk使得D端数据传递到Q端。当D超过一定bit数,通常认定>=4bit能节省power, 为了达到这种效果,寄存器的赋值一定是条件赋值,示范代码和电路如下,
Mentor有power_pro能够帮助分析RTL,提取有效的enable,并完成代码的优化,但就我看下来,它优化过的代码可读性非常差,条件有时候也有冗余,导致过多的使能ICG,而且后续如果需要ECO,还需要购买它的formal工具,不然很难再改它的code.
此处我提供一个自己写代码分析的perl脚本,可以用来查所有代码中不符合low power RTL 代码规范的code, designer可以根据它的报告来优化赋值使能条件,已经过实际项目测试。 欢迎大家使用并提意见。(后面会解释为毛要查2d arry, initial和乘法器)
power_check.pl –v –f [filelist] –d [directory] -filter [N]–b –2d –init -mul [top.v] -v or –verbose :print verbose log for debug. -f or –file : input file list. -d or –dir : set searching directory, script will findVerilog file under this directory. -b or bak : back up previous result. -filter [N] : filter <= N bits register error. -2d or 2d_array :report2D register array. -initial or init :report initial block -mul :report multiplier info Verfilog file : input Verilog file
产生结果文件,最重要的power_check.v。
运行时报告:
|