| 本帖最后由 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。 
    
    
            
              
 运行时报告: 
    
    
            
              
 
 |