ICC布局阶段
在布局规划阶段完成了芯片的整体规划,而布局阶段主要是软件自动的标准单元的摆放。
在布局开始之前,需要对设计进行确认和检查。
主要确认内容包括:
·检查设计中的所有macro是否设置为dont_touch属性。在大多数情况下,宏单元的位置是在布局规划期间确定的,并且其位置是“固定的”。最好再次修复所有宏位置,以防万一在设计计划后手动移动了宏,却忘记了将其fix住,导致在placement阶段使其移动。
Icc_shell>set_dont_touch_placement [all_macro_cells]
·检查placement blockage是否正确添加,以及确认blockage的类型。
·检查TLU+文件是否设置。前面说过这是软件计算RC的查找表,是软件计算timing的基础。
Icc_shell>check_tlu_plus_files 需要三项Passed!
如果还未设置,Icc_shell>set_tlu_plus_files -max_tluplus $tlup_max -min_tluplus $tlup_min -tech2itf_map $tlup_map
·将所有的scenario都激活。如果没有MCMM,则不用执行该操作。
Icc_shell>set_active_scenarios -all
·将每个scenario高扇出网络以及时钟网络设置为理想的网络。
Icc_shell>set_ideal_network [all_fanout -flat -clock_tree]
·检查绕线的layer是否设置正确。如果设置不正确,会影响到工具估算congestion map的准确性。
Icc_shell>report_ignored_layers
设置ignored layer(Eg:ignored M3以下 M5以上的layer)
Icc_shell>set_ignored_layers -min_routing_layer M3 -max_routing_layer M5
·设置标准单元摆放的约束。一般在电源地Strap下面放置标准单元时,可能会在Strap的地方存在Congestion。这时可以限制工具在电源地Srtap下面少放或者不放置标准单元。举例说明对Pnet(Power net)Placement Blockages的设置:
将M1和M2的PG线下方设置为Partial Blockage:>set_pnet_options-partial {M1 M2}
不允许M1和M2的PG线下方放置任何标准单元:>set_pnet_options-complete { M1 M2}
允许软件在M1和M2的PG线下方放置任何标准单元,在不指定的情况下,软件默认:>set_pnet_options-none {M1 M2}
其中,-paretial option允许软件在pg strap下放置标准单元,但是需注意strap和单元引脚之间的短路,需要满足最小距离的DRC,但这将导致在strap附近的引脚能难以接线,使得拥塞增大。
以上即为布局之前的设计检查。
其中提到了scenario和MCMM(Multi-corner Multi-mode)。
corner是PVT上的区别,一种PVT对应一个corner;mode主要有func和scan。
由于影响cell delay的因素主要有:工艺,电压和温度三种(PVT),由此产生各种corner:
WC:worst case slow,低电压,高温度,慢工艺 -> 一般情况下delay最大,setup 差。
WCL:worst case low-temperature,低电压,低温度,慢工艺 -> 温度反转效应时delay最大,setup差。
LT:即low-temperature,也叫bc(best case fast),高电压,低温度,快工艺 -> 一般情况下delay最小,hold差。
ML:max-leakage,高电压,高温度,快工艺 -> 温度反转效应下delay最小,hold差。
TC:typical,也叫tt,普通电压,普通温度,标准工艺 -> 各种typical。
其中的快、慢和标准工艺指manufacture时的N/PFET的驱动电流值,min对应慢工艺,max对应快工艺。
一个corner和一个mode组成一个scenario 形成不同组合的scenario。针对不同的scenario可以进行不同的功耗以及setup、hold time的优化。
icc中创建不同的scenario的命令为Icc_shell>create_scenario $name 当需要多个scenario时一般可以自己写成一个脚本,设置dc输出的约束条件.sdc文件和相应的RC文件TLU+。
使用set_scenario_options命令设定该scenario对setup hold 或者动态静态功耗进行优化。
在布局前的检查完成之后,接着进行placement flow。
·DFT Setup
DFT全称是Design for test,这一步主要是针对设计中存在scan chains(扫描链)的情况下进行的优化。
为了满足可测试性设计(DFT)的需求(可观测,可控),将设计中所有(或大部分)的触发器连接在一条或者若干条链上,这条链我们称之为scan chain。这步是在逻辑综合工具(Design Compiler)中实现的。在netlist网表中,ICC读到设计进行了扫描链scan chains,需要读入scandef文件。这个scandef文件也是DC输出的。
在ICC中,我们可以用命令icc_shell>check_physical_design -stage pre_place_opt进行检查,若出现Error:
说明该设计中进行了扫描链设计,但是没有输入scandef文件。
icc_shell>report_scan_chain 可以看到报告中没有任何scan_chain信息,此时我们就需要读入scandef文件。
在绕线资源比较紧张的情况下,在ICC/ICC2中读入对应的scandef,然后让工具做scan chain的reorder,从而缓解绕线资源紧张的状态。原因是:
在DC综合阶段,由于工具并没有所有寄存器的物理位置信息,所以工具默认情况下是按照字母的顺序来做scan chain的插入。大部分情况下,这样的scan chain连接方式并不是最优的。ICC/ICC2中的placement是基于timing和congestion driven的,所以原来两个寄存器(比如下图中的DFF2和DFF3)的scan chain是前后级的关系,但是在ICC/ICC2中可能这两个寄存器离的比较远,这样的情况,就会导致寄存器SI(scan in)端的走线很乱,加重design的congestion issue。而经过scan chain reorder之后,使得走线变得有序。
经过了scan chain reorder之后,设计的走线会变得有序,大大缓解绕线资源。通过飞线图我们可以直观地看出对比。
下面给出一个scandef文件的实例作为参考,其中包括:
在如图的一条scan chain中,+FLOATING中的寄存器单元是可以进行reorder的,软件可以对他们进行走线优化,而+ORDERED 中的是不能做reorder的。
正常情况 scan chain连接是无序的,若无需进行optimize_dft, 则icc_shell>place_opt -continue_on_missing_scandef
若需要进行optimize_dft,则icc_shell>read_def design_data/ORCA_TOP.scandef 读入scandef文件后,
icc_shell>report_scan_chain,此时发现与开始报告的不同,设计中已经读入了scan chain
在读入了scandef文件后,在最后的place_opt命令里带上-optimize_dft的选项即可对扫面链进行优化。同时,ICC不仅支持place过程的scan chain reordering,也支持clock_opt阶段的scan chain reordering。所以在place阶段用了scan chain reordering之后,务必在clock_opt阶段继续做进一步的优化,减少hold violation的数量。
·Power Setup
功耗优化:芯片的整体功耗分为动态功耗(dynamic) 和静态功耗(Static Powers),又称漏电流功耗(Leakage Power)
其中动态功耗又分为:
·标准单元内部功耗(Internal Power),即短路功耗,即上下PMOS和NMOS同时导通时的功耗。这部分的计算是嵌入library库文件内部,通过标准单元的input transition和output load来查表得到的。
·Switch power,即开关功耗。动态功耗和data的翻转率(TR),静态概率(SP),电压,负载电容相关。这一部分为互连线(net)上的dynamic功耗,这部分的计算通过将所有net上每个翻转周期的功耗乘以其翻转率并相加得到。
在Power Setup中,主要进行优化的是开关功耗,为了优化动态功耗,ICC通常会读入SAIF文件(ICC只识别SAIF文件,可将VCD文件转化为SAIF文件后使用)。Saif文件记录cell和net的switching activity(翻转活动),即记录了上述的翻转率。
·SAIF文件:即switching activity interchange format,开关行为内部交换格式文件,用于仿真器和功耗分析之间交换信息的ASCII文件(美国标准信息交换码文件)。
·VCD文件,即value change dump 文件,它也是一个ASCII文件,文件中包括了一个设计中所选择变量值的变化信息,这些信息通过在仿真testbench中使用“VCD系统函数”得到。
平均功耗分析,分3种情况:
(1)假如有波形文件:最理想的情况是能提供后仿产生的VCD/SAIF文件,通过read_vcd/read_saif将真实的翻转率反标到Net上,然后通过report_switching_activity检查反标率,最后report_power报功耗值。
(2)人为设置翻转率:根据经验值,通过set_switching_activity/set_case_analysis来设置register,clock gate以及memory/blackbox的翻转率,这个经验是从以往项目的仿真得到的,然后通过以下类似下面的命令设置:
reset_switching_activity (重置之前设置的翻转率)
set_switching_activity [get_pins -of_object [all_registers]] -toggle_rate 0.5 -static_probability 0.5 -base_clock * (设置register的翻转率)
set_switching_activity -type black_boxes -toggle_rate 0.1 -static_probability 0.5 -base_clock * -hierarchy (设置blockboxs上的翻转率)
set_switching_activity -toggle_rate 0.5 -static_probability 0.5 -base_clock * [remove_from_collection [all_inputs] [get_port -filter "is_clock_used_as_clock == true"]] (设置Input上的翻转率)
set_switching_activity [get_pins -of_object [get_cells -hierarchical * -filter "ref_name =~ *ICG*"]] -toggle_rate 0.5 -static_probability 0.5 -base_clock * (设置clock gate上的翻转率)
set_case_analysis 1 [get_ports *reset*] (使reset信号不翻转,准静态信号)
set_switching_activity -toggle_rate 0 -static_probability 1 -base_clock * [get_port *reset*]
(3)使用默认翻转率:最不济的方式就是使用工具默认的翻转率了,通过下面3个变量可以设定。
set_app_var power_default_toggle_rate 0.5 (默认值为 0.1)
set_app_var power_default_static_probability 0.5 (默认值为0.5)
set_app_var power_default_toggle_rate_reference_clock fastest (默认值related)
具体的翻转率的计算以及SAIF文件转换等内荣可以参考https://www.cnblogs.com/IClearner/p/6898463.html(出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner)
读入SAIF文件后,使用ICC的LPP(low power placement)功能,ICC在布局阶段会挪动一些cell,缩短高翻转率的net的长度,降低net上的电容,从而降低与之相连的cell的动态功耗。如下图中,将高翻转率0.8的net长度缩短,以降低动态功耗。
Icc_shell>set_optimize_pre_cts_power_options -low_power_placement true
静态功耗是指逻辑门在不切换时消耗的功耗,其主要由源极到漏极亚阈值泄漏电流引起的,即逻辑门未完全关闭。因此,静态功耗通常称为泄漏功耗leakage power。
每个标准单元的leakage都集成在其library库文件(.lib)中,因此计算leakage power只需在制定条件下将design中所有的标准单元(包括各种Macro)的leakage值相加即可。
单元门的阈值电压和漏电功耗(静态功耗)有如下图所示的关系:
静态功耗与阈值电压呈指数关系。
阈值电压Vt越高的单元,它的漏电功耗越低,但门延迟越长,也就是速度慢;
阈值电压Vt越低的单元,它的漏电功耗越高,但门延迟越短,也就是速度快。
为了满足时序的要求,关键路径中使用低阈值电压的单元(low Vt cells),以减少单元门的延迟,改善路径的时序。而为了减少静态功耗,在非关键路径中使用高阈值电压的单元(high Vt cells),以降低静态功耗。设计者根据设计需求选用不用阈值电压的Cell,取得性能和功耗的折中。
指定多阈值电压约束:icc_shell>set_multi_vth_constraint
指定scenario用于进行静态功耗的优化:icc_shell>set_scenario_options -leakage_power true
关于低功耗设计在lab2010中只提及saif文件的读入,更多的内容在http://www.cnblogs.com/IClearner/ IC_learner低功耗设计入门中讲解了很多,比如门级功耗优化技术GLPO:Gate-level power opt等,据我所了解还有多电源多电压技术,Multi supply Multi Voltage(MSMV)划分为不同电压域(Voltage Area),也被称为Power Domain的技术。我也还在学习,并且我在跟着lab做的时候都是参考这位大佬的博客内容对lab进行理解的。于是自己也写一下博客记录一下。
最后开始布局,整个placement阶段进行标准单元的摆放命令其实就是place_opt ,但整个placement过程基于Timing Driven和Congestion Driven以及Power Optimization进行,不同的条件下placement的结果和质量,也是不一样的。placement的好坏,直接决定了时钟树的质量和绕线,最终体现为影响芯片的性能。
Timing-driven placement会将拥有时序关系的标准单元放置在接近的位置以减少连线上的RC
较小的timing违例可以在后续步骤中进行修复和优化,而在placement阶段不能出现太大的congestion违例。
place_opt进行以下四个部分,当然这都是软件自己完成的。
命令:Icc_shell>place_opt -area_recovery -congestion -optimize_dft -power
其中,-area_recovery可以减小非关键路径的单元尺寸,帮助减少congestion和power ,-optimize_dft 和 -power只有当DFT和powery优化的时候需要
-congestion 选项为设计已知congestion比较严重(如第一次使用未带选项进行place_opt发现congestion较严重),或者在布局规划(floorplan)中使用了 “high effort”算法(set_fp_placement_strategy -congestion_effort high)时需要。
·Initial placement (Coarse placement)
这个步骤就是通常我们所说的Coarse placement。将标准单元粗略摆放好,此时不考虑overlap问题。
·Auto High Fanout Synthesis(AHFS)
这个步骤将design中高扇出的点(时钟信号,reset信号等除外),进行解high fanout操作,优化时序。所以用来做placement的constraint,请务必将其中那些不必要的ideal network移除。
·Logic Optimization
该步骤根据我们添加的选项进行优化,这个过程主要有cell sizing, moving, net spitting, gate cloning, buffer insertion和area recovery这些小步骤组成。
·Placement Legalization
进行legalization操作,将所有的标准单元放置在row上,并且保证所有的cell处于legal的状态,即不存在overlap或者不在对应的row上。
place_opt过后,标准单元应该被正确地摆放在row上,进行设计后的报告
icc_shell>report_congestion -grc_based -by_layer -routing_stage global -search_repair
report_design -physical
report_qor
report_power
分析报告,如果有不满足或者可以更优化的部分,可以使用如psynopt ( -area_recovery -power)命令在在原有基础上做增量优化。此时设计中最好不要存在Setup的违反,可以存在Max Cap/tran、hold、Min Cap的违反。
保存设计 icc_shell>save_mw_cel -as ORCA_placed placement阶段结束