对进行时序路径、工作环境、设计规则等进行约束完成之后,DC就可以进行综合、优化时序了,DC在优化过程中主要的策略将在下面进行说明。然而,当普通模式下不能进行优化的,就需要我们进行编写脚本来改进DC的优化来达到时序要求。
DC进行优化的目的是权衡timing和area约束,满足用户对功能、时序和面积的要求。
DC优化有很多策略,包括对数据通道的优化,对状态机的优化,对布尔逻辑的优化等。
一、creating group path
默认情况下,DC根据不同的时钟划分path group。但如果设计中存在复杂的时钟,复杂的时序要求或者复杂的约束,用户可以将所关心的几条关键路径划分为一个path group,指定DC专注于改组路径的优化。也可以对不同的路径组设置不同的权重,权重值从0到100。
默认情况下,DC只优化关键路径,即负SLACK最差的路径,如果在关键路径附近指定一个范围,那么DC会优化指定范围内的路径。由于优化的路径越多,DC运行时间越长。一般范围设定为时钟周期的10%。
二、high-effort compile
high-effort compile能够让DC更加努力地达到所约束地目标,该措施在关键路径上进行重新综合,同时对关键路径周围地逻辑进行了restructure和remap。
high-effort指令有两种:
- compile ultra command:附带两个option,这两个option分别包含一些脚本,提供额外地时序和面积地优化。option为:area_high_effort_script option和timing_high_effort_script option。
- compile command:附带一个option,map_effort -high option。
High effort对关键路径地优化包括逻辑复制(Logic Duplication)和映射为大扇入的门单元(Mapping to Wide_Fanin Gates)。
此外,incremental指令也可以提高电路优化的性能。如果电路在compile之后不满足约束,通过incremental也许能够达到要求的结果。incremental指令只进行门级的优化,而不是逻辑功能级,会导致大量的计算时间,但是对于将最差的负slack减为0,这是最有效的办法。
为了在使用incremental指令时,减少DC的运算时间,可以将满足时序要求的模块设置为dont_touch属性。
dont_touch noncritical_blocks
对于有很多违例逻辑模块的设计,通常incremental最有效。
compile -map_effort high -incremental_mapping
三、gate-level optimizations
四、Automatic Ungrouping
Ungrouping 取消设计中的层次,移除层次的边界,并且允许DC Ultra通过减少逻辑级数改进时序,以及用过共享资源减小面积。常见指令如下:compile_ultra,compile -auto_ungroup。
compile会提供两种策略,包括:delay-based auto-ungrouping, area-based auto-ungrouping。
五、adaptive retiming
如果在逻辑综合过程中发现设计的流水线划分不平衡,就可以使用retiming策略,在时序路径上前后移动寄存器,以提高电路的时序性能。
由上图所示,retiming可能会对面积产生影响,则如果有违例的路径,则调整寄存器的位置;如果没有违例的路径,则可以用来减少寄存器的数量。
DC在移动寄存器的优化中,只能对有相同约束的寄存器进行调整,如果两个寄存器约束不同,则不能一起移动。移动后的寄存器在网表中的名字通常带有一个R的前缀和一个系列号。
retiming的策略不能和compile_ultra的以下option一起使用:-incremental -top -only_design_rule