优化(Optimization)
综合做的三件事:
- translate
- optimization
- mapping
optimization:
EDA工具在做综合过程中,在用户定义了constraint(PPA constraint)情况下,对设计进行优化,达到用户的目标。
工具做到的优化:
- 构架优化(Architectural Optimization)结构优化,从构架上来讲,对整个设计进行优化,使设计满足时序、面积要求。
- 门级优化(Gate-Level Optimization)在设计已经映射到工艺库上的情况下做优化。
构架优化(Architectural Optimization )
还没有真正映射到标准库单元上,在前期做优化。在代码级进行优化。 属于high level优化。
构架优化适用于 HDL 描述。它包括以下高级综合任务:
- 共享公共子运算器 :对子运算器进行共享。
- 共享资源
- 选择 DesignWare 实现 :工具会自己选择DesignWare优化时序面积。
- 重新排序运算符 (Reordering operators)
- 标识data path(算数运算)上的运算器,进行优化
举例:
子运算器共享 :
共享资源:
重新排序运算符
高级综合任务基于您的约束和您的 HDL 编码风格。经过高层优化后,电路功能由GTECH库部件表示,即通用的、技术独立的网表。
哪个命令执行构架优化?compile
时序逻辑映射(Sequential mapping)
时序逻辑映射阶段由两个步骤组成:
寄存器推断(register inferencing ):判断哪些cell是register,找出register
- 寄存器推断是将寄存器的 RTL 描述转换为与技术无关的表示过程(依据code 描述,转换为GTECH逻辑),称为 SEQGEN。 SEQGENs 是在elaboration过程中创建的。
技术映射(technology mapping):找出register,在工艺库中进行映射
- 技术映射是将 SEQGEN 映射到来自指定目标logic library的门的过程。它在使用 compile_ultra 或 compile 命令时执行。
多路复用器映射和优化(Multiplexer Mapping and Optimization)
Design Compiler 可以将 HDL 代码中表示多路复用器的组合逻辑直接映射到目标逻辑库中的单个多路复用器 (multiplexer,MUX) 或多路复用器单元树 。
多路复用器通常使用 if 和 case 语句建模。
为了实现这个逻辑,HDL Compiler 使用 SELECT_OP 逻辑单元或 MUX_OP 逻辑单元去实现功能。
Inferring SELECT_OPs
默认情况下,HDL Compiler 使用 SELECT_OP 组件来实现 if 和 case 语句隐含的条件操作。
根据设计约束,Design Compiler 使用逻辑库中的组合逻辑或多路复用器单元来实现 SELECT_OP。
Inferring MUX_OPs
如果您希望 Design Compiler 优先将 RTL 中的多路复用逻辑映射到逻辑库中的多路复用器或多路复用器树,则需要推断 MUX_OP 单元。
尽管 MUX_OP 单元提高了设计速度,但它们也可能增加面积。
设置 hdlin_infer_mux 为真。(让工具尽可能使用mux这种方式实现选择电路。)
如果不去限定这些mux的使用,会有什么影响?规定这些使用,对mux的影响。
一般情况,还好,写完代码之后不care用什么方式实现这些电路,
在有些情况下存在问题:
用与门或门搭建的功能,这些信号到达点的时序要求,在某一些情况下,两个信号相互作用,有可能会在某个地方,卡出小的glitch,出现一个功能上不希望出现的狭窄的pulse影响功能的稳定性甚至导致功能失败。
使用mux处理更容易避免glitch的产生。
在某些电路特别关心glitch的地方,推荐使用mux。
Gate-level optimization
cell映射到标准库单元之后的优化。
- Mapping
- Delay optimization
- Design rule fixing
- Area optimization
Delay Optimization
做完mapping之后,做延时优化,使得timing path满足时序要求。
以下策略可以帮助实现更快的设计:
- 使用 compile_ultra 命令沿关键路径自动取消层次结构的分组。 ungroup hierarchies,(ungroup等价于flatten),把某个逻辑层(代码中写入的)去掉。 对时序的帮助: design中有很多不同的逻辑层,每一个模块对应一个逻辑层。工具优化逻辑时,一个模块一个模块优化。不同逻辑层间的运算器没有办法共享。把层次flatten掉。 层次flatten掉的问题: (1) design中的模块逻辑清楚,全部flatten之后,没有端口、信号,很难找到design,无法区分是哪部分逻辑。如果想改一下netlist,找不到信号在哪里。 (2) 验证部门很难去验证。 如果要flatten某个层次,要和别人去商量一下
- 启用边界优化( boundary optimization)。
- 使用group_path 命令创建路径组。(每一个group分别做优化)
- 指定critical range,以便 Design Compiler 不仅优化 critical path ,而且优化 critical path 范围内的路径。(critical range指最差的延时向下多少范围内的violation要去修,进行优化)
- 在设计探索阶段,使用 set_cost_priority -delay 命令为延迟提供比设计规则更高的优先级。
边界优化(Boundary optimization)
创建路径组( Create path groups)
默认情况下,Design Compiler 根据控制endpoint的时钟对路径进行分组。
- 所有与时钟无关的路径都在默认路径组中。
创建路径组以将 Design Compiler 重点放在设计中的特定关键路径上。
prompt> group_path -na me group3 -from in3 -to FF1/D -weight 2.5
prompt> group_path -na me group2 -from in* -to FF1/D -weight 2.0
Critical range
当您向路径组添加临界范围时,您将maximum delay cost function 从最坏 negative slack更改为临界 negative slack。
Design Compiler 优化临界范围内的所有路径。
使用以下方法之一指定临界范围:
- 使用 group_path 命令的 -critical_range 选项。
- 使用set_critical_range 命令。
create_clock -period 20 clk
set_critical_range 3.0 $current_design
set_max_de1ay 10 {A B C}
group_path -name group1 -to {A B C}
设计规则修正( Design Rule Fixing)
供应商逻辑库中提供了设计规则,以确保产品符合规格并按预期工作。
- 用户可以通过 set_max_transtion/set_max_capacitance/set_max_fanout 提供更多的守恒约束。
通过插入缓冲区或调整现有单元的大小来纠正违反设计规则的行为。
- 不影响时序和面积结果。
Area optimization
尝试在不降低延迟成本的情况下最大限度地减少设计中的门数。
set_max_area
使用编译命令的 -map_effort 或 -area_effort 选项,您可以指示 Design Compiler 对区域优化进行 medium或 high effort。
- medium effort:Design Compiler 进行门尺寸调整、缓冲和反相器清理。
- high effort:Design Compiler 尝试更多的门最小化策略。该工具向流程添加了门组合,并分配了比 medium effort更多的 CPU 时间。
Power optimization
Design Compiler 尝试在不影响性能的情况下降低设计中的整体泄漏功率。
prompt> set_leakage_optimization true
prompt> set_dynamic_optimization true
dc_shell-topo> set_multi_vth_constraint \
-lvth_groups {lvt} \
-lvth_percentage percentage \
-type soft