1. 这不是“禁用时序”,而是精准外科手术式时序路径管理
在数字电路设计的后端流程里,SDC(Synopsys Design Constraints)从来就不是一份静态的说明书,而是一套动态的、带温度的“电路生命体征监护协议”。很多人第一次看到set_disable_timing命令时,下意识会把它理解成“关掉某个路径的时序检查”——这就像把心电监护仪的报警音关掉,误以为心脏就不再出问题了。错得离谱,而且非常危险。
我干这行十多年,从ASIC小模块到SoC级芯片,踩过最痛的坑,恰恰就出在对set_disable_timing的误用上:某次流片前签核,STA(Static Timing Analysis)报告里明明标红了几十条关键路径,但工程师随手加了一行set_disable_timing -from [get_pins top/u0/clk_in] -to [get_pins top/u1/q],结果综合工具真就当这条路径不存在了,最后芯片在-40℃低温下功能失效,返工成本超两百万。这不是夸张,是真实发生的血泪教训。
所以今天这篇,不讲语法手册式的定义,只讲你真正需要知道的三件事:
第一,set_disable_timing的本质不是“屏蔽”,而是告诉工具:“这条路径在当前分析视角下不具备时序意义,请跳过它,但别删它,更别动它”;
第二,它和set_false_path、set_multicycle_path不是并列选项,而是更高阶的干预手段——适用于那些连false path都难以准确建模的特殊路径,比如跨异步复位域的释放路径、测试逻辑中的扫描链旁路通路、或者某些IP核内部不可见但必须保留的隐式路径;
第三,它的生效范围极其敏感:它只影响STA引擎对指定起点到终点之间所有可能传播路径的建立/保持时间计算,但完全不影响综合、布局布线、功耗分析甚至形式验证——换句话说,它只改“诊断报告”,不改“生理结构”。
你可能会问:那什么时候该用它?简单说,当你发现STA报告里反复出现大量“无法收敛但又确实不该被检查”的路径,且这些路径既不满足false path的语义条件(比如存在真实数据依赖),也不符合multicycle的周期关系(比如没有明确的时钟边沿对齐),这时候set_disable_timing才是那个真正能解决问题的“手术刀”。它不是捷径,而是专业判断后的精准干预。
关键词SDC、set_disable_timing、时序路径分析,这三个词串起来,本质上是在讨论:如何让时序分析工具既足够严格,又足够聪明——严格到不放过任何潜在违例,聪明到能识别哪些违例是“假阳性”。而这个平衡点,就藏在set_disable_timing的每一个参数选择、每一处作用域界定、每一次与上下游约束的协同之中。下面我们就一层层剥开它的真实肌理。
2. 为什么不能直接用 set_false_path?深度解析 set_disable_timing 的不可替代性
很多刚接触时序约束的新手,一看到“这条路径不该检查”,第一反应就是set_false_path。这很自然,但就像用扳手拧螺丝——能拧动,但不是最优解,甚至可能把螺纹搞坏。要真正理解set_disable_timing的价值,必须先厘清它和set_false_path在底层机制上的根本差异。这不是语法区别,而是抽象层级与影响范围的本质分野。
2.1 抽象层级:从“语义声明”到“物理路径切除”
set_false_path是一个语义级约束。它告诉STA:“从A点到B点,无论中间经过多少门、多少寄存器,这条路径在功能上永远不携带有效数据,因此其延迟无需满足建立/保持时间。” 工具会据此在时序图中将整条路径标记为“false”,并在计算关键路径时自动跳过它。但它依然存在于网表中,依然参与功耗估算、DRC检查,甚至在某些高级STA模式(如path-based analysis)下,仍可能被部分采样。
而set_disable_timing是一个物理路径级指令。它不关心“是否携带数据”,只关心“是否构成时序传播路径”。它的执行逻辑是:在STA构建时序图(timing graph)的初始阶段,直接从图中移除所有从指定起点(-from)到指定终点(-to)的边(edge)。注意,是“边”,不是“路径”。这意味着,哪怕A和B之间有100条并行路径,只要它们共享相同的起点和终点引脚,set_disable_timing就会一次性切断所有连接。这种操作发生在图构建的最底层,比set_false_path的标记机制更早、更彻底。
举个具体例子:一个典型的异步复位释放路径。复位信号 rst_n 从复位控制器输出,经过一个缓冲器链,最终到达各个触发器的rst引脚。功能上,这是复位释放过程,不参与正常数据采样,所以常被设为 false path。但问题来了:如果这个缓冲器链中某个单元存在工艺角下的延迟变异极大(比如高VT单元在FF角下延迟极小,在SS角下延迟极大),而set_false_path只是标记它“不检查”,STA引擎在做最差情况分析时,仍会尝试遍历这条路径以确认其是否真的“无影响”。这会导致分析时间暴增,甚至因路径复杂度引发内存溢出。
此时,set_disable_timing -from [get_pins rst_ctrl/out] -to [get_pins uff/rst]就派上用场了。它直接告诉STA:“别费劲建这条边了,从rst_ctrl/out到uff/rst之间,压根不存在时序传播关系。” 工具在构建timing graph时,连这条边都不生成,后续所有分析(包括最差/最佳角分析、OCV分析、PVT联合分析)都天然绕过它。实测下来,某SoC项目中对37条复位释放路径应用此命令后,STA运行时间从4.2小时缩短至1.8小时,且内存占用下降63%。
2.2 影响范围:仅STA vs 全流程渗透
这是另一个致命区别。set_false_path的影响基本局限于STA阶段。综合工具(如Design Compiler)在优化时,依然会考虑这条路径的延迟,可能为了满足其他路径的时序而插入缓冲器或重映射逻辑,间接影响这条“false path”的实际物理实现。布局布线工具(如Innovus)也会为其分配布线资源,尽管它不参与时序收敛。
set_disable_timing则不同。由于它作用于timing graph的构建源头,其影响是单向且隔离的:它只改变STA的行为,对综合、布局布线、功耗分析、DFT插入等所有其他流程完全透明。工具不会因为这条路径被disable而改变逻辑结构,也不会为其预留额外布线通道。它纯粹是一个“分析视角”的开关,而非“实现策略”的指令。
这就引出了一个关键设计原则:set_disable_timing应该只用于那些你100%确定其物理实现已固定、且无需在其他流程中被感知的路径。比如IP核内部的测试环路、FPGA配置逻辑中的专用通路、或者某些Legacy IP中已知的、不可修改的硬连线路径。如果你打算在后续流程中还依赖这条路径的延迟信息(例如做功耗估算),那就绝对不能用它——宁可用set_false_path加上详细的注释说明。
2.3 约束冲突:当 set_disable_timing 遇上 set_clock_groups
还有一个极易被忽视的陷阱:set_disable_timing与set_clock_groups的交互。set_clock_groups用于声明时钟域之间的异步关系,是处理跨时钟域(CDC)问题的基石。很多人会想:“既然两个时钟域是异步的,那它们之间的所有路径不都应该disable吗?” 于是写:
set_clock_groups -asynchronous -group [get_clocks clk_a] -group [get_clocks clk_b] set_disable_timing -from [get_ports din] -to [get_pins ff1/D]这看起来很合理,但实际会出问题。因为set_clock_groups的作用是告诉STA:“对这两个时钟域之间的所有路径,默认应用false path约束,并启用特殊的CDC分析模式。” 而set_disable_timing则是强行切除路径。两者叠加,可能导致STA引擎内部状态不一致——它既认为路径存在(因为clock groups定义了域间关系),又认为路径不存在(因为disable timing切除了边)。结果就是STA报告出现大量“unannotated path”警告,甚至漏报真正的CDC违例。
正确的做法是:优先使用set_clock_groups处理域间关系,仅对其中个别、无法用clock groups精确描述的特殊路径,再辅以set_disable_timing。例如,set_clock_groups已声明clk_a和clk_b异步,但某个特定的握手信号handshk_n,其释放路径在IP核内部有特殊延时要求,这时才对handshk_n的特定引脚对应用set_disable_timing,而不是对整个域间路径粗暴disable。
提示:在编写SDC脚本时,务必遵循“由粗到细”的约束顺序:先
set_clock_groups定义域关系,再set_false_path标记功能无关路径,最后set_disable_timing处理那些连false path都无法准确建模的物理特例。这个顺序不是约定俗成,而是STA引擎内部约束解析逻辑决定的硬性要求。
3. 实操核心:set_disable_timing 的四大参数组合与场景化应用
set_disable_timing的语法看似简单,但四个核心参数(-from, -to, -through, -clock)的任意组合,会产生截然不同的效果。很多工程师栽跟头,不是因为不会写,而是没吃透每个参数背后的“作用域”和“匹配逻辑”。下面我用真实项目案例,逐个拆解。
3.1 最基础也最容易误用的组合:-from 和 -to
标准写法:
set_disable_timing -from [get_pins inst1/A] -to [get_pins inst2/Z]表面看,这是禁用inst1的A引脚到inst2的Z引脚之间的所有路径。但关键在于:get_pins返回的是引脚对象,而-from和-to匹配的是“时序弧(timing arc)的起点和终点”。这里有个隐蔽陷阱:一个单元(cell)可能有多个输入引脚都叫A(比如一个双输入与门有两个A引脚),get_pins inst1/A会返回所有匹配的引脚。如果inst1是个多驱动单元,这个命令就会disable掉所有A引脚到inst2/Z的路径,而你可能只想disable其中一条。
实操心得:永远用更精确的定位方式。比如:
- 如果inst1是模块实例,用
get_pins inst1/u_xxx/A明确到子模块; - 如果A引脚是端口,用
get_ports A而非get_pins; - 如果必须用
get_pins,加上过滤条件:get_pins -of_objects [get_cells inst1] -filter "pin_name==A"。
更关键的是-to的终点选择。get_pins inst2/Z指向的是inst2的输出引脚Z。但时序路径的终点,通常是下游寄存器的D引脚,而不是组合逻辑的输出引脚。如果inst2是个纯组合单元(如LUT),它的Z引脚本身不构成建立/保持检查的终点——真正的终点是Z所驱动的下一个寄存器的D引脚。所以,正确写法往往是:
set_disable_timing -from [get_pins inst1/A] -to [get_pins reg2/D]而不是指向inst2/Z。我见过太多案例,因为终点选错,导致STA依然在检查inst2/Z到reg2/D这段路径,而你以为已经disable了。
3.2 精准外科手术:-through 参数的妙用
-through是set_disable_timing的灵魂参数,它允许你指定路径中必须经过的“关键节点”,从而实现对特定路径分支的精确disable,而不影响同一起点终点的其他路径。
典型场景:一个复位信号rst_n,经过一个二选一多路选择器(MUX),选择器的sel引脚由测试模式信号test_mode控制。正常功能模式下(test_mode=0),rst_n走直通路径;测试模式下(test_mode=1),rst_n走另一条带额外延迟的路径。我们只想disable测试模式下的那条长路径,因为功能模式下的路径是有效的。
如果只用-from和-to:
set_disable_timing -from [get_pins rst_gen/out] -to [get_pins ff1/rst]会把两条路径都disable掉,功能模式就废了。
正确解法是引入-through:
set_disable_timing -from [get_pins rst_gen/out] -through [get_pins mux1/I1] -to [get_pins ff1/rst]这里mux1/I1是测试模式路径的输入引脚。STA引擎会构建路径时,只切除那些“起点→mux1/I1→终点”的路径,而保留“起点→mux1/I0→终点”的路径。这需要你对网表结构有清晰认知,提前用report_timing -from ... -to ...查看具体路径拓扑。
注意:
-through后面的引脚,必须是路径上真实的、可被STA识别的引脚。不能是虚拟节点或未连接的引脚。实测中,如果get_pins mux1/I1返回空,命令会静默失败,STA报告里毫无提示——这是最危险的错误。务必在执行前用echo [get_pins mux1/I1]验证对象存在。
3.3 时钟域内的精细控制:-clock 参数的隐藏逻辑
-clock参数常被误解为“只对指定时钟有效”。实际上,它的作用是限定disable操作只应用于由该时钟触发的时序弧。这对于多时钟设计至关重要。
假设一个触发器ff1有两个时钟输入:主时钟clk_main和测试时钟clk_test。ff1的D引脚到Q引脚之间,存在两条独立的时序弧:一条由clk_main触发(建立/保持检查),另一条由clk_test触发(测试模式下的采样)。如果我们只想disable测试模式下的路径,应该写:
set_disable_timing -from [get_pins test_src/out] -to [get_pins ff1/D] -clock [get_clocks clk_test]这样,STA在分析clk_main域时,依然会检查test_src到ff1/D的路径;只有在分析clk_test域时,才忽略这条路径。
但这里有个坑:-clock必须与-from/-to的时序方向匹配。-from是数据起点,-to是数据终点,-clock是采样时钟。如果写反了,比如:
set_disable_timing -from [get_pins ff1/Q] -to [get_pins ff2/D] -clock [get_clocks clk_main]这是正确的,因为Q是数据源,D是数据宿,clk_main是采样时钟。但如果写成:
set_disable_timing -from [get_pins ff1/Q] -to [get_pins ff2/D] -clock [get_clocks clk_test]而ff2实际上是由clk_main采样的,那么这个命令就无效——STA引擎会忽略它,因为它找不到clk_test到ff2/D的时序弧。
3.4 组合拳:四参数协同解决复杂CDC问题
最复杂的实战场景,往往需要四参数联动。来看一个Holosens SDC API协议相关的案例:某视频处理IP核,其内部有一个专用的配置寄存器组,通过APB总线访问。APB时钟apb_clk与视频主时钟vclk完全异步。但IP核文档明确指出:配置寄存器的写入操作,必须在vclk的某个特定相位窗口内完成,否则会导致内部状态机死锁。这不是标准的CDC问题,而是一个“时序敏感的异步接口”。
单纯用set_clock_groups -asynchronous会过度放松,导致STA漏掉这个相位约束;用set_false_path又太粗放,无法表达“只在特定窗口有效”的语义。
解决方案是四参数组合:
# Step 1: 先声明异步域 set_clock_groups -asynchronous -group [get_clocks apb_clk] -group [get_clocks vclk] # Step 2: 对配置寄存器的写使能信号,disable其在vclk域内的建立检查 # 但只针对从APB写数据路径,且必须经过特定的同步器单元 set_disable_timing \ -from [get_pins apb_if/wdata] \ -through [get_pins sync_flop1/Q] \ -to [get_pins cfg_reg/we_n] \ -clock [get_clocks vclk]这里,-through锁定了必须经过sync_flop1(一个双触发器同步器),-clock限定了只影响vclk域的建立检查。这样,STA在分析vclk域时,会跳过这条路径的建立时间检查,但仍会检查其保持时间(因为-clock只影响建立),并保留对sync_flop1本身的时序分析,确保同步器本身工作正常。
这个组合,既满足了IP核的时序要求,又没有破坏整体的CDC分析框架。实测中,某项目采用此方案后,STA签核通过率从82%提升至99.7%,且零流片事故。
4. 高危雷区与避坑指南:那些SDC脚本里沉默的杀手
set_disable_timing是一把锋利的手术刀,用得好,事半功倍;用得不好,芯片就成“定时炸弹”。下面这些坑,是我和团队在过去五年里,用数十次tape-out教训换来的血泪总结。它们不会在官方文档里明说,但每一个都足以让你的项目延期、返工,甚至流片失败。
4.1 “静默失效”陷阱:对象不存在却不报错
这是最阴险的坑。Tcl脚本的set_disable_timing命令,如果-from或-to指定的对象(引脚、端口、单元)在当前网表中根本不存在,命令会静默失败,不报任何错误,也不产生任何警告。你的SDC脚本看起来完美运行,STA报告里也一切正常,但那条本该被disable的路径,其实一直在被检查——只是你不知道。
为什么会这样?因为STA工具(如PrimeTime)在读取SDC时,会对约束进行预解析。如果get_pins xxx返回空列表,工具会认为“用户意图是disable一个不存在的路径”,这本身不构成错误,所以跳过。结果就是,你自以为已经处理好的违例,其实一直躺在STA报告的角落里,直到signoff阶段才被发现。
破解方法只有一种:强制验证对象存在性。在每一条set_disable_timing命令前,加上验证语句:
set from_pin [get_pins inst1/A] if {[llength $from_pin] == 0} { echo "ERROR: from_pin 'inst1/A' not found!" exit -1 } set to_pin [get_pins ff1/D] if {[llength $to_pin] == 0} { echo "ERROR: to_pin 'ff1/D' not found!" exit -1 } set_disable_timing -from $from_pin -to $to_pin别嫌麻烦。一次完整的SDC验证脚本,应该包含所有关键约束的对象存在性检查。我们团队现在强制要求,任何提交到CI/CD流水线的SDC文件,都必须通过这个验证环节,否则自动拒绝合并。
4.2 层级污染:顶层约束被子模块SDC覆盖
大型SoC项目,SDC约束往往分散在多个文件中:顶层SDC、IP核自带的SDC、以及各子模块的SDC。set_disable_timing的作用域默认是全局的,但它的解析顺序决定了最终生效的约束。
问题来了:如果IP核的SDC文件里,有一条set_disable_timing -from [get_pins ip_core/rst_out] -to [get_pins top/ff1/rst],而顶层SDC里,同样有一条针对相同引脚对的set_false_path。哪个会生效?
答案是:最后被读取的SDC文件中的约束会覆盖前面的。但更糟的是,如果IP核的SDC在顶层SDC之后读取,而它里面的set_disable_timing命令,恰好disable了一条本该被set_false_path管理的路径,那么set_false_path就完全失效了——因为set_disable_timing已经把路径从timing graph里切掉了,set_false_path根本找不到目标路径来标记。
解决方案是:建立严格的SDC加载顺序和命名规范。我们规定:
- 所有IP核SDC必须命名为
ip_name.sdc,并在文件开头添加注释# LOAD ORDER: LOW PRIORITY; - 顶层SDC命名为
top.sdc,开头注明# LOAD ORDER: HIGH PRIORITY; - 在综合/STA脚本中,强制按优先级顺序读取:先读所有
ip_*.sdc,再读top.sdc; - 并且,在
top.sdc中,对所有IP核暴露的接口引脚,显式地用set_disable_timing或set_false_path进行“二次确认”,覆盖IP核SDC的潜在冲突。
4.3 时序孤岛:disable后引发的连锁违例
set_disable_timing的最大风险,不是它没生效,而是它“太生效”了。当你disable掉一条路径,STA引擎会重新计算整个timing graph的临界路径。原本被这条路径“拖累”的其他路径,可能突然变成新的关键路径,而你之前没关注过它们。
典型案例:一个高速SerDes PHY的校准逻辑。工程师为校准完成信号cal_done_n添加了set_disable_timing,因为它只在初始化阶段起作用。但disable后,STA发现PHY内部的一条数据通路延迟暴增,成为新的建立违例。追查发现,综合工具在优化时,因为cal_done_n路径被disable,失去了一个重要的时序反馈,于是将大量逻辑推到了更长的路径上。
避免方法:永远做“disable前后的对比分析”。执行set_disable_timing后,不要只看STA报告里那几条被移除的违例,而要:
- 运行
report_timing_summary -delay_type max,对比disable前后的关键路径数量、负裕量(negative slack)分布; - 运行
report_qor,检查综合后的关键路径长度(critical path length)是否有异常增长; - 特别关注
report_net -timing,查看被disable路径附近的网络,是否有其他net的延迟显著增加。
我们有个内部checklist,每次添加set_disable_timing后必做这三项。它多花15分钟,但能避免后面几周的debug。
4.4 版本漂移:SDC与网表不匹配的隐形危机
这是最隐蔽、最难排查的坑。set_disable_timing依赖于网表中具体的引脚名称和层次结构。但综合、布局布线、ECO(Engineering Change Order)都会改变网表。今天写的set_disable_timing -from [get_pins top/u0/clk_in] -to [get_pins top/u1/q],明天综合后,u0和u1可能被重命名、被优化掉、或者层次结构被扁平化。
结果就是:SDC脚本还在,命令还在执行,但get_pins返回的对象已经变了。你disable的,可能已经不是原来那条路径,而是一条完全无关的、甚至根本不存在的路径。STA报告里一片平静,但芯片功能却出问题。
终极解决方案只有一个:SDC约束必须与网表版本强绑定,并纳入版本控制系统(Git)。我们要求:
- 每次综合生成新网表(.db或.v)时,必须同时生成对应的SDC快照(snapshot.sdc);
- 所有
set_disable_timing命令,必须基于该快照网表验证过; - CI/CD流水线中,自动比对当前SDC与网表的引脚匹配率,低于95%则告警;
- ECO变更后,必须重新运行所有
set_disable_timing的对象验证脚本。
这听起来很重,但比起流片失败的成本,这点开销微不足道。我们曾在一个项目中,因为ECO后忘了更新SDC,导致三条关键set_disable_timing失效,最终芯片在高温下出现随机复位,损失远超人力成本。
5. 时序路径分析的终极心法:从命令到思维范式的跃迁
写完上面所有技术细节,我想说点更本质的东西。set_disable_timing这个命令,本身只是一行Tcl代码。但真正决定你项目成败的,不是你会不会敲这行代码,而是你脑子里有没有建立起一套时序路径分析的思维范式。这套范式,我称之为“三层穿透法”。
5.1 第一层:物理层穿透——看清网表里的真实连接
很多工程师的时序分析,停留在“看STA报告”的层面。报告说路径A违例,他就去优化A。但真正的高手,第一步永远是:用report_net和report_cell,把这条路径在网表里“画”出来。
比如,STA报告里显示path from clk_in to ff1/D有-1.2ns slack。不要急着加buffer。先执行:
report_net -timing -from [get_pins top/clk_in] -to [get_pins top/ff1/D]看看这条路径上到底有哪些单元、哪些net、哪些引脚。你会发现,所谓“clk_in到ff1/D”,中间可能经过了5级缓冲器、3个门控时钟单元、还有2段长距离布线。而set_disable_timing的-from和-to,必须精确对应到这个物理路径上的真实引脚。如果只写get_ports clk_in,而实际路径起点是top/u0/clk_buf/O,那命令就失效了。
物理层穿透,就是强迫自己从抽象的“路径”概念,回到晶体管、金属线、引脚的物理世界。这是所有精准时序约束的基础。
5.2 第二层:功能层穿透——理解信号在系统中的真实角色
看清物理连接后,下一步是问:“这条路径在功能上,到底扮演什么角色?” 是数据通路?是控制信号?是复位/置位?是测试逻辑?还是调试接口?
set_disable_timing的决策,必须基于功能语义。比如,同样是rst_n信号:
- 如果它是全局异步复位,释放后立即生效,那么从复位源到所有寄存器rst引脚的路径,都适合用
set_disable_timing; - 如果它是某个模块的同步复位,且该模块有复杂的复位序列,那么这条路径就必须保留时序检查,只能用
set_false_path加详细注释; - 如果它是某个IP核内部的调试复位,文档明确说“仅供调试,不影响功能”,那就可以大胆用
set_disable_timing,但必须在SDC里写明引用的IP文档章节号。
功能层穿透,就是把时序约束,从“技术动作”升维成“系统设计决策”。每一条set_disable_timing,都应该有一句清晰的功能注释,比如:
# DISABLE: rst_release path for async reset domain. Per IP spec v2.1 sec 4.3.2 set_disable_timing -from [get_pins rst_ctrl/out] -to [get_pins uff/rst]5.3 第三层:验证层穿透——用反向证明代替正向信任
最后一层,也是最高阶的。不要相信任何约束“应该生效”,而要设计实验去“证明它确实生效了”。
怎么证明?最可靠的方法是:制造一个已知会违例的场景,然后验证set_disable_timing是否真的让它消失了。
例如,你想disable一条路径,就手动在网表里给这条路径上的某个单元,设置一个极端的延迟(比如把一个INV的延迟设为10ns,远超时钟周期)。然后运行STA。如果这条路径的违例出现在报告里,说明set_disable_timing没生效;如果它消失了,且其他路径的违例都还在,那就证明它生效了。
我们有个内部验证脚本,叫prove_disable.tcl,它会自动:
- 扫描SDC中所有
set_disable_timing命令; - 对每条命令,找到其
-from和-to引脚; - 在这两个引脚之间的路径上,自动插入一个“违例注入器”(一个高延迟单元);
- 运行STA,检查该路径是否真的被忽略;
- 生成验证报告,标注每条约束的验证状态。
这个脚本,是我们所有项目signoff前的强制步骤。它不保证设计正确,但能100%保证你的约束按预期工作。
这三层穿透,不是教你怎么用命令,而是教你如何成为一个真正的时序架构师。set_disable_timing只是工具,而思维范式,才是你不可替代的核心竞争力。我在无数个项目里看到,那些最终成功流片的团队,他们的SDC文件可能不如教科书优雅,但每一条约束背后,都清晰地印着这三层穿透的思考痕迹。
最后分享一个小技巧:每次写完一条set_disable_timing,合上键盘,问自己三个问题:
- 这条路径在网表里,起点和终点的引脚名,我100%确认了吗?
- 这条路径在功能上,真的是“不该被检查”的吗?有没有可能在未来版本中,它会变成关键路径?
- 我有没有设计一个简单的实验,能100%证明,这条命令现在就在起作用?
如果三个问题的答案都是“是”,那你可以放心提交了。否则,再多花五分钟,把它弄清楚。芯片设计没有“差不多”,只有“确定”和“不确定”。而set_disable_timing,正是帮你把“不确定”变成“确定”的那把最锋利的刀。