刚接触数字IC设计的人,很容易把注意力都放在RTL代码上,以为写出一个功能正确的模块就大功告成了。直到有一次在项目里把写好的Verilog交给后端,结果对方隔天就反馈回来一堆时序违例、DRV违例和奇怪的面积报告,我才意识到“综合”才是前端设计真正意义上的第一道关口。而提到综合,绕不开的就是Synopsys Design Compiler和Cadence Genus这两个名字。这篇对比指南写给所有准备入行数字IC设计的新手,也写给那些像我一样从前端转向后端衔接、需要在两种综合工具之间反复横跳的人。我会用一个真正跑过项目的视角,尽量把这两套工具背后的设计哲学、使用方式、约束处理差异,以及你在实际工程里会遇到的坑,一次说清楚。
文章不会只停留在“DC是Synopsys家的,Genus是Cadence家的”这个层面,而是会重点讲这两者在命令体系、SDC翻译方式、物理综合流程、QoR报告解读以及和后端工具生态的衔接上有什么本质差异。对想系统学习数字IC前端流程、跑过几个开源RTL但没正经用过商业EDA工具的人,这篇文章应该能帮你少走不少弯路。我也尽量把从DC脚本迁移到Genus脚本、从Genus切回DC时会踩到的坑写出来,因为这些东西,官方文档里不会有人单独给你拎出来讲。
1. 综合工具在整个IC流程里到底卡在哪一环
1.1 RTL到GDSII的长链路中,综合为什么是“第一道闸”
很多新手对数字IC设计流程的理解是:写完RTL,然后布局布线,然后流片。这个理解缺失了非常重要的一环。实际上,一条完整的数字IC设计链路由多个独立环节串联而成,大致是:架构设计、RTL编码、逻辑综合、形式验证、DFT相关处理、布局规划、时钟树综合、布线、寄生参数提取、时序签核、物理验证,最后才是GDSII交付。综合这个环节处在RTL编码与后端实现之间,它的任务是把你用Verilog或SystemVerilog描述的行为级/结构级逻辑,映射成由标准单元库里的门电路、触发器、锁存器组成的门级网表。换句话说,综合把“你想要的逻辑关系”翻译成“库里真实存在的电路单元”。
输入综合工具的核心内容有三类:第一是RTL设计本身,包括所有子模块文件;第二是综合所需的工艺库,一般是标准单元库的.db或.lib文件,里面定义了每个单元的功能、时序、面积和功耗参数;第三是时序约束,也就是SDC文件。这三者缺一不可。你给工具的约束越准确,综合结果就越接近后端可接受的形态。综合工具的输出则是一堆文件,核心是门级网表、更新过的SDC约束、面积/功耗/时序报告,以及后续形式验证会用到的一些参考文件。
综合环节在整个流程里这么重要,是因为后端布局布线阶段所有的物理实现都基于这份门级网表。网表的时序质量、面积大小、功耗水平、单元密度,直接决定了后端的可布线性。如果综合阶段做得很粗糙,把一堆组合逻辑级数拉得很长,后端工具想靠布局布线和时钟树补偿来救,往往也救不回来。这就是为什么业内常说“综合的QoR决定了后端的命运”,等于是一把手枪的扳机。你在这一个环节偷的懒,后面要用十倍的修复成本来偿还。
1.2 DC和Genus的“血统”与生态位
Synopsys Design Compiler,通常简称为DC,是EDA行业里历史最悠久的逻辑综合工具之一。从20世纪80年代末问世到现在,它积累了庞大的用户基础和大量成熟的项目参考流程。Synopsys围绕DC建设了一整套完整的数字设计工具链,包括形式验证工具Formality、静态时序分析工具PrimeTime、布局布线工具IC Compiler II等。所以,如果你选用DC做综合,后续所有环节的数据交接都能在Synopsys自家生态里无缝衔接,格式兼容性几乎不用操心。
Cadence Genus的出身其实也不浅,它的前身是Cadence RTL Compiler,后来Cadence推出了Genus Synthesis Solution作为主打综合工具。Cadence同样有自己的完整流程:Innovus做布局布线,Tempus做时序签核,Liberate做库表征,Conformal做形式验证。在Cadence生态里,Genus就是那个负责把RTL变成高质量网表的入口。
这两家公司的工具在很多设计公司里并不是二选一的关系。有些公司用Synopsys全家桶,有些用Cadence全家桶,还有不少公司是综合用一家、后端用另一家,中间通过标准格式文件来衔接。很多成熟的大公司甚至会并行跑两条综合流程做交叉验证,因为两个工具对同一个RTL、同一份约束的处理结果往往会存在差异。这些差异有时候能为你提供新的优化视角,有时候也会给你带来不小的困惑。作为新手,你不需要急着站队,但最好把两边的核心概念都搞清楚,这样无论进到哪种环境,上手成本都会低很多。
2. Tcl命令背后的两种设计哲学
2.1 为什么DC用“动词命令”,Genus用“数据库属性”
第一次从DC脚本切到Genus环境时,我最直观的感受是:两种工具虽然都跑在Tcl解释器里,但思考方式完全不一样。
DC的核心风格是“动词命令”。它的Tcl环境里充满了面向流程的操作命令,比如read_verilog、link、elaborate、compile_ultra、report_timing。你会感觉到工具在引导你按流程一步一步执行:先读设计、再链接、再编译、再报告。每组命令有自己的参数空间,比如compile_ultra这里可以加-retime,那边可以加-timing,很多流程约束是直接作为命令选项传进去的。这种风格对新手比较友好,因为一条命令就代表一个动作,脚本的顺序天然就是流程的先后顺序。
Genus则不一样。它的Tcl环境高度依赖一个中心化的属性数据库,大量操作都是通过get_db和set_db这对命令来完成的。你想要查询当前设计的信息,用get_db去数据库里取;你想改变工具的行为,用set_db去数据库里设属性。比如设置逻辑库,DC里是用set_app_var target_library $std_cell_lib这种全局变量方式,而Genus里则更倾向于set_db library :::stdcell_lib这种对象属性的方式。综合动作本身也被封装成elaborate、synthesize -to_mapped这类相对高层的命令,但真正决定综合策略的往往是综合前那几十行set_db配置。
我个人的理解是,DC像一台逻辑清晰的机器,你按顺序按按钮,它按流程干活;Genus更像一套可编程的数据库系统,你需要先把数据库里的“参数”调好,再下达一个总体的综合指令。这两种设计哲学本身没有高下之分,但如果你习惯了DC的命令式思维,初接触Genus时会经常产生“我的设置到底生效了没有”的疑问。反过来,如果你一开始学的是Genus,再回过去看DC的脚本,又容易觉得DC的命令选项太多太杂,不知道从何下手。
这种差异还体现在帮助系统和报错信息上。DC的man命令和help命令很强大,点开就能看到某个命令的所有选项和示例,报错信息也一般会直接告诉你哪一步操作不合法。Genus则有不少报错是提示你某个属性值不合法或者数据库状态不对,更依赖你对底层数据模型的理解。所以新手学习时要注意,不要只背命令,先搞清楚这两种工具各自的“世界观”。
2.2 常用命令对应表:从DC切到Genus的48小时
如果你在公司里接手一个以前用DC、现在要改用Genus的项目,或者反过来,最实用的第一课就是做一张命令对照表。这里我整理了一份我自己常翻的常用命令映射,送给正处在切换期的人。
| 功能描述 | Design Compiler常用写法 | Genus常用写法 |
|---|---|---|
| 读取RTL文件 | read_verilog top.v或read_file -format verilog top.v | read_hdl top.v |
| 读取工艺库 | read_db std.db或set_app_var target_library | read_lib std.lib |
| 例化/链接设计 | link、uniquify | link_design |
| 设置当前设计 | current_design top | current_design top |
| 高层综合/逻辑综合 | elaborate、compile_ultra | synthesize -to_mapped |
| 生成时钟约束 | create_clock -period 10 -name clk [get_ports clk] | 同样使用SDC写法,但环境变量名不同 |
| 报告时序 | report_timing -path_type full | report_timing |
| 报告面积 | report_area | report_area |
| 写出门级网表 | write -format verilog -output top_gate.v | write_hdl top_gate.v |
| 写出约束 | write_sdc top.sdc | write_sdc top.sdc |
| 读入物理约束 | read_parasitics、read_def | read_def、read_parasitics |
这张表只是最粗略的第一层对应关系,足够帮你把一条最简单的综合流程跑通。但真正到了具体项目中,你会发现对应的细节多到让人头皮发麻。比如DC里读入设计后通常要link去检查所有例化单元的引用,而Genus用elaborate之后自动会做很多类型推断和库匹配,如果读库的次序不对,你可能得到一堆难以理解的消息。再比如DC里写出网表用write -format ddc可以保留额外的综合数据,Genus里则习惯用write_hdl搭配write_sdc完成同样的功能,语义上的差别需要你先理解两者内部的数据库表示方式。
2.3 脚本迁移里的隐藏坑:别把Tcl当万能胶
很多团队在复杂环境里同时维护两套综合时,会写一个统一的Tcl封装层,在内部根据工具类型调用不同的命令。这个思路没错,但要特别注意,Tcl脚本语言本身无法屏蔽工具在行为细节上的差异。你写了run_synthesis这样的函数,函数里根据工具判断是调用compile_ultra还是synthesize -to_mapped,看起来是统一了入口,但两个工具对相同SDC的解释差异、对相同工艺库的时序计算差异并不会因此消失。
我有一次要把一个老项目从DC迁移到Genus,最开始的脚本几乎就是逐行替换命令,结果同样的设计、同样的约束,DC报WNS是满足的,Genus报出来却是一个比较大的负值。一开始我以为是Genus的优化能力不够,后来才意识到是对一组生成时钟的处理方式不同。DC默认会沿用它对create_generated_clock的某些时序传播设定,而Genus则需要你显式声明-source和-divide_by等属性,否则工具对时钟边沿的推算就会和你的设计意图相去甚远。这个教训告诉我们,迁移脚本不是翻译命令,而是要重新审视设计约束在工具内部的语义。
所以,当你准备在新工具上跑通项目时,不要想着一次性把整份大脚本迁移成功,先拿一个最小的、有代表性的子模块,手工搭一条干净的全流程,确认时序报告、面积报告、网表结构和老工具的结果在合理范围内一致,再去规模化铺开。这是我反复试过很多次之后,觉得最稳妥的一条路。
3. SDC约束:同一份约束,两种翻译
3.1 时钟派生与latency计算的头号坑
SDC是Synopsys定义的标准设计约束格式,理论上讲,它应该是跨工具的通用语言。Cadence Genus也支持SDC,所以很多人以为“同一份SDC拿过来就能直接用”,但实际工程里没有这么理想。原因就在于,SDC规范只定义了约束的写法和基本语义,却没有规定每个关键字在不同工具内部应该以什么顺序计算时序顶点之间的延迟。两个工具在时钟源延迟、网络延迟、生成时钟关系、时钟不确定度的默认处理上,存在不少隐性差异。
最常见的坑出现在create_generated_clock。很多设计里用PLL输出时钟或者分频时钟,DC和Genus对这个时钟和主时钟之间latency的默认继承关系不同。你在一个工具里设置主时钟的set_clock_latency,生成时钟默认会继承一段延迟,在另一个工具里可能就必须显式给生成时钟也写set_clock_latency,否则工具会认为生成时钟的起始延迟为零。如果你项目里这类时钟特别多,又没做检查,最终综合出来的时序报告会误导你做出错误的优化决策。
我自己的习惯是,在新项目里不管用哪家工具,都会先花时间做一次最小规模的“约束冒烟测试”。选一个很小的模块,写几行最简单的时钟约束,分别用DC和Genus跑一遍,然后对比report_clock_timing里的clock arrival time和clock network delay。不要比面积和WNS,就比工具对同一时钟定义的解释。如果这里就对不上,后面的约束解析基本没法对齐。
3.2 时序报告里的字段差异:同样的路径,不同的说法
拿到综合报告后,新手最常做的事情是看WNS正不正、面积大不大。但真正要判断约束和设计是否健康,还得学会细读路径报告。DC的report_timing输出风格非常经典,它会把data path、clock path分开展示,从Startpoint的时钟沿开始,一行行列出cell delay、net delay,并标出transition和arrival time。Genus的report_timing也提供类似信息,但字段命名和排列方式会有些不同,比如有时候它把每一阶段的延迟拆成rise和fall两个维度详细列出,看起来比DC的默认输出更复杂。
还有一点值得注意,DC和Genus在报告qor时对“incremental delay”这类增量化延迟的注释方式不同。DC常用括号把每一段延迟的来源标出来,比如(d + u) 0.02之类的写法表示这段延迟是uncertainty还是derate;Genus则是通过独立的报告字段去体现这些量。如果你只会用一方工具,初次接触另一方的报告会觉得信息不好定位,这时候最实用的方法就是先找一条关键路径,从Startpoint到Endpoint手动加一遍,把每段的cell/net延迟加起来,看看和你读到的arrival time能不能对上。这样既能帮你熟悉报告字段,也能帮你排查工具之间在传播计算上的差异。
3.3 综合阶段的hold检查:到底该修到什么程度
数字设计里setup和hold是两大主要时序概念。综合工具通常会把主要优化精力放在setup上,也就是确保数据在时钟沿到来前已经稳定;hold检查在综合阶段一般只是做初步评估,不会追求完全修复。原因在于,hold违例在后端时钟树综合阶段可以用useful skew和buffer插入来解决,属于后端流程的职责范畴。前端综合阶段如果强行把hold全部修干净,反而会引入大量不必要的面积和功耗开销。
但是,这不代表综合阶段可以完全无视hold。尤其是采用了先进工艺节点、时钟不确定性偏大的设计,如果综合网表里hold违例已经大到离谱,后端要插入大量延迟单元来补,同样会把面积和功耗打爆。我的经验是,综合阶段主要关注三类指标:setup的WNS是否满足、DRV(max transition/max capacitance/max fanout)是否爆红、面积和功耗是否在预算内。hold违例在综合阶段可以记录,但不用太紧张,除非工具明确提示某些路径的hold slack是负得离谱的“结构化问题”,比如跨时钟域路径没设false path,那才是需要回头改约束和设计的大问题。
4. 综合优化策略与QoR收敛
4.1 DC的compile_ultra和Genus的synthesize -to_mapped
上了项目之后你会发现,综合工具能做的最基础动作只是“映射”,就是把逻辑函数用一种比较直接的方式映射到标准单元上。真正拉开它与新手脚本质量差距的,是工具的高级优化策略。
DC这边,compile_ultra是它的门面命令。它内部会经历一系列的架构级优化、逻辑级优化和技术映射优化,包括自动识别并优化超长组合逻辑链、寄存器重定时(retiming)以平衡流水线各段延迟、自动门控时钟降低动态功耗等。你可以给compile_ultra加很多开关,比如-retime激活寄存器重定时,-timing强调极端时序优化,-no_autoungroup控制工具是否把层次化的子模块自动打散来换取更高的优化自由度。这类选项用得好,能把一个原本关键路径420ps的设计压到350ps以下,但代价是综合运行时间变长,网表层次结构也可能变得很难看。
Genus这边的对应版本是synopsys环境之外的synthesize -to_mapped命令。它同样支持设置-retime、-map_effort high、-incr等参数,而且Genus在结构化设计优化上也有自己的特色。比如它可以在synthesize之前通过elaborate阶段就做大量高层次推断,包括状态机编码优化、数据通路的运算符共享、多路选择器的优先树重构等。我曾经在一个FFT处理器的蝶形运算单元上做过对比,同样的RTL和约束,Genus在面积上比DC的默认流程更优一些,但时序收敛所需要的调参难度反而更高。最终结论不是说谁一定更强,而是要看你的设计类型和团队熟悉度。
4.2 WNS/TNS/DRV:报告解读的正确顺序
很多新手第一次拿到综合报告,看到一堆WNS/TNS/FE分析之类的字眼就头大。其实报告qor是有固定解读顺序的,我建议按这个顺序来:先看时序总览,再看DRV,然后是面积和功耗,最后才是具体路径。
WNS表示最差负裕量,是整个设计里最不满足时序的那条路径的负多少值;TNS表示所有违例路径的负裕量总和。WNS为负时,一定存在真实的时序违例路径,要优先定位并处理。如果WNS是正的但TNS还有一个比较大的负值,说明可能只存在少数几条关键路径在边缘位置,重点去看这几条路径的路径类型和端点。DC的report_qor和Genus的report_qor都会给出这些汇总字段,但位置和命名略有不同,要快速抓取的话,可以用脚本解析日志文件。
DRV是指max transition、max capacitance、max fanout这类信号完整性问题。这些在综合阶段往往不会被人重视,但如果你忽视它们,后端布局布线后会出现大量时序收敛问题。我的建议是,WNS满足但DRV大面积爆红的网表,比WNS略差但DRV干净的网表更危险。因为前者的报表看起来好看,实际到了后端,每一条DRV违例都会变成一系列buffer插入和单元替换,最终让面积功耗全面失控。综合阶段你应该尽量把DRV控制在合理范围内,哪怕WNS稍微牺牲一点,也比给后端埋雷强得多。
4.3 综合时序收敛的调优顺序,别一上来就加约束
时序不收敛时,很多新手的第一反应是继续提高优化力度,比如把map_effort从medium改成high,或者打开更激进的retiming。这条路有时候有效,但它不是唯一的解法,也不一定是正确的起点。
我的调优顺序大致是这样的。第一步,先回头检查约束本身的合理性。是不是把一些不该约束的路径约束过死了?异步跨时钟域路径有没有正确设置set_false_path?组合逻辑的input/output delay是否与实际接口时序一致?很多所谓“不收敛”,本质上是约束把工具逼到了一个不可能完成的任务上。第二步,打开关键路径报告,看是什么结构导致延迟这么大。如果是一串几十级组合逻辑,考虑能不能在RTL里插入流水寄存器;如果是net delay占比过高,说明单元摆放和布线拥塞可能有问题,需要检查floorplan或者改用物理综合模式。第三步,再去调工具的综合策略。第四步,如果还不行,就要从系统架构上检讨,比如时钟频率是否定得过高、模块分区是否合理。
这个顺序说起来简单,但很多工程问题恰恰是倒着来的:先开高优化力度猛跑,碰壁了才回头查约束和架构。等你用这种正向顺序处理完一个复杂设计之后,你才会真正体会到,综合工具只是一个翻译器,它的天花板其实是由RTL质量、约束准确度和物理环境共同决定的。
5. 物理综合与后端衔接:从门级网表到布局布线
5.1 DC Topographical模式与Genus物理综合
传统的逻辑综合在优化时序时,用的是基于线负载模型估算出来的net delay。这种估算和实际布局布线后的情况差距可能非常大。为了解决综合网表与后端实现之间的割裂,两家工具都推出了物理感知综合能力——DC这边叫Topographical模式,Genus那边则叫物理综合或Physical Synthesis。
DC的Topographical模式会读取floorplan信息,在综合过程中调用工具内部的快速布局和寄生参数估算引擎,让时序优化更贴近真实物理环境。使用方式通常是在compile_ultra之前设置使用Topographical模式,并提供floorplan的DEF文件或让工具自动生成一个初步布局。这样做的好处是综合网表在拥塞、线长、transition方面的估计更准确,后端布局布线阶段出现大范围时序漂移的概率会大幅下降。
Genus的物理综合思路类似,通过set_db design:... use_physical_synthesis true这样的方式启用。启用后,工具会在综合映射的同时做quick placement和全局布线估计,并基于真实粗略走线去评估时序。实测下来,在floorplan相对合理的前提下,物理综合出来的网表确实比纯逻辑综合的结果要“结实”得多,尤其是包含大量存储器、多路复用器和长距离数据通路的模块。
但物理综合不是银弹。如果floorplan本身不合理,或者模块边界上没有考虑数据流向,物理综合再强也只是在一个不合理的图纸上做预测。我的经验是,物理综合适合在项目后端设计已经有一定基础后跑,也就是你已经有了一个像样的floorplan版本。如果还在芯片架构早期,连大致面积估算都没做出来,纯逻辑综合拿到的趋势数据其实更有参考价值。
5.2 交付后端时该给哪些文件
综合做完之后,你交出去的不能只是一个网表就完事。一份完整的综合交付包至少应该包含:门级网表、更新后的SDC时序约束、UPF低功耗约束(如果有)、综合后的面积/功耗/时序报告、以及所有需要后续工具读取的参考文件。DC流程里,你可能会写出.ddc格式的文件,这种格式能保留大量综合过程数据,方便后端工具快速导入;Genus流程里,则习惯用write_hdl输出网表,配合write_sdc输出约束,必要时再加上write_parasitics输出寄生参数。
这里有个很实际的提醒:交付前一定要做一致性检查。我见过不止一次,新人把约束改了,但忘了重新综合一遍就发出来,导致后端的SDC和网表不匹配,在后端跑出大量莫名其妙的违例。更严重的情况是,有些工具在网表里做了逻辑优化后,网表功能已经和RTL不完全一一对应了,如果没有用形式验证工具做过等价性检查,后端拿到一个功能有问题的网表还在上面做物理实现,最终只能回头返工。所以交付时至少要确认三个点:网表能正常link没有悬空单元、SDC里的每个时钟端口在网表里都能找到、形式验证结果正确。这三步都过了,再把文件交给后端,才是负责任的做法。
5.3 双工具流(dual flow)的价值与挑战
有一些公司会同时维护DC和Genus两条综合流程,这通常不是因为工具选择困难症,而是有意为之。双工具流的价值主要在于correlation检查:同一个RTL、同一份标准单元库、同一份SDC,两个工具各自综合后,后端会对比两条流出的关键路径、congestion热点和DRV分布,帮助判断哪些违例是设计本身固有的,哪些只是某家工具的模型偏差。这种情况下,logical synthesis工程师需要同时掌握DC和Genus两套流程,这也是为什么这个方向的从业者在市场上一直很吃香。
不过双工具流也有它的麻烦。最直接的问题是维护成本高,同一份RTL和约束在两个环境里各跑一遍,脚本要维护两套,回归测试要跑两遍,报告格式还不一样。我参与过的最折腾的一次双工具流项目里,我们甚至要额外写一个报告解析脚本,把两家工具的输出统一成一套内部报表格式,才能让前后端坐在一起看同一份数据。所以如果你刚入行,看到团队里同时有两条综合流程,不要抱怨麻烦,那其实是提高你工具理解水平的一次绝好机会。
6. 新手的选型与学习路线
6.1 不要问“哪个更强”,要问“你的flow是哪个”
很多初学者会纠结:到底学DC还是学Genus?答案很大程度上取决于你所在的学校和公司。如果实验室用的是Cadence全线工具,那你学Genus能获得的环境支持和生态配套是最好的;如果公司后端是用ICC2的Synopsys流,那DC几乎是必然选择。工具本身没有绝对的优劣,关键在于和上下游的匹配度。你在招聘网站上看到的职位要求,很多也只会写“熟悉Synopsys DC或Cadence Genus中的一种”,真正到了项目里,团队用什么是定死的。
所以我建议新手不要花太多时间在论坛上争论两家谁强谁弱,而是尽快弄到一套能跑通的工具环境,把基本流程跑起来。如果你还在学校,看看实验室有没有相关的license,多和做项目的师兄师姐接触;如果已经工作了,千万别嫌综合脚本无聊,把它当成最好的学习材料。真正理解一个综合工具,靠的不是看文档,是动手跑设计、看报告、调约束,然后下一次遇到违例时你才会有“这个坑我好像见过”的直觉。
6.2 从零上手的一条实用路线
这里给你一条我梳理过很多遍的学习路径,每一步都可以拆开来练。
第一步,准备一个小而完整的RTL设计。别一上来就跑大模块,一个简单的ALU或者一个深度16的FIFO足够了。设计要包含时钟、复位、组合逻辑和几个触发器,最好能有一组跨模块的信号。
第二步,准备一套工艺库。如果学校或公司有原有的.lib和.db文件,直接用;没有的话,可以先找一套可用的开放库或者简化模型库。关键是库文件要和约束文件能对应上,别乱配。
第三步,先跑通DC的完整脚本。从read_verilog到link到compile_ultra到report_timing,把报告从头到尾读一遍,弄懂每个字段的含义。不需要背命令,但要能看懂这一串脚本是在干什么。
第四步,把同一份RTL和约束换成Genus环境跑一遍。这时候你会立刻感受到命令体系差异带来的冲击,但别怕,这就是你理解两个工具设计哲学最好的时机。对比两份报告,看看在同样的约束下,两个工具给出的WNS、面积和功耗有哪些出入,试着解释原因。
第五步,做约束练习。自己动手创建时钟,配置set_input_delay和set_output_delay,加set_false_path和set_max_delay,然后重新综合,观察这些约束变化对WNS和关键路径位置的影响。这是培养时序思维最有效的一步。
第六步,进阶到多时钟域和低功耗设计。试着在一个设计里加入两个不同频率的时钟域,用set_clock_groups或set_false_path处理好跨时钟域路径。再试着读入UPF约束,观察综合工具如何在多电压域的约束下优化设计。
整个流程走下来,你至少能在命令层面和报告层面同时理解DC和Genus,也能把它们各自的生态位讲清楚。这个过程不需要花很长时间,但它的价值会在你真正进入项目之后慢慢体现出来。做综合这件事,关键不在你为哪家公司站台,而在于你能不能在不同工具之间快速找准问题所在,毕竟数字IC这个行业,换工具、换流程、换工艺节点是常态,唯一确定的就是变化本身。