第十七课:DC优化技术

优化技术

  

优化技术的要求;注,所有下面的优化方法都是要在compile_ultra之前告诉工具的,等工具开始优化后再说已经来不及了!

Compile_Ultra默认信息

Compile_Ultra默认优化的三个层面:架构层优化逻辑/GTECH网表优化门级网表优化

目的是为了在满足时序约束的前提下使芯片面积最小,可以引入一些外部的高性能优化算法;

一般来说,采用关键路径重新综合(关键路径就是延时最大的路径)的方法,在第一次mapping后,会发现一些路径存在时序违规,对于这些违规的路径,DC会重新回到login/GTECH level优化,然后再进行二次mapping,不断重复,直到完成或者实在不行就会停止;

DesignWare Library

首先解释一下什么是Designware Library:按我的理解,就是EDA工具厂商在DC工具中预先建立了一个集成了众多IP模块及Datapath组件的合集,当我们导入Rtl coding后,工具会自动匹配应用一些Designware库中的算数组合逻辑/标准IP模块来满足设计要求;为什么呢?因为:

①这些模块拥有更好的"qor"及更快的设计;

②提高了生产效率及设计可复用性;

③降低了设计风险;

我们只要使用compile_ultra,工具会默认调用designware library;

Arithmetic Optimization算数优化

算数优化会自动匹配优化一些组合逻辑运算过程,优化时序,减小面积;如:

①自动将一串复杂的公式精简成最简;

②原式中的Z1和Z2存在公共部分,且需要四个加法器,经过优化后,提取出公共部分,则只需要三个加法器;

③合并同类项减少cell使用;

④使用一些减法器代替比较器,比如Z2其实就是Z1非;

⑤这里要说明一下,在DC中,常数乘法的运算是将常数分为多个2的次方相加的,如105=2^6+2^5+2^3+1,而在二进制中,一个数和2^n相乘,其实就是左移n位,所以out1就写成了上述的加法形式;同理,out2可以在out1的基础上再加上两个移位寄存器,这样可以达到面积最小化;

负载分割及组合逻辑复制

案例:经过组合逻辑到达一个4驱动与门后,由于与门的fanout太多,导致其中有一条路径延时非常大;

解决方法:工具会将该与门的fanout拆分成两部分,并再加一个与门来驱动;而同时,为了保证电路的功能不发生改变,前面的组合逻辑也必须要复制一份!这也是常用的用面积换时序/速度!

compile_ultra自带参数优化方法

边界优化

Boundary optimization边界优化,就是优化每个模块的边界input/output ports;如上,SUB2模块中,左边两个输入pin,如果上面一个接低,那么U2或门就可以省去了;下面一个接高,U3与门也可以省去了;后面的output port是没有接的,因此也可以省去;而SUB1的Q输出经过U1反相器,可以直接优化为从Q非输出;所以上述电路可以简化为下面的电路,优化了时序,降低了面积;但是,这种边界优化是会影响网表结构的!!!

再compile_ultra中,是默认开启边界优化的,如果我们对于某个模块想保留一些input/output ports,或者说该模块为公用模块/或者以后有ECO需求,可能会用到一些接口那就可以针对性的关闭该模块的边界优化,如:”set_boundary_optimization <SUB2> false“;如果全局都不想打开边界优化,就直接”compile_ultra - no_boundary”全局关闭;

Auto-ungrouping

Ungrouping就是工具会在综合时,会根据不同模块间一些组合逻辑的连接特点,而把模块打散,从而优化时序,缩小面积;

如上图,SUB2与SUB3直接的两个两输入与门,经过优化后就被优化成一个三输入与门,时序和面积都得到优化,而由于原来的两个两输入与门合并到一起了,所以SUB2和SUB3就被打散开了,就没有这两个模块了;

再如,SUB4的FF2触发器是一个带反馈控制功能的触发器,输入1时输出1,输入0时保持不变,就相当于带了一个使能端;工具会在Designware lib中自动匹配到这样的一个带使能的触发器结构,从而简化结构面积,时序也更好;

但和边界优化类似,这种优化是会影响网表物理结构的,compile_ultra是默认自动打开ungroup的,我们可以选择手动关闭,可以只关闭某个磨快的,也可以单独关闭designware lib的,当然也可以全局关闭;

Timing-Focused optimization时序高性能优化

一般工具是默认关闭的,如果我们的时序比较容易满足,就可以不打开timing high effort优化;如果时序一直有问题,可以打开有高性能优化;

打开以后,工具会使用一些高性能算法进一步优化,将允许寄存器的复制,且会将优化优先级提高至DRC之上,同时也会消耗更多的综合时间;

Register replication

寄存器复制:如图所示,意思就是当某个寄存器后面的fanout太多时,允许工具自动复制控制寄存器的个数,从而降低每个控制寄存器的fanout,就和前面说的负载分割及组合逻辑复制类似;

Adaptive Retiming:局部自适应重新调整时序

Adaptive Retiming:局部自适应重新调整时序;重要!

我们简单看一下,上面的路径前面具有-0.12ns的时序违规,后面有+0.07ns的余量,那么可不可以二者相互缓解一下呢?是可以的,我们需要手动打开工具的-retime功能;

分析:在逻辑上看,先与再打一拍和先打一拍再与的功能是完全一致的;因此,打开adaptive retiming后,工具会自己把上述关键路径时序违规的局部器件位置变换,以解决关键路径时序违规需求;

通过adaptive retiming功能,再保证局部功能不变的前提下,可以进行寄存器位置的移动、分割及合并,从而改变在局部改变关键路径时序违规;

①由于adaptive retiming是局部的重新调整时序,所以是难以考虑全局的delay balance的;

②被移动的寄存器会被重命名为”R_##”,如果想知道工具有没有进行retiming,可以在svf文件中查看有没有这种重命名的寄存器;

③如果不想用adaptive retiming,可以用上述命令关闭;

Path Group

Path Group:默认的,工具会根据每个path的End point后面所接的寄存器时钟信号来分组,如果整个design只有一个时钟,那就只有一组path group;

Path group的命名一般以时钟名来,如上图,path1 & path4后面跟的寄存器接的时钟都是CLK2,所以这两个path都属于CLK2 group;其他同理;

分好group后,DC会对轮流对每个group中的关键时序路径(最差的时序路径)进行优化;

次关键路径问题

但也存在上述的问题:

当工具对关键路径进行充分优化后,仍不能满足时序要求,此时工具就会停止优化;但这时,会有部分次关键路径sub-critical path没有得到任何的优化而被忽视,这是因为工具认为没有必要进行优化了,反正有更差的存在;

FF1-FF2路径优化忽略问题

假设模块中只有一个时钟,那么默认就只有一组path group;我们在设置input/output delay时,难免对有些端口设置的过于悲观(这是常有的事),从而就会导致这些端口就会成为该path group中的关键路径,工具在优化时就会专注于优化该关键路径,却忽视了该path group中最重要的FF1-FF2寄存器之间的路径优化;怎么办呢?见下图;

解决方案:User-defined path group

解决方法就是进行用户自定义path group,比如上图将input path分为一组,output path分为一组,FF1-FF2的path分为一组,COMB path分为一组;这样工具在进行path group优化时,会轮流对每个group中的关键路径分别进行优化,而不会影响到其他的group;

创建User-defined group

利用group_path 命令给不同path进行人为分组,记得加上命名;如上图,就定义了三个path group,注意”-from“及”-to”的使用;上述三个group中,COMBO group中肯定会包含部分的INPUTS group中的path,后面的group会覆盖前面的;比如:假设INPUTS group中含100个path,COMBO group中含有INPUTS group中的30个,那么这30个重复的就会划归到COMBO group中,INPUTS group中就变成70 path了。

上面只定义了三组group path,那么FF1-FF2的path怎么定义呢?其实,工具默认的CLK group path就是包含所有的path,然后我们后面又自己定义了三个group,那么根据后面的会覆盖前面的,相当于CLK group path中剩下path的就是FF1-FF2的path了,不用再定义了。

这样工具就会对每个group中最差的路径单独进行优化,就可以避免前面说的两个问题。

设置关键路径延时范围

设置好path group后,最好再设置一个关键路径的延时范围,一般工具默认范围为0,我们可以设置成10%周期,这样即使关键路径优化不下去了,那么在该范围内的次关键路径也都会被优化到;

设置group优化权重

我们还可以对不同的group设置优化权重,比如我们最关心的其实是FF1-FF2 path的优化,所以可以给CLK group path的权重设置到5(默认都是1);

当然,如果有某个单独的path,我们想特别的优化,那么可以把该path单独设置成一个group,然后再把该group的权重加大;

优化权重举例

如上图,当给不同的path group设置不同的权重时,工具会给权重高group更高的优化优先级,此处给FF1--FF2 CLK path group设置了最高的优先级,我们知道,Tsetup时间是影响前一级的,而Tclk则是影响后一级的时序,当大家的优先级都是默认1时,工具在工艺库中选择寄存器时,会给FF1寄存器匹配一个比较慢的寄存器(Tsetup小,Tclk大)来均衡前后两边的时序,这就导致CLK path group存在-0.1ns的时序违规;而当我们把CLK group优先级设置为5时,工具会给FF1寄存器匹配一个比较快的cell(Tsetup大,Tclk小),这样的话会优先保证CLK group满足时序要求(-0.1→0.0ns),即使前一级的时序变得更worse(-0.4→-0.6ns);

Pipeline stage多级流水线设计

人工改代码实现

当我们在对比较复杂的path进行优化时,如上图,若某条path的延时很大,可以人为在RTL coding中加入多级流水线设计(上图将先打一拍再与换成了先与再打一拍);但需要注意的是,在加入多级流水线时,对于有些路径,即使中间没有cell,也要加入相应的寄存器,否则就改变了电路结构了;

在人工改代码加入了pipeline 设计后,如果某些路径仍然存在时序违规,该怎么办呢?

工具自动插入实现

Pipeline/Register Retiming

Pipeline/Register Retiming: 多级流水线重新调整时序,与adaptive retiming类似,也是通过移动/合并/拆分寄存器来实现的;但不同的是,register retiming 是作用在整个纯的流水线design 模块当中的,中间不能有任何的控制部分;adaptive retiming则可以作用在非流水线设计的寄存器部分;二者可以同时并行使用;

当我们打开了register retiming后,工具就可以自动将后面的三拍作为多级流水线设计而加入到前面的复杂组合逻辑中,而不用人为修改rtl代码,这种工具自动插入的流水线位置会非常精确均匀,人工改代码是难以实现的;就像前面的,人工插入流水线后,第一级流水线还是有很大的违规,但第二/三级流水线又有较大余量,工具在自动插入时,会把乘法器部分均匀一下,因为乘法器在物理上就是很多的cell组成的,工具可以将部分cell放在第一级register前面,而将另一部分cell移到第一级register后面,从而达到均匀分配时序的目的,人工修改rtl coding是无法做到这样的;

注意事项

我们一般在实际操作时,通常最后一个寄存器是作为output的,为了不影响其他模块的时序,对最后一个寄存器是不进行register retiming的,可以通过上述命令告诉工具不要动最后一个寄存器;

多线程优化

compile_ultra是支持多线程技术的,我们可以设置多个core来同时对一个模块的不同部分进行优化,以提高优化效率;

综合报告

在进行完compile_ultra后,就可以让工具报告所有的约束违规,包括时序约束/环境约束/DRC等都会报出来,主要就是时序违规;如果没有违规,就不需要再分析优化了,如果有时序违规,可以通过report_timing报告存在时序违规的具体path信息再去分析;

进一步综合

一般我们进行综合优化的步骤是分两步的:

首先,进行一次优化,得到一些关键路径时序违规,然后,单独把这些关键路径拉出来分组,再给这些path group加权重,然后在前面一次优化的基础上,根据新加的条件再对这些关键路径进一步优化,用”-incremental”命令;

方法用尽-无奈之举

当我们用了所有的办法后,仍然存在不可接受的时序/DRC违规,那么只有两种办法了:

①修改某些位置的约束,然后重新综合;

②修改RTL代码;

compile_ultra优化总结

优化前,可以用上述一些优化命令;

第一次优化后,可以查看报告找到关键路径,再进行二次优化;

时序报告分析

在我们运行report_timing命令后,DC工具会执行自己的STA静态时序分析功能,这时会把这个设计模块细分为每条单独的时序路径,工具会对每条路径单周期至少分析两次(一次0→1,一次1→0,因为不同的跳变延时是不一样的);

一般来说,DC工具的STA分析只包含了Tsetup时序的分析,同时会给出每个path group中最worse的那条路径,没有Thold/DRC/Area;

举个简单例子:通过上述两个串联的反相器,最大延时是多少?

显然,由于两个反相器串联,那么肯定有一个信号是0→1跳变,另一个则是1→0,故最大的延时就是0.5+1.5=2;

第一部分:Path information

我们得到的时序报告第一部分内容,说明了一些基本信息,目标库,然后就是对该path的信息描述,起点是data1 input port,终点是XYZ_reg(该寄存器由clk上升沿触发),表明这是一个从input port到寄存器的path,如果该path被人为自定义分组的话,应该属于input path group,显然这里没有没有自定义,所有的path都属于默认的clk group;

第二部分:Path Delay

时序报告第二部分内容,会列出该路径从clk 0时刻开始,经过latency(不影响时序,打个比方,前一个时钟周期存在这个延时,后一个周期也存在,大家都加了,就不影响了)及人为设置的input delay后,到达起点data1,在data1中经过Tck后,经过一系列组合逻辑,到达终点寄存器所经过的每一步所消耗的时间,左边一列是每一步的单独时间,右边一列是加起来的总时间;”*“表示中间经过的net+cell delay,"f/r"=fall/rise。前面说过,工具会给每条path计算两次(一次0→1,一次1→0),最终工具会报出最worse的那条path;

第三部分:Path Requied

时序报告第三部分内容,会给出时钟周期,加上latency后,减去uncert & Tsetup,就得到最后必须满足的时序要求;”-“表示该处需要消耗时间,会使时间更worse;由图可知,该path最大允许的delay是2.17ns>2.15,故该path满足时序要求;

Timing Report常用命令

report_timing后面一般常用的命令选项;讲一下”-nworet”与”-max_paths“之间的区别:

”-nworet”表示对于同一个Endpoint,允许报的最worse path的数目,默认为1,可人为修改;

”-max_paths“表示允许报的最worse的path数目,默认为1,可人为修改;

上述问题解答:

①slack=-0.3那条;

②slack=-0.3那条;

③slack=-0.3 & slack=-0.15两条,因为这时的”-nworet默认为1”,同一个endpoint只能报一条,那么另一条只能从另一个endpoint里面选一个最worse的;

④slack=-0.3 & slack=-0.25两条;

优化流程建议

首先,利用report_constraint -all violators命令,可以列出所有的时序违规,但只是列出来每条路径的概括,不具体;再此我们可以看到,以coeff_reg寄存器为endpoint的slack均比较大,而mul_reg结尾的则比较小,表明以coeff_reg寄存器结尾的相关path上肯定有一些问题;

然后,我们利用report_timing,具体把两条路径都列出来(列出以mul_reg结尾的路径只能加附加选项,因为默认只报最worse的那条),我们可以发现,左边的是input--FF path,右边是FF1--FF2 path,而左边过大的slack显然与我们设置了过于悲观的input delay相关,而由于此处并未对path进行分组,导致FF1--FF2路径跟本没有得到DC的优化(因为不是最关键路径);

最后,将input path从clk path中剔除,着重优化我们关心的FF1--FF2 path,进行二次优化;

  • 6
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值