当DC映射线路图的时候,使用target_library变量指定的综合库(Synthesis Library,简称库)。综合库是由半导体厂商提供,包含工艺技术参数和单元的功能。DC使用库里的单元构成电路。综合库不仅包括单元的功能和延时,还包括了引脚的电容和设计规则等。
5.1 综合库和设计规则
综合时,DC要检查所构成的电路是否满足设计规则和其他约束的要求。
5.1.1 综合库
半导体厂商提供的综合库如下信息:
(1)单元
功能
时间(包括时序器件的约束,如建立和保持时间)
面积(面积单位不在库中定义)
功耗
测试
…
(2)连线负载模型(wire load models)
电阻
电容
面积
(3)工作条件(Operation Conditions)
进程(process),电压和温度的比例因数
(4)设计规则约束(Design Rule constraints)
最大电容和最小电容
最大转换时间和最小转换时间
最大扇出和最小扇出
DC使用的综合库必须是.db格式的库。如果只有.lib文件,需要在Library Compiler中将其转换为.db文件。
设计规则一般由半导体厂商提供,在使用工艺库中的逻辑单元时对其联结所强加的限制。只可以按照设计规则的约束或按照更严格的设计规则约束来设计电路,而不可以放松约束。DC在综合时使用加入缓冲器(buffering)和改变门单元的驱动能力(cell sizing)技术来满足设计规则的目标。
5.2 静态时序分析
在进行综合时,DC用内建的静态时序分析工具Design Time来估算路径的延迟以指导优化的决定。综合DC时,用Design Timing来产生时间的报告。
5.2.1 时序路径和分组
静态时序分析可以不进行动态仿真就决定电路是否满足时间的约束。静态时序分析包括三个主要步骤:
(1)把设计分解成时间路径的集合
(2)计算每一条路径的延迟
(3)所有的路径延迟都要做检查(与时间的约束比较),看它们是否满足时间的要求。
为了便于分析电路的时间,时序路径又被分组。路径按照控制它们终点的时钟进行分组。如果路径不被时钟控制,这些路径被归类于默认(Default)的路径组。用report_path_group命令来报告当前设计中的路径分组情况。
图中共有5个终点,时钟CLK1控制3个终点,共有8条路径。时钟CLK2控制一个终点,共有3条路径。输出端口为1终点,不受任何时钟控制,其起点为第二级寄存器的时钟引脚,只有一条路径,这条路径被归类于默认的路径组。
因此本设计共有12条路径和3个路径组。这三个路径组分别为CLK1、CLK2和默认(Default)路径组。
5.2.2 时间路径的延迟
在计算路径的延迟时,Design Compiler把每一条路径分成时间弧(timing arcs)。
时间弧描述单元或/和连线的时序特性。单元的时间弧由工艺库定义,包括:
(1)单元的延迟
(2)时间检查(如寄存器的setup/hold检查,clk—>q的延迟等)。
连线的时间弧由网表定义。
单元的时间弧是边沿敏感的。
5.2.3 时序报告和时序问题的诊断
DC中常用report_timing命令来报告设计的时序是否满足目标。执行report_timing时,DC做4个步骤:
(1)把设计分解成单独的时间组
(2)每条路径计算两次延迟,一次起点为上升沿,另一次起点为下降沿
(3)在每个路径组里找出关键路径(critical path),即延迟最大的路径
(4)显示每个时间组的时间报告
报告中小数点后默认的位数是2,如果要增加有效数字,在用report_timing命令时,加上命令选项“-significant_digits”…
report_timing命令的默认行为是报告每个时序路径组里的关键路劲。
综合前必须把RTL源代码输入DC,对于同样功能的电路,不同的设计者写出的算法和描述可能是不同的,得出的结果也往往是不同的。
6.1 电路优化
在编写RTL时,常常会用到算术运算。
6.1.1Synopsys的知识产权库----DesignWare
DesignWareSynopsys提供的IP库,IP库分为可综合IP库,验证IP库,和生产厂家库。
对于每个运算符号,一般来说DesignWare库中会有多个结构来完成该运算。这样就允许DC在优化过程中评估速度/面积的折中,选择最好的实现结果。对于一个给定的功能,如果有多个DesignWare电路可以实现它,DC将会选择能最好满足设计约束的电路。
行波进位加法器是面积最小,但是延迟最大的加法器。
超前进位加法器加法器是面积比行波进位加法器大,但速度快。
进位存储加法器延迟和比特无关,它的面积和行波进位加法器一样大,但速度要快的多。
6.1.2电路优化的三个阶段
阶段一:结构级的优化
(1)设计结构的选择
在DesignWare中选择最合适的结构或算法实现电路的功能
(2)数据通路的优化
选择CSA等算法优化数据通路的设计
(3)共享共同的子表达式
(4)资源共享
算术运算资源共享的默认策略是约束驱动的。可以指示DC使用面积优化的策略,即将变量hlo_resource_allocation设置为area。
set hlo_resource_allocation area
如果不希望资源共享,将变量设置为none
(5)重新排序运算符号
表达式SUM <= A * B + C * D + E + F +G
电路的总延迟等于一个乘法器的延迟加上4个加法器的延迟
为了使电路的延迟减小,可以改变表达式的次序或用括号强制电路不同的拓扑结构。
SUM <= E + F +G + C * D + A * B
电路的总延迟等于一个乘法器的延迟加上2个加法器的延迟。
阶段二:逻辑优化
结构优化用共用子表达式来减少逻辑,这种方式即可以用作速度优化也可以用作面积优化。结构优化是DC默认的逻辑级优化策略。
展平优化把组合逻辑路径减少为两级,变为乘积之和的电路,即先与后或的电路。
这种优化主要用作速度的优化,电路的面积可能会很大。
阶段三:门级优化
门级优化,DC开始映射,完成实现门级电路。映射的过程包括4个步骤:
(1)延迟优化
(2)设计规则修整
(3)以时序为代价的设计规则修整
(4)面积优化
门级优化时需要映射组合功能和时序功能。
组合功能的映射是,DC从目标库中选择组合单元组成设计,该设计能满足时间和面积的要求。
时序功能的映射是,DC从目标库中选择时序单元组成设计,该设计能满足时间和面积的要求。时序映射时,为了提高速度和减小面积,DC会选择比较复杂的时序单元。
6.2 优化策略
一般情况下,把时序和设计规则作为设计的目标。
先将RTL和设计约束读入DC,然后对设计进行编辑(综合)。编辑完成后,检查结果,查看电路是否满足时间和设计规则的要求。对于时间检查,可用report_timing命令来显示详细的时间报告。如果设计即能满足时间和面积的要求又不违反设计规则,那么综合完成。可以把门级网表和设计约束等交给后端(backed)工具做布局(placement),时钟树综合(clock tree synthesis)和布线(route)等,产生GDSII文件。如果设计不能满足时间和面积的要求或违反设计规则等,就要采取措施。
6.2.1 编辑策略
如果时序的违规(timing violation)在时钟周期的10%~25%或更小,使用以下方式:
(1)使用compile_ultra命令
该命令适用于时序要求比较严格,高性能的设计。使用该命令可以得到更好的延迟质量,特别适用于高性能的算术电路优化。
该命令包含了以时间为中心的优化算法,在编辑的过程中使用的算法有:以时间为驱动的高级优化; 为算术运算选择适当的宏单元结构; 从DesignWare库中选择最好的的数据通路实现电路; 映射宽扇入门以减小逻辑级数; 积极进取地使用逻辑复制进行负载隔离; 在关键路径自动取消层次划分。
(2)使用compile-scan-inc命令
(3)使用自定义路径组和关键范围
6.2.2 自动芯片综合(Automatic ChipSynthesis)
ACS分为三个步骤:
(1)把设计划分成易于处理的子设计,这样可以采用自低向上的策略
(2)自动为子设计或模块产生编辑脚本和约束预算,ACS选择为划分好的模块做编辑时,先要进行编辑的模块产生编辑脚本和设计的约束。
(3)进行单个命令的平行综合。
6.3 网表的生成格式及后处理
功能等价的代码,编写代码的风格和算法不同,综合后,会得到不同的结果。
综合时,为了增加电路的可测试性,通常采用在设计中插入扫描链。插入扫描链包括用扫描触发器来代替所有的标准触发器,在电路中加入内部扫描链。在设计的早期阶段,计算扫描触发器对电路的时间和面积的影响。
为了使IC可测,在设计中额外地增加或修改逻辑,增加输入/输出端口。
产品的平均故障间隔时间(Mean Time Between Failure,MTBF)与工作温度有关,即MTBF=f(operating temperature),功耗越低,MTBF越长。
进行低功耗设计时,需要三个方面的内容:
(1)功耗模型
功耗管理的基本结构
IC设计所用工艺库的功耗模型
(2)功耗分析
分析设计中的每个单元的功耗
分析所有级设计(RTL代码,门级网表和版图设计)的功耗
根据仿真的结果进行功耗分享
(3)功耗优化
在所有级的设计都降低功耗
降低功耗的方法有:
(1)门控时钟电路
(2)操作数分离
(3)门级电路的功耗优化
(4)多个供电电压
(5)多阈值电压
(6)门控功耗
前4个方法适用于降低动态功耗。后面两个适用于降低静态功耗。
9.1 工艺库的功耗模型
CMOS电路的功耗由三部分组成:
(1)开关功耗
对输出电容负载充电
(2)内部功耗
短路功耗
(3)漏电功耗
静态功率
开关功耗和内部功耗为动态功耗;漏电功耗为静态功耗。器件的总功耗等于动态功耗加上静态功耗。
开关功耗是指对外部电容负载进行充电时从电源VDD抽取的功耗。内部功耗中的短路功耗是指单元的输入从低电平到高电平或从高电平到地电平的转换过程中,单元内部P管和N管同时导通的那个瞬间的功耗,不是因为单元损坏产生的短路功耗。
开关能量:
内部能量:
由特性描述工具预先处理,存放在工艺库的功耗查找表里。
漏电功耗:
由特性描述工具预先处理,存放在工艺库
9.2 功耗分析
对电路进行功耗分析时,需要计算每个单元的功耗。单元的功耗包括开关功耗、内部功耗和静态功耗。
9.3 低功耗电路的设计和优化
9.3.1 门控时钟电路
在一般情况下,使用门控时钟电路,可以节省20%~60%的功耗。
在power compiler中,用insert_clock_gating命令可以在GTECH网表上加入门控时钟。在执行insert_clock_gating命令前,一般使用set_clock_gating_style命令来指定要插入门控时钟电路的结构。
read_verilog rsic.v
set_clock_gating_style...
inset_clock_gating
compile
加入门控时钟电路后,由于减少了时钟树的开关行为,节省了开关功耗。由于减少了时钟引脚的开关行为,寄存器的内部功耗就减少了。通常情况下,时钟信号为为设计中翻转率最高的信号,时钟树的功耗可高达整个设计功耗的30%。
由于门控时钟不需要用到MUX单元,加入门控时钟电路之后,设计的面积也减小了。
门控时钟电路的扇出越大,减低功耗和面积的效果就越好。
使用多级门控时钟,时钟综合器可以尽量地摆放门控时钟单元,使它靠近时钟源,从而最大限度地降低时钟树的功耗。
9.3.2 操作数分离
当SEL_0不等于1,SEL_1不等于0时,加法器add_0的运算结果不能通过mux_0和mux_1输出到达寄存器reg_0。因此这个时候加法器Add_0并不需要工作。
为了节省功耗,可以用操作数分离的方法,在某些条件下,使加法器不工作,保持静态。
默认情况下,如果操作数隔离(简称OI)的物体满足下列条件,Power Compile自动选择。
(1)OI的物体是算术运算器或者层次组合单元
(2)OI的物体的输出是选择性地使用
(3)运算器必须有非零的翻转率
(4)仅当工具进行功耗估算之后,用操作数隔离具有潜在的功耗可节省,才把他们作为OI物体。
9.3.3 门级电路的功耗优化
门级电路的功耗优化(Gate Level Power Optimization,简称GLPO)是从已经映射的门级网表开始,对设计进行功耗的优化以满足功耗的约束,同时设计保持其性能。
门级电路的功耗优化包括了设计总功耗、动态功耗以及漏电功耗的优化。
优化时,所产生的电路首先要满足设计规则的要求,然后满足时序约束的要求,在满足时序优化性能要求的基础上,进行总功耗的优化,再进行动态功耗的优化和漏电功耗的优化,最后对面积进行优化。
进行低级优先权约束的优化不能以牺牲更高优先权的约束为代价。功耗的优化不能降设计的时序。
功耗的减少以时序路径的正时间冗余作为交换,即功耗优化时会减少时序路径上的正的时间冗余。因此设计中正的时间冗余越多,就会越有潜力降低功耗。
静态功耗和半导体工艺
由于半导体器件的几何尺越来越小,器件中的晶体管门数越来越多,器件的供电电压越来越低,单元门的阈值电压越来越低。
阈值电压Vt越高的单元,它的漏电功耗越低,但门延迟越长。
阈值电压Vt越低的单元,它的漏电功耗越高,但门延迟越短。
一般的设计中,一个时序电路组有多条时序路径,延迟最大的路径称为关键路径。根据多阈值电压电压单元的特点,为了满足时序的要求,关键路径上使用低阈值电压的单元(low Vt cells),以减少单元门的延迟,改善路径的时序。而为了减少静态功耗,在非关键路径中使用高阈值电压的单元(high Vt cells),以降低静态功耗。因此使用多阈值电压的工艺库。可以设计出低静态功耗的高性能的设计。
动态功耗优化通常在做完时序优化后进行。动态功耗优化时,需要提供电路的开关行为,工具根据每个节点的翻转率,来优化整个电路的动态功耗。用compile/physopt命令可以同时对时序和功耗做优化。
Power Compiler使用下面的技术进行动态功耗的优化。
(1)修改电路的驱动能力。
把关键路径上驱动能力不足的与门交换,时序几乎不受影响。
(2)技术映射
把高翻转率的连线放入单元内,从而减小开关功耗。
(3)交换引脚
把高翻转率的连线连接到电容值小的引脚
(4)相位分配
经相位分配后,功耗变小了,但面积变大了。
(5)因式分解
设计的原来功能为表达式:
f = ab + cd +bc
信号位宽都相同,信号b是高翻转率的连线。因式分解得到:
f = b(a+c) + cd
(6)插入缓冲器
插入缓冲器后,减少了与非门的负载,并使寄存器的输入转移时间变小。
总功耗的优先级比静态功耗高。总功耗优化时,工具尽量减少动态功耗和静态功耗的和。优化时如果减少了漏电功耗增加了动态功耗,但是它们的和减少了,优化是有效的。
9.3.4 多个供电电压
降低供电电压是降低芯片功耗最直接的方法。
由于单元的延迟与供电电压成相反关系,即供电电压越高,单元的延迟越小。为了满足时序的要求,对于工作频率高的模块,使用供电电压高的电源,以降低时序路径中单元的延迟,从而降低整条时序路径的延迟。
通过对不同的模块设置不同的供电电压,可以使整个设计既能满足时序的要求,又可以降低其功耗。使用多电压技术,版图设计时,要产生多个电压区域(Voltage Area),把供电不同的模块,分配到不同的电压区域。
多电压设计目前有三种设计风格:
(1)各电压区域有固定的单一电压
(2)各电压区域有固定的多个电压,软件控制选用哪一个电压
(3)采用自适应方式,各电压区域有可变的电压,软件控制选用电压、
采用多电压技术设计时,如果要在不同的电压区域传递信号,需要使用电平转换器,把高电压区域的信号传递到低电压区域,反之亦然。
9.3.5 电源门控
电源门控是指芯片中某个区域的供电电源被关掉,即该区域内逻辑电路的供电电源断开。
如果某一模块在一段时间内不工作,可以关掉它的供电电源。断电后,设计进入睡眠模式,其功率很小。唤醒时,为了使模块尽快恢复工作模式,需要保持关电前的状态。保持寄存器(retention register)可用于记忆状态。使用保持寄存器设计电源门控。
在睡眠模式,寄存器的电源Vdd2被切断,因此它的漏电功耗极小;这时候仅仅保持锁存器处于工作状态,寄存器的值保留在锁存器里。由于锁存器是用高阈值电压的晶体管组成,漏电功耗很低。当Restore被激活,寄存器的电源Vdd2被加上,保留在锁存器里的值被载入到寄存器。寄存器的工作状态时,它作为一般的寄存器工作。
Save/Restore引脚也称为电源门控引脚,被用于把电路置于适当的模式。
电源门控模块的输出端需要用隔离单元(Isolation cell),因为在睡眠模式时,模块的输出是不确定值。为了保证在睡眠模式时,下一级的输入不会悬空,插入隔离单元,提供一个“1”或“0”的输出,使下一级的输入为确定的逻辑值。