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

本文探讨了数字逻辑综合工具DC-06的综合优化过程,包括Top-down编译策略、算术优化方法、逻辑复制、边界优化及路径分组等关键技术。详细介绍了如何使用compile_ultra命令进行高级优化,以及在SOC项目中如何处理clk、rst等特殊约束。

数字逻辑综合工具-DC-06

——综合优化过程

编译的策略:Top-down
(做设计有两种策略:top-down 和 bottom-up)
设计一定是一种层次化的结构,一层一层地去例化

Top-down只有一层的约束,针对某些模块,可能会有一些特殊的约束
在一个soc系统里面,会有一些真正的工作模块,和一些管理模块,这些工作模块跟clk、rst不会放到一起去做综合,clk、reset这些模块一般会做一些特殊的约束,比如clock gating,会放在额外的脚本里面做
如果采用bottom-up的综合顺序,当出现了glue logic(胶合逻辑),即如果在顶层模块里,并不是只有模块与模块的连接,而是由一个与门连接而成。如果采用bottom-up的顺序,下层模块保持don’t touch,那么还需要针对top层写一个额外的约束(要把glue logic也放进去编译)。
如果这样做的话,一个Soc项目里的顶层会有四五十个模块,针对每一个模块都写一个约束,这个工作量会非常大,而且效果不一定好,所以一般采用top-down的方式。

【compile_ultra】
用在时序约束紧张的时候。相当于打开了很多的开关。
这个命令在compile命令上做了更强的一些优化功能,会把整个模块给打散。
在这里插入图片描述
全部打散会有些问题,对于后仿而言,最后只能看到一个顶层,如果后仿有问题,没法确定是哪个模块产生的!
针对一些关键路径会优化,尝试做多次,直到所有的方法都没法满足约束。

这个命令做的一些优化:
1、 结构级优化:比如做了一个加法器(行波进位加法器、超前加法器等等)(比较大的优化)
2、 逻辑级优化
3、 门级优化:局部上的一些优化
DC会尝试着在满足时序约束的同时,将面积达到最小。

如果不满足要求,DC会找出critiical path,对其进行resynthesis

【DesignWare Library】
这是一个soft IP库:加减乘大于等于小于
FIFO、shiftreg、div_seq、ram……
(自己写的没有人家写的可靠)

在设计都进来的时候,link check保存为unmapped .ddc,这个格式里面主要是一些DW开头的器件。

【一些常见的算术优化方法:】
在这里插入图片描述
1、 折叠
2、 公共表达式——资源分享
3、 少用乘法
4、 乘以某个常数——把这个常数拆成2的多少次放,做移位相加,替代乘法器

【逻辑复制】
在这里插入图片描述
单元的延迟跟两个因素有关:输入的转换时间和扇出负载。
上图有一个关键路径,它的组合逻辑延时比较长,为了减小这个时间,把输入门的负载减小:将逻辑一分为二,对于关键路径,不让它驱动过多的单元,对于约束比较松的路径,可以安排large fanout(以面积换速度)。

【库分析】
在这里插入图片描述
等效表达式:DC会针对同一个表达式做不同的表达方式。预先建立好逻辑。
说实话不是很懂。

【边界优化】
在这里插入图片描述
有的时候会借助一些常数,可以被优化掉,比如用DFF的QB端,优化过后的信号会出现_BAR的后缀。
问题:做形式验证(把网表跟rtl代码作数学表达式上的等价校验)的时候,需要把DC产生的default.svf文件(一般在工作目录下)交给formality工具,告诉formality这些结构发生了一些改变。否则Formality会不认识这些优化的地方。

【Auto-ungrouping】
这是compile ultra默认的,如果不希望打散,加上命令set_ungroup <references_or_cells> false 命令
在这里插入图片描述

例子:
在这里插入图片描述

【扫描链-scan】(DFT)哪些地方短路了,哪些地方开路了给扫描出来。一般用这种带选择的触发器来代替一般的触发器,作为扫描链。扫描链的插入必然会带来更大的面积和更长的组合路径。
在综合的时候一般要加入-scan选项,让DC把里面普通的触发器替代成这种带MUX的触发器,看看能不能完成。
在这里插入图片描述

在没有做DFT的时候,-scan选项只是插入一个MUX,并没有形成一个链!
在这里插入图片描述

【timing_high_effort_script选项】
对时序做最好的优化。
会把时序的优先级提升到超过DRC(Design Rule Check)的优先级!
DRC是工艺厂商的要求,不满足DRC可能会出错。
在这里插入图片描述

【-timing】
在这里插入图片描述

【-retime】
在这里插入图片描述
上图:前面的不满足,后面的有点余量
下图:把前面的一部分组合逻辑挪到后面去,这样前一级就得到了很大的改善。后面一点点的violation可以通过把时钟稍微往后挪一点来改善掉。
Retiming的基本思想:这几个在功能和时序上是等效的
在这里插入图片描述

如果不希望这种retiming发生在一些特定的寄存器或者design中,可以通过命令设置
在这里插入图片描述
retiming的结果也需要放在.svf文件里告诉Formality

【路径分组】
在一个设计里面可能会有很多的clock,DC会把这些路径根据时钟进行分组
在这里插入图片描述

【亚关键路径被忽略的问题】
在这里插入图片描述
在这里插入图片描述
如果最长路径不能满足是需要求,那么DC会放弃对其它逻辑的一些优化。
(假设COMBO不满足时序要求,中间那个reg-to-reg路径就不优化了。)
——重新分组:这个组的最差的一个挂了,那这个组么得救了,其他组的还能抢救一下。
在这里插入图片描述

比如这里,分成Inputs Outputs Reg-to-Reg和COMBO四个组
命令:(既然是路径,就要指定从哪来到哪去(from to))
在这里插入图片描述

【critical range】
在这里插入图片描述
这个组里,最差的已经提高不了了,现在设置一个范围,在这个范围里面的,都尽量去做一些优化。

【给分定的组指定一个权重】
在这里插入图片描述
发现某些组是特别重要的,就把权重提高一点。

三个建议的值:1 2 5 默认的是1。5的重要程度最高。
weight的另外一个例子:
在这里插入图片描述
这里换了一种实现DFF的方式,Tsetup变长了,但Tc2q变短了,即提高了CLK路径的优先级,牺牲了别的路径,改善了该路径。

【【操作部分】】

在这里插入图片描述
在这里插入图片描述
(官方建议critical_range不超过时钟周期的百分之十)

这些值设好了之后要查看一下,report_path_group
在这里插入图片描述

license没有compile_ultra,用-map_effort high(发现综合结果不满足要求,回过头来做优化,注意,这种不会做结构级的优化) -area_effort high来代替
在这里插入图片描述
把综合之后的网表保存为ddc格式

脚本运行完了之后看时序
report_timing -delay_type max(看最差的那条)
在这里插入图片描述
在这里插入图片描述
(这是在脚本里把路径分组注释掉之后的结果)
注意,现在只报告了一个路径。而且这个路径属于clk_i路径组。

通过report_path_group来查看分组的情况
在这里插入图片描述
(此时没有任何分组)

ungroup之前的电路图:

(此时的设计是分级的)
在这里插入图片描述
敲入命令:ungroup -flatten -all之后,只能看到一个顶层了
在这里插入图片描述

compile没加-scan选项时的ddc网表:
(在mapped里面,top.ddc)
在这里插入图片描述
这是一个普通的D触发器

敲入命令:compile -map_effort high -area_effort high -scan
在这里插入图片描述
==>综合出来这样的DFF
这些DFF并没有连成一个链,需要用DFT Compiler去做。(不是所有的芯片都一定要做DFT的)。

【设置了路径组之后的综合】
report_path_group
在这里插入图片描述

再执行report_timing -delay_type max
在这里插入图片描述
在这里插入图片描述
(这边不存在COMBO的路径,所以没有报)

<think>嗯,用户这次问的是DC综合中对复位信号的优化行为,看来ta正在深入学习数字电路设计的综合阶段。之前系统指令提到要参考站内引用,而用户引用的两段材料恰好都涉及复位信号和综合优化,这应该不是巧合——用户可能在设计时遇到了复位信号相关的实际问题。用户引用的[1]很有意思,它点出了同步复位的一个关键痛点:综合工具可能混淆数据信号和复位信号。这让我想到DC综合时确实会有复位网络优化,但引用[2]提到的set_false_path指令又暗示着约束条件的重要性。用户真正关心的可能是:如何在保证功能正确的前提下,让工具自动优化复位结构?从专业角度需要分三层回答:首先是基础优化行为(降扇出、插缓冲),接着是约束依赖(falsepath设置),最后要强调复位类型的影响(同步/异步)。特别要注意提醒用户:异步复位必须用专门的缓冲链优化,否则容易出亚稳态问题。示例里的Tcl约束代码很实用,用户可以直接复制到脚本里测试。用户能提出这种精度的问题,说明至少已经跑过DC综合了。不过ta没提具体是同步还是异步复位,所以回复里需要涵盖两种情况。在"注意事项"部分特意加入时序违例的警告,因为实际项目中很多人会忽略复位路径的时序分析。</think> 在DC(Design Compiler)综合过程中,复位信号会经历特定优化行为,其核心原则是**在满足功能正确性和时序约束的前提下,最小化复位网络的延时和面积开销**。以下是复位信号优化的关键行为及技术细节: --- ### **一、复位信号的优化行为** 1. **复位网络整形(Reset Network Reshaping)** DC会主动重构复位网络,通过插入缓冲器(Buffers)或反相器(Inverters)实现: - **降低高扇出(High Fanout)**:复位信号通常驱动大量触发器(FFs),DC会自动插入缓冲树(Buffer Tree)平衡负载,避免单一驱动源导致的时序违例。 - **减少布线拥塞**:优化复位网络拓扑结构,降低物理设计阶段的拥塞风险。 2. **逻辑优化与精简** - **冗余复位逻辑消除**:若复位信号在部分逻辑路径中不起作用(例如复位值=0且逻辑门本身有清零功能),DC可能移除冗余逻辑。 - **常数传播(Constant Propagation)**:当复位值固定为常数时,DC会传播该常数至下游逻辑(例如:复位值为0的寄存器输出可直接置0)。 3. **复位同步器优化(针对异步复位)** 异步复位需同步释放以避免亚稳态。DC会对同步器链(2级或3级触发器链)进行专门优化- **专用缓冲链**:为复位同步器分配独立缓冲路径,避免与数据路径竞争资源。 - **时序约束保证**:确保同步器链满足建立/保持时间要求(通过`set_max_delay`约束)。 --- ### **二、约束对复位优化的影响** 复位信号的优化高度依赖设计约束: 1. **虚假路径(False Path)声明**: 必须显式声明复位路径为虚假路径(`set_false_path -through [get_ports reset]`),**避免综合工具对复位路径进行不必要的时序优化**,确保关键数据路径资源优先级。 > ✅ 示例约束: > ```tcl > set_false_path -from [get_ports rst_n] -to [all_registers] > ``` 2. **复位路径最大延时约束**: 对异步复位同步器链需单独约束: ```tcl set_max_delay 1.0 -from [get_ports rst_n] -to [get_pins sync_ff*/D] ``` --- ### **三、复位类型对优化的差异** | **复位类型** | **同步复位** | **异步复位** | |--------------|------------------------------|------------------------------| | **触发条件** | 依赖时钟边沿 | 独立于时钟(立即生效) | | **DC优化** | 可能被综合为数据路径逻辑 | 需要专用同步器链(独立优化) | | **风险** | 易被误识别为数据信号(需`set_dont_touch`) | 亚稳态风险(依赖同步器优化) | --- ### **四、关键注意事项** 1. **避免复位信号被逻辑优化破坏**: 使用`set_dont_touch_network`保护复位拓扑结构: ```tcl set_dont_touch_network [get_ports rst_n] ``` 2. **复位扇出报告验证**: 综合后执行: ```tcl report_fanout -nosplit -output_pins -net [get_nets rst_n] ``` 确保高扇出网络已被缓冲树分解(Fanout ≤ 100-200)。 3. **复位域交叉(Reset Domain Crossing)检查**: 不同复位域的寄存器间需隔离,否则可能导致功能错误(通过Formality/Primetime验证)。 --- ### **五、典型问题与解决方案** | **问题现象** | **原因分析** | **解决方案** | |---------------------------|---------------------------|---------------------------------------| | 复位恢复时间违例 | 异步复位同步器链延时过大 | 约束同步器链最大延时 | | 复位网络高负载违例 | 缺少缓冲树优化 | 启用`compile -reset`自动插入缓冲树 | | 复位被综合为数据路径 | 同步复位逻辑未明确标识 | 添加`// synopsys sync_set_reset`指令 | > ⚠️ **特别提醒**:异步复位必须通过同步器链释放(避免亚稳态),DC不会自动添加此逻辑——需在RTL中显式编码。 --- ### **相关问题延伸** 1. **如何在DC中验证复位信号的时序覆盖?** → 使用`reset check`命令检查复位恢复/移除时间是否满足要求。 2. **多时钟域的复位信号如何处理?** → 需为每个时钟域分配独立复位网络,并通过`set_clock_groups`隔离跨时钟域路径。 3. **如何区分同步复位和异步复位在网表中的实现差异?** → 同步复位表现为数据选择器(MUX)逻辑;异步复位直接连接触发器的异步复位端(SDN/SCN端口)。 通过约束驱动的优化策略,DC能够平衡复位信号的功能性、时序和面积,但需设计者主动规避工具优化风险(例如虚假路径声明)。若需深入RTL实现建议,请提供具体设计场景。 [^1]: 同步复位信号优化需依赖综合指令明确功能属性 [^2]: 虚假路径约束是复位网络优化的核心控制点
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值