天天看点

逻辑综合——优化电路

对进行时序路径、工作环境、设计规则等进行约束完成之后,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

六、High-level optimization and datapath optimization

逻辑综合——优化电路
逻辑综合——优化电路

七、verifying functional equivalence

逻辑综合——优化电路

继续阅读