综合优化策略介绍-Design Compiler(五)


系列学习介绍DC相关知识,包括ASIC基本单元相关,DC指令工艺库脚本相关,后端综合实现相关等总结。本节包括DC综合时的一些优化策略,内容有一些个人理解和各地方论坛总结学习,有不同认识欢迎探讨,fighting。

Synthesis Optimization Techniques

5.1 综合优化策略

level主要集中在gate_level,调用compilecompile_ultra

5.1.1 Boundary optimization边界优化

在编辑时,Design Compiler会对传输常数,没有连接的引脚和补码信息进行优化,也就是说边界优化会把边界引脚一些固定的电平,固定的逻辑进行优化。但是在formility(形式验证),需要告诉formility电路结构发生了改变。这个改变存放在DC的生成文件里。

img

 set_boundary_optimization<cells_designs> false #可设置某些cell不做边界优化
  compile_ultra -no_boundary  #批量设置不进行边界优化
5.1.2 Auto-ungrouping及其取消

compile默认不打散,compile_ultra会自动将模块打散,打散后只能看到top层和具体实现

set compile_ultre_ungroup_dw true ;#允许打散,取消desigware层次。也就是说,调用的一个加法器和一个乘法器,本来他们是以IP核的形式,或者说是以模块的形式进行综合的,但是设置了上面那么变量之后,综合后那个模块的界面就没有了

为了使设计的结果最优化,建议将compile_ultra命令和DesignWare library一起使用。也就是说不打散较好。

  set_ungroup <reference_or_cells> false  ;#禁止cell打散
  set_app_var compile_ultra_ungroup_dw false  ;#禁止打散,使用designware层次
  compile_ultra -no autoungroup ;#全部都不打散

论坛引用:全部ungroup打散后,没有boundary,一般功能是不会影响的,LEC来保证。但是function层次就没有了,比如对网表做一些verification,如STA时一些重要的点可能找不到了,如果还要debug的话几乎做不下去。

5.1.3 timing_high_effort_script

对时序做最好的优化,会把时序的优先级提升到超过DRC(Design Rule Check)的优先级,DRC是工艺厂商的要求,不满足DRC可能会出错。

compile_ultra -timing_high_effort_script
5.1.4 -timing 和 -retime
compile_ultra -timing #采用register replication的方法修复critical path时序
compile_ultra -retime #把时序不满足部分组合逻辑转移到有余量地方,前一级就得到很大的改善。后面的violation可以通过把时钟稍微往后挪一点来改善掉。
#Retiming的基本思想:这几种结构在功能和时序上是等效的
5.1.5 group_path划分原理

设计的时序路径分组,叫做path groups。默认每个时钟域对应一个path group,只有一个时钟情况下,划分为4个path_group:InputToReg、RegToReg、RegToOutput、InputToOutput

==DC综合时序优化,每个path group,先优化关键路径(即最差的时序路径),然后才会优化接下来最差的时序路径。==这也是为什么区分不同path_group,如果最差的时序路径不满足,其余也不会优化,但有时优化次差路径有利于最差路径优化。

关键路径找不到优化解决方案,就会报告时序违反;也就是说关键路径没有达到时序满足,不会优化其它违反的时序路径。

group_path -name INREG -from [all_inputs]
group_path -name REGOUT -to [all_outputs]
group_path -name INOUT -from [all_inputs] -to [all_outputs]
group_path -name CLK -critical_range 0.2 #相比于critical_path差0.2ns的路径都可以得到优化,数值设置不能超过时钟周期的10%,过多的话需优化路径过多,效果未必更好
group_path -name CLK -critical 0.2 -weight 5 #权重为5优先优化RegToReg
名词解释

TNS: total negative slack总的负时序时间之和,即小于0的slack之和

WNS: worst negative slack最差的负时序

THS: total hold slack总的保持时间的负时序之和

WHS: worst hold slack最差的保持时间的负时序

参考文档

【1】DC学习(8)综合与优化

【2】[求助]ungroup使用

【3】数字逻辑综合工具-DC-06——综合优化过程

【4】综合约束命令group_path的理解

【5】后端基础概念—TNS&WNS

【6】数字IC设计之综合工具Synopsys DC(3)

### DC中 `set_ungroup` 命令的用法与常见问题解析 #### 1. **`set_ungroup` 的基本功能** `set_ungroup` 是 Design Compiler (DC) 中用于控制设计分组行为的重要命令。它决定了在综合过程中是否允许对指定的模块或实例进行解组(即展开)。默认情况下,当使用 `compile_ultra` 或类似的高级综合流程时,DC 可能会自动解除某些层次结构以便更好地优化性能、面积与时序目标[^2]。然而,在许多场景下,用户希望保留特定模块的层次结构以简化后续分析或维护清晰的设计意图。 此命令的主要用途包括但不限于以下几点: - 明确指示哪些模块不应被解开; - 提供更精细的方式管理设计中的层次化特性; - 减少因过度展平带来的复杂度提升及资源消耗等问题。 #### 2. **基础语法及其组成部分详解** 下面展示了 `set_ungroup` 的典型调用格式以及各个参数的意义: ```tcl set_ungroup [selection_options] {true | false} ``` 其中, - **`[selection_options]`**: 此处指定了需要施加该属性的目标实体集合。可以基于名称匹配规则选取具体单元(cell),也可以利用通配符灵活定位多个候选者。 - `-hierarchy`: 如果存在嵌套情况,则递归处理整个树状结构内部节点。 - `-flatten`: 强制将选定内容彻底摊开成单一层面表示形式而不顾及其他因素限制条件。 - **`{true | false}`**: 设置标志位表明对待所选项目的操作倾向。“True”代表开放权限让其能够经历解散动作,“False”则反之加以保护阻止类似事件发生。 举例来说,如果我们不想让名为 “sub_mod_A” 和 “sub_mod_B” 的两个子模块遭到破坏重组的话,可以用这样的语句表达我们的意愿: ```tcl # 禁止 sub_mod_A 和 sub_mod_B 被解组 set_ungroup [list sub_mod_A sub_mod_B] false ``` 再看另一个例子,假设我们有一个较大的顶层模块叫做 'TOP' ,里面包含了若干低级组件构成复杂的网络拓扑图谱。此时我们可以采取如下措施确保整体架构稳定不受侵扰: ```tcl # 防止 TOP 下的所有直接下属成员单位遭遇拆散命运 set_ungroup [get_cells -hier -filter "ref_name=~*"] false TOP ``` #### 3. **实际应用场景讨论** ##### 场景一:避免关键路径上的敏感元件受到影响 有时候出于特殊考量,比如功耗预算分配严格或者噪声隔离需求强烈等原因,工程师们倾向于锁定住那些位于关键信号传输链路上的关键器件不让它们轻易改变形态位置等物理特征。这时就可以借助于 `set_ungroup` 达到目的。 例如,假设有几个触发器被认为是极其重要的同步机制载体,那么就应该像这样编写脚本来保障它们的安全性: ```tcl # 锁定 key_ff1 至 key_ff5 不受任何形式的重新编排影响 set_ungroup [get_cells {key_ff1 key_ff2 key_ff3 key_ff4 key_ff5}] false ``` ##### 场景二:维持现有IP核封装完整性 对于购买来的第三方知识产权(IP)核心而言,通常都经过精心打磨具备良好的鲁棒性和兼容性表现。因此一般都不建议对其内部细节做过多干预修改以防引入新的不确定性隐患。于是乎在此类场合之下运用 `set_ungroup` 成为了自然而然的选择之一。 举个简单的例子吧,假如项目当中集成了一个名叫 DSP_Core 的高性能数字信号处理器件作为算力支撑平台的一部分,那我们就应该这样做来捍卫它的原始面貌免遭损害: ```tcl # 维护 DSP_Core IP 核的初始状态不被篡改 set_ungroup [get_cells DSP_Core/*] false ``` #### 4. **注意事项及相关技巧分享** 虽然掌握了如何正确配置 `set_ungroup` 听起来很简单明了,但在真实世界里的大规模集成电路开发实践中还是有不少值得注意的地方值得大家铭记心中: - **一致性原则**:一旦确立某种策略就应贯穿始终贯彻到底,否则很容易因为中途反复调整导致最终成果难以预测甚至失败告终。 - **适度权衡取舍**:凡事皆有利弊两面性,过分执着于保持每一个细枝末节都会牺牲掉全局最优可能性;相反地放任不管也可能埋藏隐藏危机等待爆发时刻来临。所以找到那个恰如其分的位置至关重要。 另外值得一提的是还有几种关联密切的概念也经常会被提及并与之混淆不清,这里简单列举出来供大家区分记忆方便日后查阅参考: - **Auto Ungroup Preserve Constraints** : 自动解组期间关于保存约束方面的额外选项可供选择定制个性化偏好习惯[^3]. - **Compile Ultra No AutoUngroup Option** :另一种途径实现相同效果的方法就是直接通过附加参数告知工具不要执行自动化程度较高的解构工作流步骤[^2]. --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paul安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值