news 2026/9/9 15:14:59

Design Compiler:解组(Ungroup)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Design Compiler:解组(Ungroup)

相关阅读

Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm=1001.2014.3001.5482


解组(Ungroup)指的是指将某一层级中的子设计(或者说模块)合并到其父设计中,通常在当前设计的层次划分不合理导致优化受限时使用,如图1所示。

图1 解组的示意图

解组可以分为两类,一类是用户显式指定的,而另一类是由Design Compiler自动进行的,下面将分别进行讨论。

发生解组的情况

显式解组

ungroup命令

使用ungroup命令可以直接进行解组,下面展示了该命令的一些基本使用方式。

1、假设存在顶层设计top和middle设计,顶层设计中middle设计例化为u_middle单元,使用ungroup命令即可对层次单元u_middle进行解组,由于Design Compiler发现middle设计此时没有被其他设计例化了,因此其被删除(该行为可通过ungroup_keep_original_design变量控制,默认值为false),被解组的层次单元中的对象,在解组后将属于顶层设计,对象名字会添加层次路径前缀,但需要注意的是此时"/"不再是层次分隔符,而是对象名字的一部分。

dc_shell> list_designs middle top (*) dc_shell> get_cells {u_middle} dc_shell> ungroup [get_cells u_middle] dc_shell> list_designs top (*) dc_shell> get_cells; # get_cells命令默认返回当前实例中的单元(不包括跨层次单元) {u_middle/sum_reg u_middle/U1}

2、假设存在顶层设计top和middle设计,顶层设计中middle设计例化为u_middle单元,使用ungroup命令配合-prefix选项可以指定解组后,被解组的层次单元中的对象的前缀。

dc_shell> ungroup [get_cells u_middle] -prefix "TEST:" dc_shell> get_cells {TEST:sum_reg TEST:U1}

3、假设存在顶层设计top、middle设计和bottom设计,顶层设计中middle设计例化为u_middle单元,middle设计中bottom设计例化为u_bottom单元,使用ungroup命令即可对层次单元u_middle进行解组,但需要注意的是解组默认是不递归的,使用-flatten可选项可以递归解组。

dc_shell> ungroup [get_cells u_middle] dc_shell> get_cells {u_middle/u_bottom}
dc_shell> ungroup [get_cells u_middle] -flatten dc_shell> get_cells {u_middle/u_bottom/sum_reg u_middle/u_bottom/U1}

4、假设存在顶层设计top、middle设计和bottom设计,顶层设计中middle设计例化为u_middle单元,middle设计中bottom设计例化为u_bottom单元,使用ungroup命令配合-start_level选项表示对指定层次单元下的第几层递归解组(隐含-flatten选项),若为1则相当于对该层次单元递归解组。

dc_shell> ungroup [get_cells u_middle] -start_level 1 dc_shell> get_cells {u_middle/u_bottom/sum_reg u_middle/u_bottom/U1}
dc_shell> ungroup [get_cells u_middle] -start_level 2 dc_shell> get_cells {u_middle}
dc_shell> ungroup [get_cells u_middle/u_bottom] -start_level 1 dc_shell> get_cells {u_middle}

5、假设存在顶层设计top、middle设计和bottom设计,顶层设计中middle设计例化为u_middle1单元和u_middle2单元,middle设计中bottom设计例化为u_bottom单元,无法使用ungroup命令对层次单元u_bottom进行解组,因为其父设计不是唯一的(解组需要对middle设计进行处理,但middle设计在其他地方也被例化了)。

dc_shell> ungroup [get_cells u_middle1/u_bottom] Error: Cannot perform ungroup on the instance u_middle1/u_bottom because parent is not a unique instantiation of design middle. Please rerun the command after uniquifying the instance. (UID-379)
set_ungroup命令

使用set_ungroup命令可以设置层次单元的ungroup属性,该属性为true的层次单元将在综合时被解组,下面展示了该命令的基本使用方式。

假设存在顶层设计top和middle设计,顶层设计中middle设计例化为u_middle单元,使用set_ungroup命令设置u_middle单元的ungroup属性为true后使用compile命令进行综合即可对层次单元u_middle进行解组,被解组的层次单元中的对象,在解组后将属于顶层设计,对于层次单元时序单元,对象名字会添加层次路径前缀,但需要注意的是此时"/"不再是层次分隔符,而是对象名字的一部分,对于其他对象可能进行重命名(注意这与ungroup命令的区别,该条适用于除ungroup命令外的其他解组)。

dc_shell> set_ungroup [get_cells u_middle] true dc_shell> compile dc_shell> get_cells {u_middle/sum_reg U1}
compile命令

使用compile命令进行综合时添加-ungroup_all选项可以递归解组当前设计中的所有层次单元,下面展示了该命令的基本使用方式。

dc_shell> compile -ungroup_all; # 解组效果相当于ungroup -all -flatten dc_shell> get_cells {u_middle/sum_reg U1}

自动解组

compile命令

使用compile命令进行综合时添加-auto_ungroup delay/area选项可以根据时序/面积对当前设计内层次单元进行自动解组。

如果选择根据时序自动解组,Design Compiler将使用一种智能解组策略,旨在提升设计的整体时序性能,该策略选择最有可能从解组中获益的层级结构,重点优化包含关键路径或在后续优化步骤中可能变为关键路径的层级,下面展示了该命令的基本使用方式。

dc_shell> compile -auto_ungroup delay dc_shell> get_cells {u_middle} # 由于不存在关键路径,解组不发生

如果选择根据面积自动解组,Design Compiler将取对设计中面积较小的模块进行解组,以提升面积优化效果,对设计的时序影响较小。compile_auto_ungroup_count_leaf_cells变量(默认值为false)用于指定计算面积时是否只统计叶单元,下面展示了该命令的基本使用方式。

dc_shell> compile -auto_ungroup area dc_shell> get_cells {u_middle/sum_reg U1}
compile_ultra命令

使用compile_ultra命令进行综合时可以根据时序、面积和结果质量对当前设计内层次单元进行自动解组。

在初始映射阶段前,Design Compiler会执行基于面积的解组,工具会根据GTECH估算尚未映射的层级面积(这与compile命令根据面积的自动解组不同,后者发生在门级优化阶段),删除面积较小的模块,目的是提升时序和面积优化的结果质量(QoR)。由于此过程发生在优化早期,优化上下文更完整。此外,还会启用跨层级的数据路径提取,从而进一步改善时序和面积。

在时序优化阶段,Design Compiler会对关键路径上的层级结构执行解组,主要用于时序性能的优化。

使用compile_ultra命令添加-spg选项时,Design Compiler会取消更多层级结构,以提升结果质量(QoR)。

下面展示了该命令的基本使用方式。

dc_shell> compile_ultra dc_shell> get_cells {u_middle/sum_reg U1}
balance_registers命令(已过时)

balance_registers命令曾经被用来对设计进行重定时优化(Retiming),在移动时序单元前,该命令会对解组当前设计,在此不进行详细介绍。

报告自动解组分组的层级

可使用report_ungroup命令报告哪些层级在综合过程中被自动解组(不适用于ungroup命令),哪些因限制未被解组,下面展示了该命令的基本使用方式。

dc_shell> compile_ultra dc_shell> report_ungroup **************************************** Report : report_ungroup Design : top Version: W-2024.09-SP2 Date : Fri Jun 13 23:47:59 2025 **************************************** Descriptions of reasons for ungrouping and preserving hierarchy AU - Cell is ungrouped due to auto_ungrouping SAU - Cell has user set_autoungroup_options settings UU - Cell has user specific set_ungroup true command UP - Cell has user specific set_ungroup false command BO - Cell has boundary optimization restriction MUX - Cell has mux no-ungroup restriction UPF - Cell has upf no-ungroup restriction DFT - Cell has dft no-ungroup restriction DT - Cell has dont_touch attribute TC - Cell has timing constraints OTH - Cell has other kind of restrictions ============================================================================== | | No.of | | | | | leaf | | | | Cell Name | cells | Status | Reason | ============================================================================== | u_middle | 2 | ungrouped | AU | ============================================================================== =============================================== | Hierarchy | Count | =============================================== | user removed hierarchies | 0 | | auto ungrouped hierarchies | 1 | | user preserved hierarchies | 0 | =============================================== ****************************************

不发生解组的情况

有些情况下解组不会发生,下面将对此进行列举(假设存在顶层设计top和middle设计,顶层设计中middle设计例化为u_middle单元)。

显式解组

ungroup命令

当层次单元设置了dont_touch属性时,其不能使用ungroup命令解组(除非指定了-force选项),如下所示。

dc_shell> set_dont_touch [get_cells u_middle] dc_shell> ungroup [get_cells u_middle] Warning: All specified hierarchical cells are don't touched. No cells can be ungrouped. (UID-230) dc_shell> ungroup -force [get_cells u_middle] dc_shell> get_cells {u_middle/sum_reg u_middle/U1}
set_ungroup命令

当使用set_ungroup命令设置层次单元的ungroup属性为true,但又设置了dont_touch属性时,综合时无法解组,如下所示。

​dc_shell> set_dont_touch [get_cells u_middle] ​dc_shell> set_ungroup [get_cells u_middle] dc_shell> compile dc_shell> get_cells {u_middle}
compile命令

1、当层次单元设置了dont_touch属性时,使用compile命令进行综合时添加-ungroup_all选项无法解组,如下所示。

​dc_shell> set_dont_touch [get_cells u_middle] dc_shell> compile -ungroup_all dc_shell> get_cells {u_middle}

2、当使用set_ungroup命令设置层次单元的ungroup属性为false时,使用compile命令进行综合时添加-ungroup_all选项无法解组,如下所示。

​dc_shell> set_ungroup [get_cells u_middle] false dc_shell> compile -ungroup_all dc_shell> get_cells {u_middle}

自动解组

compile命令

如果选择根据时序自动解组

1、当不存在关键路径时,解组不发生使用compile命令进行综合时添加-auto_ungroup delay选项无法解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true),如下所示。

dc_shell> compile -auto_ungroup delay; # 没有设置时序约束 dc_shell> get_cells {u_middle} dc_shell> set_ungroup [get_cells u_middle] true dc_shell> compile -auto_ungroup delay {u_middle/sum_reg u_middle/U1}

2、当层次单元设置了dont_touch属性时,使用compile命令进行综合时添加-auto_ungroup delay选项无法解组,如下所示。

​dc_shell> set_dont_touch [get_cells u_middle] dc_shell> compile -auto_ungroup delay dc_shell> get_cells {u_middle}

3、当使用set_ungroup命令设置层次单元的ungroup属性为false时,使用compile命令进行综合时添加-auto_ungroup delay选项无法解组,如下所示。

​dc_shell> set_ungroup [get_cells u_middle] false dc_shell> compile -auto_ungroup delay dc_shell> get_cells {u_middle}

4、当使用set_boundary_optimization命令禁止层次单元的边界优化时,使用compile命令进行综合时添加-auto_ungroup delay选项无法解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true,或是综合时添加-ungroup_all选项),如下所示。

​dc_shell> set_boundary_optimization [get_cells u_middle] false dc_shell> compile -auto_ungroup delay dc_shell> get_cells {u_middle} dc_shell> set_ungroup [get_cells u_middle] true; # 或者compile -auto_ungroup delay -ungroup_all dc_shell> compile -auto_ungroup delay {u_middle/sum_reg u_middle/U1}

5、在非拓扑模式下,当层次单元的线负载模型与其父设计的线负载模型不同时,使用compile命令进行综合时添加-auto_ungroup delay选项无法解组(除非设置compile_auto_ungroup_override_wlm变量为true,或是使用set_ungroup命令设置层次单元的ungroup属性为true,或是综合时添加-ungroup_all选项),如下所示。

​dc_shell> set_wire_load_mode enclosed; # 指定下层设计使用自己的线负载模型 dc_shell> set_wire_load_model -name tsmc090_wl20 [current_design] dc_shell> set_wire_load_model -name tsmc090_wl10 [get_cells u_middle] dc_shell> compile -auto_ungroup delay dc_shell> get_cells {u_middle} dc_shell> set_app_var compile_auto_ungroup_override_wlm true; # 或者set_ungroup [get_cells u_middle] true 或者compile -auto_ungroup delay -ungroup_all dc_shell> compile -auto_ungroup delay {u_middle/sum_reg u_middle/U1}

6、当使用set_optimize_registers命令设置层次单元进行重定时,使用compile命令进行综合时添加-auto_ungroup delay选项无法解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true,或是综合时添加-ungroup_all选项),如下所示。

​dc_shell> set_optimize_registers -designs [get_designs middle_module] dc_shell> compile -auto_ungroup delay dc_shell> get_cells {u_middle} dc_shell> set_ungroup [get_cells u_middle] delay; # 或者compile -auto_ungroup delay -ungroup_all dc_shell> compile -auto_ungroup area {u_middle/sum_reg u_middle/U1}

如果选择根据面积自动解组

1、当层次单元设置了dont_touch属性时,使用compile命令进行综合时添加-auto_ungroup area选项无法解组,如下所示。

​dc_shell> set_dont_touch [get_cells u_middle] dc_shell> compile -auto_ungroup area dc_shell> get_cells {u_middle}

2、当使用set_ungroup命令设置层次单元的ungroup属性为false时,使用compile命令进行综合时添加-auto_ungroup area选项无法解组,如下所示。

​dc_shell> set_ungroup [get_cells u_middle] false dc_shell> compile -auto_ungroup area dc_shell> get_cells {u_middle}

3、当使用set_boundary_optimization命令禁止层次单元的边界优化时,使用compile命令进行综合时添加-auto_ungroup area选项无法解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true,或是综合时添加-ungroup_all选项),如下所示。

​dc_shell> set_boundary_optimization [get_cells u_middle] false dc_shell> compile -auto_ungroup area dc_shell> get_cells {u_middle} dc_shell> set_ungroup [get_cells u_middle] true; # 或者compile -auto_ungroup area -ungroup_all dc_shell> compile -auto_ungroup area {u_middle/sum_reg u_middle/U1}

4、在非拓扑模式下,当层次单元的线负载模型与其父设计的线负载模型不同时,使用compile命令进行综合时添加-auto_ungroup area选项无法解组(除非设置compile_auto_ungroup_override_wlm变量为true,或是使用set_ungroup命令设置层次单元的ungroup属性为true,或是综合时添加-ungroup_all选项),如下所示。

​dc_shell> set_wire_load_mode enclosed; # 指定下层设计使用自己的线负载模型 dc_shell> set_wire_load_model -name tsmc090_wl20 [current_design] dc_shell> set_wire_load_model -name tsmc090_wl10 [get_cells u_middle] dc_shell> compile -auto_ungroup area dc_shell> get_cells {u_middle} dc_shell> set_app_var compile_auto_ungroup_override_wlm true; # 或者set_ungroup [get_cells u_middle] true 或者compile -auto_ungroup area -ungroup_all dc_shell> compile -auto_ungroup area {u_middle/sum_reg u_middle/U1}

5、 当层次单元的子单元数量超过compile_auto_ungroup_area_num_cells变量时,使用compile命令进行综合时添加-auto_ungroup area选项无法解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true,或是综合时添加-ungroup_all选项),如下所示。

dc_shell> set_app_var compile_auto_ungroup_area_num_cells 1 dc_shell> compile -auto_ungroup area dc_shell> get_cells {u_middle} dc_shell> set_app_var compile_auto_ungroup_area_num_cells 20; # 或者set_ungroup [get_cells u_middle] true 或者compile -auto_ungroup area -ungroup_all dc_shell> compile -auto_ungroup area {u_middle/sum_reg u_middle/U1}

6、当使用set_optimize_registers命令设置层次单元进行重定时,使用compile命令进行综合时添加-auto_ungroup area选项无法解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true,或是综合时添加-ungroup_all选项),如下所示。

​dc_shell> set_optimize_registers -designs [get_designs middle_module] dc_shell> compile -auto_ungroup area dc_shell> get_cells {u_middle} dc_shell> set_ungroup [get_cells u_middle] true; # 或者compile -auto_ungroup area -ungroup_all dc_shell> compile -auto_ungroup area {u_middle/sum_reg u_middle/U1}
compile_ultra命令

1、当层次单元设置了dont_touch属性时,使用compile_ultra命令进行综合时无法自动解组,如下所示。

​dc_shell> set_dont_touch [get_cells u_middle] dc_shell> compile_ultra dc_shell> get_cells {u_middle}

2、当使用set_ungroup命令设置层次单元的ungroup属性为false时,使用compile_ultra命令进行综合时无法自动解组,如下所示。

​dc_shell> set_ungroup [get_cells u_middle] false dc_shell> compile_ultra dc_shell> get_cells {u_middle}

3、当使用set_boundary_optimization命令禁止层次单元的边界优化时,使用compile_ultra命令进行综合时无法自动解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true),如下所示。

​dc_shell> set_boundary_optimization [get_cells u_middle] false dc_shell> compile_ultra dc_shell> get_cells {u_middle} dc_shell> set_ungroup [get_cells u_middle] true dc_shell> compile_ultra {u_middle/sum_reg u_middle/U1}

4、在非拓扑模式下,当层次单元的线负载模型与其父设计的线负载模型不同时,使用compile_ultra命令进行综合时无法自动解组(设置compile_auto_ungroup_override_wlm变量为true也无法影响对compile_ultra命令,使用set_ungroup命令设置层次单元的ungroup属性为true可以),如下所示。

​dc_shell> set_wire_load_mode enclosed; # 指定下层设计使用自己的线负载模型 dc_shell> set_wire_load_model -name tsmc090_wl20 [current_design] dc_shell> set_wire_load_model -name tsmc090_wl10 [get_cells u_middle] dc_shell> compile_ultra dc_shell> get_cells {u_middle} dc_shell> set_app_var compile_auto_ungroup_override_wlm true; # 或者set_ungroup [get_cells u_middle] true dc_shell> compile_ultra {u_middle}

5、当使用compile_ultra命令进行综合时添加-no_autoungroup选项无法自动解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true),如下所示。

dc_shell> compile_ultra -no_autoungroup dc_shell> get_cells {u_middle} dc_shell> set_ungroup [get_cells u_middle] true dc_shell> compile_ultra -no_autoungroup {u_middle/sum_reg u_middle/U1}

6、当使用compile_ultra命令进行综合时添加-no_boundary_optimization选项无法自动解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true),如果使用该选项,-no_autoungroup选项会自动设置,如下所示。

dc_shell> compile_ultra -no_boundary_optimization dc_shell> get_cells {u_middle} dc_shell> set_ungroup [get_cells u_middle] true dc_shell> compile_ultra -no_boundary_optimization {u_middle/sum_reg u_middle/U1}

7、 当使用set_optimize_registers命令设置层次单元进行重定时,使用compile_ultra命令进行综合时无法自动解组(除非使用set_ungroup命令设置层次单元的ungroup属性为true),如下所示。

​dc_shell> set_optimize_registers -designs [get_designs middle_module] dc_shell> compile_ultra dc_shell> get_cells {u_middle} dc_shell> set_ungroup [get_cells u_middle] true dc_shell> compile_ultra {u_middle/sum_reg u_middle/U1}

门控时钟单元

power_cg_flatten变量(默认值为false)用于控制在执行ungroup、compile -ungroup_all、compile_ultra、balance_registers命令(已过时)等可能引起解组的操作时,是否允许将门控时钟单元(包括包括Latch-Free和Latch-Based在内的离散门控单元和集成门控单元(ICG))所在层次解组。

保留这一层次具有重要意义,因为Power Compiler的门控时钟单元的识别、报告、移除、重连以及部分布局优化功能都依赖完整的时钟门控结构和相关属性,同时在综合前过早打散离散门控单元还可能导致工具无法将其正确映射为集成门控单元。集成门控单元所在层次的解组通常不会带来太大影响,但仅建议在综合后进行解组。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 15:13:31

栈溢出入门实战:从jarvisoj_level2学会ret2text与返回地址覆盖

得,看到这个标题,老pwn手应该都懂——又一道经典的栈溢出入门题。BUUCTF上的jarvisoj_level2,属于那种你刷完一遍之后,会把整个ret2text和ret2shellcode的底层逻辑都彻底理顺的题目。如果你刚开始接触PWN,第一次打开这…

作者头像 李华
网站建设 2026/9/9 15:13:14

连续-离散耦合模拟SHPB岩石动态破裂:FLAC-PFC建模与参数标定全流程

做岩石动力学试验的人应该都有这种感觉:真实试件里的裂纹是怎么起裂、怎么扩展、又是在哪个应力水平下突然碎成几块的,光靠实验曲线只能猜个大概。尤其SHPB这类冲击试验,加载时间只有几十到几百微秒,高速相机能拍到宏观破碎过程&a…

作者头像 李华
网站建设 2026/9/9 15:13:03

SQL Server附加失败?MDF还在数据就还在:三大修复路线实战

接手任何一个“数据库迁移后附加失败”的问题,很多人的第一反应都是先慌一会儿:服务器换了、报错看不懂、数据库挂在“正在恢复”或者直接变成 SUSPECT,现场客户盯着你,网上的教程搜来搜去还都是“删掉 LDF 重建日志”这种一句话带…

作者头像 李华
网站建设 2026/9/9 15:12:29

手写线程安全消息队列:条件变量与生产者消费者模型实战

1. 从"裸奔"的共享变量到消息队列:先看一个真实案例我接手过一个采集程序,最初版本用的是最直白的做法:一个生产者线程不断往全局链表里塞数据,消费者线程定时醒来遍历链表,为了防冲突给链表挂了一把大锁。前…

作者头像 李华
网站建设 2026/9/9 15:09:47

后摩揽月V2.1.0开发套件:从边缘计算到模型量化部署的实战解析

后摩揽月的V2.1.0版本,我在拿到手的第一周就把手头一个人脸检测工程完整跑通了。这个版本最明显的感觉是,开发体验从“能用”向“好用”跨了一大步。这篇就详细讲讲这次版本更新的核心内容、实际开发中的操作细节,以及我踩过的几个坑&#xf…

作者头像 李华
网站建设 2026/9/9 15:09:27

老板让全面拥抱AI,结果AI助理把公司的工资表暴露了......

前天老板开完会,突然宣布: 公司要全面拥抱AI。 准备搭一个内部AI机器人,把公司资料都传进去,以员工为核心做AI化改造。 说白了就是: 以后谁需要什么资料,不用到处找人,直接问AI。 人事大姐执…

作者头像 李华