脚本与实战系列断更了几天,今天来补上一篇。04脚本--placeopt.tcl
正如脚本的名字那样,这是std cell的摆放。同样的,先展示一下运行脚本后的结果。
然后细看一下std cell的摆放
看到这些有动力了吗?有动力了就来学习吧
还是一项一项分析
一。准备工作
仍然是Source 00脚本和procs脚本。source的脚本同03脚本一样,00脚本不懂得可以去看:数字IC后端小白学习日志---000 day(介绍00脚本)-CSDN博客
procs脚本在接下来本文后部分也会介绍。其他的也很简单,不懂的可以看之前的文章。
restoreDesign之后的界面:
二。一些配置
一些配置工作,这些配置工作的目的都只有一个,为了保证place能够达到一个预期的,比较好的效果。
(2.1)优化的基本设置
基本常用的一些设置:
setDesignMode
-node,别称“超级开关”,是比较重要的一个设置,可以针对某一种特定的工艺做一些基础的设置。它的选项很多,分别对应不同Foundary的不同工艺的区别,N系列就是台积电的,S系列就是三星的。。。
-process,相比于-node,-process是更通用的设置,因为可以看到-node里面的都是20以下的,此处用到的工艺是45,所以使用更为通用的-process 45。在成熟的工艺中,都有特定的数字去代替,比如40,28等等。
setAnalysisMode
这里面主要是关于一些timing的设置
-analysisType {single | bcwc | onChipVariation}
其中OCV(onChipVariation)模拟的PVT条件的偏差会更接近实际情况,会减少一些不必要的悲观量。
-cppr 是关于clock line上的common path的一个处理方式。
setOptMode
工具在优化的过程中会增加很多新的Cell,对于这些Cell,我们希望他们都带一个我们能快速辨别他们的名字。也就是Prefix(前缀)。当然,可以给Instance加Prefix,那么也可以给Net加Prefix。
-addInstancePrefix “PRECTS_”
-addNetPrefix “PRECTS_NET_”
我们在做PR和Signoff的时候其实是不太在意这些的。而其他的一些工具在读入网表的时候会规定Instance的name和Net的name是不能一样的。
-powerEffort none
此项目此处不太关心Power,所以使用-powerEffort none给关掉。
还有一些[-maxDensity <density>] [-maxLength <length>]等等在实际应用中根据需要去调。
setTieHiLoMode
这条命令本身只是去控制那些加的Tie-high和Tie-low的Cell,也就是说在电路中某些地方电平需要拉高和拉低,就需要专门的Cell去做这些连接。
-maxFanout 2 ,就是设置一个Tie cell可以连接几个Fanout。若设置的太大,可能出现的问题:需要拉高的时候拉不高,需要拉低的时候拉不低。若是设置的太小,可能导致Tie Cell最后局部的density会出现问题。
-honorDontTouch true ,就是设置为honorDontTouch的情况下到底要不要加Tie,一般加的DontTouch都是工程师自己加的,也就是真的不希望动的地方,所以设置为true
-honorDontUse true,同上一样,是工程师真的不需要用到的,所以设置为true。
-prefix “PRECTS_TIE_” ,给加的Tie cell加一个Prefix(前缀)。便于识别。
-cell {TIEHI TIELO} 就是指定我们需要加的Tie Cell的类型
这样Common的一些设置就完成了
(2.2)Routing(绕线)的一些设置
setDesignMode
也是在setDesignMode里面,设置Top和Bottom层的绕线层,就是告诉工具只能用哪些层进行绕线,此处就是告诉工具只能用Metal1-Metal9进行绕线。
-topRoutingLayer Metal9
-bottomRoutingLayer Metal1
setNanoRouteMode
注意这里的绕线是globalroute,它不是真正的绕线。
-routeWithTimingDriven -true 也就是告诉工具在绕线的时候考虑时序。
(2.3)macro和ports的设置
这里关于macros和ports的设置就是把他们都 fix 住,否则工具在place的过程中可能会挪动macro和port。
macro:
ports:
关于dbGet和dbSet后续会出一个专题,专门进行练习。
(2.4)path groups
工具在优化的时候会对timing path根据它的特点分成不同的path group
常见的path groups就是以下四种。
group_path
-name 设置的名字而已
-from pathGroup的开头
-to pathGroup的结尾
setPathGroupOptions
-effortLevel 对不同的path group的关注不一样,如此处,我们关心erg2reg,所以把reg2reg的effortLevel设置为high
(2.5)set_dont_use_cells
就是设置一些不用的cell。此处很简单,不再介绍
(2.5)drv
设置一些drv的约束
set_max_transition
-clock_path 200 [all_clocks] -override
-data_path 400 [all_clocks] -override
一般可以按照clock_cycle的比例来定,对clock上面的transition一般定为5%-8%,对data上面的transition一般定为15%-20%
输入命令后报错:
因为我们的viewDefinition文件已经读进去了,已经读好了,这个时候想要去该里面的设置,timing constraint的话是不能直接改的。
提示我们 man TCLCMD-1048,那我们去man一下
告诉我们需要做set_interactive_constraint_modes
set_interactive_constraint_modes
all_constraint_modes -active 此处需要记住
然后最后需要set_interactive_constraint_modes {},即修改后又设为默认值
(2.7)set_clock_uncertainty
可以理解为加margin的过程,在不同的阶段加的margin都不一样,此处了解即可
三。procs.tcl
这个脚本主要的作用就是
把所有的叫si的term(si_term)给Get出来。分别对它们:
(1)set inst_name
(2)set net_name
(3)把Instance的terminal 通过detachTerm的命令把连在一起的net给断掉
四。跑place_opt
执行place的命令就是place_opt_design
place_opt_design
-expanded_views 就是告诉工具不要做view的merge
-out_dir 就是告诉工具输出的path放在哪个地方
-prefix ”innovus_placeopt“
输入此命令。发现了有error。
在设计中有scan chain但是没有scan def。
这个error解决的办法:把scan的连接断掉再去跑,这里就需要讲到前文中提到的procs.tcl脚本了。
然后运行
报错
让source这个脚本,我们source一下
source成功,然后就可以再次运行palce_opt_design进行place了
五。查看place的过程中的一些log(不全部)
(5.1)User setting
一开始的log是User setting,这也是检查自己设置的一些方法。不管前面怎样设置,此处打印的值若和前面不一样,就是设置的有问题,没有吃进去。
(5.2)GigaPlace
就是innovus里面做place的引擎的名字
(5.3)early globalRoute
就是告诉我们early globalRoute时候每一层的length的信息和vai的信息
(5.4)initial timing的信息
六。运行后的Report
(6.1)report_analysis_summary -late
-late 代表是setup
我们此处不显示任何东西,因为没有violation,如果有violation,那么就会有信息
(6.2)reportGateCount
告诉我们这个Design的规模有多大,有多少cell,折合成Gate是多少,Area是多少等。