ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数字IC综合实战:dc_shell报告命令深度解析,report_cell与report_timing从入门到精通

数字IC综合实战:dc_shell报告命令深度解析,report_cell与report_timing从入门到精通 做数字IC综合很多人第一步卡在dc_shell的迷宫一样的命令堆里。尤其是report_cell、report_timing这类报告命令看起来简单真到项目里一跑全是细节选项怎么选、报告怎么看、哪一列对应什么问题、为什么报出来的数据和后端对不上、为什么同一个设计有时候报告结果还不一样。这篇文章我把DC里用频率最高的一批报告命令掰开揉碎讲一遍重点放在report_cell和report_timing的实战用法上同时也把report_area、report_qor、report_constraint这些常用兄弟命令的坑给你填平。写这篇东西的初衷是带新人时发现一个共性问题大家都会敲report_timing但拿到上百条路径之后完全不知道下一步该干嘛或者看report_cell只盯着面积列忽略了单元数量、库单元分布、逻辑级数这些真正有用的信息。这篇文章就是给那些已经能跑通综合、但还没真正读懂报告的人准备的。我会把命令选项、报告字段、实战定位问题的方法串起来讲都是我在项目里踩过之后留下的经验。1. 报告命令的整体设计思路先想清楚你要解决什么问题dc_shell里的报告命令有好几十个但真正高频的就那几个。很多人习惯一股脑把报告全打开然后盯着满屏数字发呆。我的习惯正相反先明确这次综合的诉求再去挑对应的报告命令。1.1 报告命令的分层逻辑DC的报告命令大致能分成三个层级这个分层思路是理解DC报告体系的关键。第一层是全局面貌。report_qor、report_area、report_timing_summary、report_analysis_coverage这类命令用来回答“这版综合结果大致行不行”的问题。它们给出的是一坨汇总数据最差负裕量WNS多少、总负裕量TNS多少、面积多大、有没有违规路径。这一层适合在综合跑完后第一时间看快速判断是否需要进入下一层。第二层是模块/时钟域视角。report_timing、report_clock_timing、report_constraint这些命令按时钟域、按模块、按路径类型把关键路径拆出来用来回答“哪条时钟域的路径最紧”的问题。这一层通常是在全局面貌里有问题时才去做。第三层是单元级视角。report_cell就落在这层用来观察模块里具体库单元的数量、面积、状态回答“我这个设计到底被综合成了什么结构”的问题。理解了分层之后再决定跑哪些命令你至少不会在刚综合完就一头扎进report_timing的几百行输出里出不来。1.2 报告输出与信息落盘的实操习惯DC交互式跑报告很容易犯一个错直接在shell里输出结果窗口刷屏后关键数据全找不到了。我建议从一开始就养成把报告落盘的习惯。# 交互式跑完综合后直接落盘保存报告 report_qor reports/${DESIGN}_qor.rpt report_timing -delay_type max -max_paths 100 -path full reports/${DESIGN}_setup.rpt report_timing -delay_type min -max_paths 100 -path full reports/${DESIGN}_hold.rpt report_cell -columns {name area cell_id} reports/${DESIGN}_cell.rpt命令行里直接重定向比在DC内部用redirect命令写文件要直观得多。文件名里带上设计名、场景、时间戳避免多版本综合之后报告互相覆盖。提示跑完综合先别急着quit把报告全部落盘再退出。重新打开dc_shell再读design恢复报告没问题但绕远路了直接保存最省事。1.3 报告命令的共享选项模式DC报告命令虽然各自功能不同但选项设计上有很多通用模式。掌握这些模式学新报告命令的成本会低很多。第一个通用模式是-hierarchy。几乎所有报告命令都支持这个选项打开后会把层级边界也呈现出来每个子模块的数据单列一行顶层有汇总。这对于定位“哪个子模块拖累了整个设计”非常有效。第二个通用模式是表格列定制。report_cell -columns、report_area -hierarchy -sort_by这类选项本质上是让你决定“表格里出现哪些列、按哪一列排序”。刚接触DC时可能不知道有哪些列可选你可以用report_cell -columns按回车会打印出所有合法列直接用这个方法去摸。第三个通用模式是路径数量限制。-max_paths和-nworst这两个兄弟选项经常一起出现。很多人以为它们是一回事其实不一样。-nworst是指同一个端点endpoint下输出几条最差路径-max_paths是总共输出几条路径。两个组合起来才能精确控制报告规模。2. report_cell单元级信息的透视镜report_cell是很多人忽略的一个命令但它对理解综合结果、定位面积异常、排查单元例化问题非常有用。我每次综合完必跑一份report_cell哪怕不细看也要扫一眼数量级。2.1 report_cell基础用法与字段解读先看最基础的用法report_cell不加任何选项时DC会把当前设计里的所有单元做一个汇总默认列出每个单元的名称、库单元名、面积。输出大概长这样Library Cell Area Cell Ref Count (um^2) ------------------------------------------------------ u1 NAND2X1 1 2.80 u2 INVX1 1 1.40 u3 DFFX1 1 5.60注意这个输出是按单元例化名逐个列出的不是按库单元类型汇总。设计大了以后输出会非常长所以实际操作中很少直接裸跑report_cell一般都会加选项。report_cell里最重要的选项是-columns它决定了表格里出现哪些信息列。我常用的组合是report_cell -columns {name ref_name total_area cell_count}这里total_area是整个例化单元的总面积cell_count是该库单元类型的数量。这样你能一眼看到“这个设计里哪种单元用了多少面积、多少个”。如果你要查某个具体单元的详细信息用-cell选项指定report_cell -cell u_middle/u_reg_0这会输出该单元更详细的信息包括引脚的电容、transition time、是否dont_touch等。这个在定位“某个单元为什么timing这么差”时很有用。2.2 从report_cell里抓面积分布与结构异常真正用report_cell做面积分析时直接看全部单元列表没意义因为设计里可能有几万甚至几十万个单元。正确做法是先做层次化汇总再往下钻取。report_cell -hierarchy打开-hierarchy后输出会按层级组织每个子模块一行列出该模块的单元总数和总面积。这样你能快速定位到面积占比异常大的子模块。接着对嫌疑模块单独跑report_cell -hierarchy u_middle report_cell -cell u_middle/*这里用通配符把模块里所有单元拉出来按面积排序后就能看到最大的几个单元是什么。我遇到过一次面积异常的问题就是用这个办法找到某个模块里综合出了一个面积特别大的多输入寄存器堆后来发现是RTL写法导致综合器推导出了不该有的结构。report_cell还有一个冷门但好用的列cell_id。这个列显示的是库里单元的名称比如NAND2X1、DFFQXL这种。通过cell_id你能看出设计里用了什么类型的标准单元是不是大量使用了某种特殊单元。比如一个纯粹的逻辑模块如果看到大量AOI、OAI这类复合门那说明综合工具优化得比较深入如果全是基础门说明综合的映射策略可能有问题。2.3 report_cell的兄弟命令report_area与report_designreport_cell负责单元级细节但面积维度的整体情况通常看report_area更直接。report_area -hierarchyreport_area -hierarchy输出每个子模块的组合逻辑面积、非组合逻辑面积寄存器/存储器、连线面积、总面积。注意这里的面积是DC的估算面积和后端布局布线后的物理面积会有差别但用于综合阶段对比优化效果是够用的。report_area和report_cell配合使用的场景是report_area发现某模块面积异常增长然后用report_cell -hierarchy往下钻定位到是哪个库单元类型变多了。比如我之前做过一个模块report_area显示非组合逻辑面积比预期大很多report_cell -hierarchy一看发现有一批DFFQXL被综合成了DFFQDXL——库里的延迟单元面积更大但时序更好。这其实是DC为了满足某个很紧的时序约束偷偷做的优化如果这个模块对面积更敏感就需要回去调整约束或者禁用某些库单元。report_design也能补充信息report_design它会列出设计名、所属库、端口数量、单元总数相当于设计的“户口本”。在检查综合结果是否对应到正确顶层时这个命令非常实用——我有一次综合脚本跑完了才发现顶层选错了就是因为没跑report_design。2.4 report_cell的实战经验别只盯着面积report_cell看起来是面积报告但我在实际项目中用得更多的是它排查单元问题的能力。以下是我实际用过的三个场景场景一是检查dont_touch是否生效。设计里对某些模块设置了set_dont_touch但综合结果里发现这些模块的层次被优化掉了用report_cell看目标模块是否还存在、是否被展开比看网表快得多。场景二是排查单元实例丢失。比如RTL里显式例化的某个特殊单元如时钟门控cell综合后不见了。用report_cell -cell直接搜索该例化名马上就知道它还在不在、被映射成了什么。场景三是观察综合质量。对一个纯组合逻辑模块跑report_cell -columns {name ref_name area}如果发现大量单元是BUF、INV这类低逻辑功能的单元说明逻辑化简不彻底可能是代码写法有问题也可能是约束里设置了奇怪的set_optimize选项。3. report_timing时序分析的看家本领report_timing是整个DC世界里最重要的报告命令没有之一。时序签核、综合优化、STA验证全靠它来呈现结果。但从命令输出到真正理解时序约束是否满足中间还有很长的路要走。3.1 report_timing常用选项与路径筛选先看一个实际项目里最常见的组合report_timing -delay_type max -max_paths 100 -nworst 3 -path full我来逐项解释这些选项的作用。-delay_type max表示报告setup时序路径-delay_type min表示报告hold时序路径。不指定时DC默认是max。综合阶段setup比hold更常被关注因为setup违规通常更严重而hold问题一般由后端修复但作为前端你仍然需要让DC把hold违规控制在可接受范围内。-max_paths 100表示总共输出100条路径。-nworst 3表示每个endpoint最多输出3条路径。注意这个组合的效果假设时序报告里有50个endpoint满足最差条件那么DC会从每个endpoint里各挑出最多3条填满100条路径。如果不加-nworstDC默认每个endpoint输出1条路径。如果只加-nworst不加-max_paths那你可能看到几百条路径刷屏。-path full表示显示整条路径的所有时序弧。默认情况下DC只输出摘要路径信息不会列出路径上每个cell的延迟。-path full会把launch clock路径、data path、capture clock路径全部展开。做详细时序分析时这个选项几乎是必须的。筛选特定路径用-from、-to、-throughreport_timing -from [get_clocks clk_a] -to [get_clocks clk_b] report_timing -from [get_pins u_top/u_reg_0/CK] -to [get_pins u_top/u_reg_1/D] report_timing -through [get_nets data_valid]这三个选项可以任意组合用来精准定位某类路径。特别要说的是-from可以接时钟名也可以接引脚名。接时钟名时DC报告的是所有被这个时钟驱动的起点到终点之间的路径接引脚名时则只报告从这个引脚出发的路径。这个区分很重要用错的话报告范围会差很多。3.2 一份完整的setup时序报告怎么读下面用一份典型的setup时序报告来拆解阅读方法。注意看字段位置和判断顺序。Startpoint: u_top/u_reg_0 (rising edge-triggered flip-flop clocked by clk_a) Endpoint: u_top/u_reg_1 (rising edge-triggered flip-flop clocked by clk_a) Path Group: clk_a Path Type: max Delay Time Description ---------------------------------------------------------- 0.00 0.00 clock clk_a (rise edge) 4.00 0.00 4.00 clock network delay (ideal) 4.00 0.10 4.10 u_top/u_reg_0/CK (DFFQXL) 0.25 4.35 u_top/u_reg_0/Q (DFFQXL) 0.30 4.65 u_top/U1/A (NAND2X1) 0.32 4.97 u_top/U1/Y (NAND2X1) ... 0.20 7.50 u_top/u_reg_1/D (DFFQXL) data arrival time 7.50 0.00 8.00 clock clk_a (rise edge) 8.00 0.00 8.00 clock network delay (ideal) 8.00 0.00 8.00 clock reconvergence pessimism 0.00 8.00 - u_top/u_reg_1/CK (DFFQXL) library setup time -0.10 data required time 7.90 ---------------------------------------------------------- data required time 7.90 data arrival time -7.50 ---------------------------------------------------------- slack (MET) 0.40读这份报告的顺序我建议是从下往上读。先看最后的slackMET还是VIOLATED心中有个数。然后看Path Type确认是max还是min。接着看Startpoint和Endpoint确认路径的起点和终点是谁、属于哪个时钟域。最后再逐行看data arrival和data required之间的差值是怎么拉开的。有些细节需要额外注意。第一clock network delay那行写着(ideal)。这意味着时钟网络被当作理想模型处理没有实际延迟。在综合阶段这是合理的因为时钟树还没布但你要知道到了后端CTS之后这里的数值会被替换成真实的时钟网络延迟。第二data arrival time是从launch clock edge开始逐级累加cell delay和net delay得到的。data required time是从capture clock edge反推的在capture edge时刻减去库里的setup time得到数据必须稳定到达的时间。两者相减就是slack。正值为裕量MET负值为违规VIOLATED。第三报告里的clock reconvergence pessimism这是时钟路径重新汇聚时的悲观度消除值。通俗理解就是时钟分支路径共享的那一段延迟不应该被重复计算两次所以加回来。这个值在综合阶段因为时钟是理想模型通常为0但后端的STA报告里会有明显数值。3.3 setup与holdmax和min的差异report_timing -delay_type max是setup分析report_timing -delay_type min是hold分析。两种分析的计算方式正好是反过来的。setup检查的目的是保证数据在capture edge之前稳定到达。计算方式是launch edge时间为T0capture edge时间是T0T。数据路径的时间预算就是T减去时钟skew再减去库元件的setup time。所以setup违例的常见原因包括数据路径逻辑级数太多、时钟skew不合理capture clock比launch clock早到、库单元驱动能力不足导致transition变差。hold检查的目的是保证数据在capture edge之后不会立刻变化也就是数据在capture edge之后还要稳定保持一段时间。计算方式是launch edge时间为T0capture edge时间还是T0或者接近T0那么数据路径的延迟必须大于hold time要求。如果数据路径太短比如只是两个寄存器直接相连中间没有逻辑就很容易出现hold违例。这个在DC综合阶段通常不会太严格因为时钟树还没做时钟skew为0时hold违例更多是由短路径触发的。实际项目里我提交综合会同时跑两份报告report_timing -delay_type max -max_paths 500 -nworst 5 -path full report_timing -delay_type min -max_paths 500 -nworst 5 -path full一份setup一份hold都存网表配套的报告目录里。这样后端拿到网表时能快速对齐顶层时序预期。3.4 从时序报告反推优化动作报告不只是用来看的更重要的是看完之后知道该去动什么。我总结了一套从report_timing输出反推优化方向的经验。首先要看slack数值的大小。如果WNS只有-0.05ns这种微违例大概率可以通过约束微调、面积优化、或者允许DC多跑几轮自动修复解决。但如果WNS已经到-1ns以上说明是结构性问题要么是RTL逻辑级数太深要么是约束要求本身过于激进要么是某个关键路径上的单元驱动能力不足。结构性违例靠DC综合器的自动修复基本无解必须回到RTL层面改设计。其次要看违例路径上的逻辑级数。在-path full输出下数一下中间经过多少个cell。综合阶段2GHz以下的时钟设计单条路径经过15-20级逻辑算较深了如果某条路径只有5-6级逻辑但仍然违例那问题不在逻辑深度而在单元驱动能力或net delay过大。再次要看slack的分布。report_timing -max_paths 100输出的100条路径如果每条slack都差不多说明设计整体偏紧约束的时钟周期有问题如果只有少数几条路径特别差那就是少数逻辑路径的问题。两类情况处理方式完全不同前者需要调约束或改架构后者只需要针对性优化。最后要说一个几乎所有新手都会踩的坑看到setup违例就试图靠减小set_input_delay/set_output_delay来解决。这个思路恰恰颠倒。约束里的input/output delay是外部逻辑的时序要求不是你可以随便调来消违例的。它反映的是芯片外部接口的真实时序特性调错会导致实际流片后接口不稳定。正确做法是如实描述外部时序环境然后去优化内部逻辑。3.5 skew、transition与library setup time的影响时序报告里还有几个容易被忽略但影响巨大的数值。第一个是transition time。默认情况下DC在综合阶段会把transition设置为一个理想值或由库里的驱动/负载模型计算。如果报告里某个cell的输出transition特别大比如超过该库单元的max_transition约束值下游cell的delay会急剧恶化。定位方法在-path full输出里找delay增量明显异常的段落。比如前几级cell每级都是0.02ns的delay突然某级变成了0.15ns那这一级大概率就是transition退化的位置。第二个是library setup time。报告里library setup time是库里定义的寄存器D端相对于CK端的时间窗。不同库单元的同功能寄存器setup time可能差不少。如果一个设计里大量使用相同功能的寄存器可以通过在综合时更换库单元或让DC使用更高速的库来改善slack。这个需要你懂一点库的特性。第三个是时钟路径上的延迟不匹配。综合阶段时钟是ideal所以launch和capture的clock network delay都是0这相当于“理想skew0”。但后端CTS之后时钟树有真实的latency和skewsetup和hold的数值都会变化。这也是为什么前端综合的时序结论不能直接作为流片签核依据一切都以布局布线后的STA为准。4. 报告命令全家桶别再只会report_timingreport_timing虽然核心但整个综合报告体系是多个命令配合使用的。很多新人只盯着report_timing看到slack过了就高兴其实忽略了功耗、面积、约束覆盖度等一系列同样重要的指标。这一节把DC综合阶段实用度最高的几个报告命令过一遍。4.1 report_qor一页纸看全综合质量report_qor是我综合完必跑的第一个报告命令没有之一。它不是单纯报告某一方面而是把时序、面积、功耗、单元数量、库单元利用率汇总在一起一页纸看完全局。report_qor输出里最重要的几块是Design小结、Cell Count、Area、Setup WNS/TNS、Hold WNS/TNS、Power。其中Setup/Hold的WNS和TNS是所有指标里最重要的。WNS是“最差负裕量”如果为负说明至少有一条路径时序不满足TNS是所有违例路径的裕量总和反映了整体违例的严重程度。看report_qor有个习惯先看WNS/TNS再看面积和功耗。如果WNS是正的面积和功耗在可接受范围这版综合基本就可以交付给后端了。如果WNS是负的后面看report_timing定位具体路径。4.2 report_constraint与report_clock检查约束是否真的被认到很多人的综合做完了时序报告也出了结果发现结果出奇地好或出奇地差这时最需要检查的就是约束是否被DC正确识别。工具不会问你“这个约束合不合理”它只会忠实地使用你给的约束不合理是你的事。report_constraint -all_violators是个有极端价值的命令report_constraint -all_violators它会把所有不满足的设计约束全部列出来包括setup、hold、transition、fanout、capacitance等。很多时候你盯着report_timing看没发现问题转头一看这个报告发现有transition违例或max_capacitance违例。这两类违例是影响芯片可靠性的重要因素但不会直接体现为setup/hold的slack违例。report_clock用来核对时钟定义report_clock它会列出设计中所有的时钟包括名称、周期、波形、是否generated clock。我遇到过的情况RTL里明明有一个分频时钟但综合时忘了设create_generated_clock导致report_timing里所有和这个时钟相关的路径都被错误分析。跑一次report_clock就能发现问题。4.3 report_analysis_coverage你的路径都分析了吗report_analysis_coverage是很多人完全没注意过但实际很有用的报告。它统计的是时序分析中“被覆盖”的路径比例。report_analysis_coverage输出里会有一个覆盖率百分比比如98.7%。这个数字表示设计中所有的寄存器到寄存器路径、输入到寄存器路径、寄存器到输出路径、输入到输出路径中有多少比例被时序分析引擎实际分析到了。正常情况下覆盖率应该在95%以上。如果发现覆盖率显著偏低可能是因为存在未约束路径unconstrained paths。比如某条路径上的起点或终点没有有效的时钟约束DC不知道该怎么分析它就会跳过。这种情况很危险你以为时序全过了其实有一部分路径根本没人管。处理办法是用report_constraint的unconstrained_path类别查看具体是哪些路径。4.4 report_power别等后端才后悔功耗爆了综合阶段功耗报告虽然精度有限但用来做功耗趋势对比已经足够。最常用的命令report_power -hierarchy输出会按层次列出每个子模块的内部功耗、开关功耗和漏电功耗。对功耗敏感的设计比如电池供电设备这套报告配合不同场景的约束文件比如高功耗场景、低功耗场景可以帮你在综合阶段就发现功耗热点。注意一个要点report_power依赖于信号活动信息。如果没有用read_saif读入真实的翻转率文件DC会使用默认的活动因子报告结果偏差会比较大。因此功耗数字更适合自己和自己比别直接拿默认数据当最终功耗结论。4.5 报告机器解析让工具帮你算关键数字时序报告动辄几百行人肉查找数值效率太低。我常用Tcl脚本把报告里的关键数据提取出来做自动化对比。核心思路是利用sh命令循环跑综合并提取WNS、TNS、面积。举例假设你要比较几个不同约束参数对综合结果的影响可以写这样一个脚本循环跑for f in scenario1 scenario2 scenario3; do dc_shell -f run.tcl -x set SCENARIO $f /dev/null 21 grep -E ^(WNS|TNS|Total Area|Cell Count) reports/${f}_qor.rpt done如果你不想依赖bash脚本也可以用DC自带的Tcl界面来获取指标set wns [get_attribute [get_timing_paths -delay_type max -max_paths 1] slack] puts WNS $wnsget_timing_paths拿到最差路径再用get_attribute读取它的slack属性全程不需要解析文本。这个方法在跑自动化优化脚本时特别有用可以实时判断优化是否有效。5. 常见问题与排查技巧实录报告命令用多了总会遇到一些没有明确报错但输出结果令人困惑的情况。这里把最常遇到的几类问题整理出来顺便给出排查思路。5.1 为什么report_timing没有任何输出这是新手最容易慌的问题。时序报告空白先别怀疑工具坏了大概率是以下原因之一。最常见的原因是没有定义时钟。DC的时序分析以时钟为锚点如果设计里没有时钟它根本不知道该分析谁到谁。用report_clock确认是否有有效时钟没有就补create_clock。另一个常见原因是路径不完整。比如你使用-from和-to时指定了具体的点但这两个点之间本身就没有时序路径报告自然空白。可以用report_path配合-from/-to检查是否存在路径。还有一类情况是路径被设置为false_path或disable_timing。如果你之前对这条路径设置了异常DC会直接忽略它报告里不会出现。用report_timing -path full -exceptions可以看看当前design里的时序例外。5.2 extracted时钟和propagated时钟对报告的影响综合阶段时钟网络默认是idealreport_timing里的clock network delay基本都是0。但某些特殊情况下你可能启用了时钟树的早期预估比如set_clock_tree_options或CTS前的特殊脚本这时代入的时钟延迟是预估的并不准确。关键提醒综合阶段的时序报告永远是“近似”的不要把它当作最终时序结论。有经验的方法是同样一份网表用PrimeTime做一次基于SPEF的STA看到的结果才算数。DC报告的主要价值是快速迭代和发现结构性问题而不是替代签核。5.3 多条路径违规但WNS只有几十皮秒该不该慌这个问题的答案取决于项目阶段。如果是综合早期WNS为负数但绝对值很小比如-0.03ns并且多数路径接近满足那说明整体设计是健康的可以通过小范围优化、约束微调或驱动加强解决。如果综合已经进入签核阶段WNS仍然有量级不小的负值那就不能指望后端来修了——后端能修的时序修正范围很有限而且会带来额外的面积和功耗代价。判断“结构性问题”还是“局部性问题”的另一个手段是看违例路径是否集中在同一逻辑区域。如果100条违例路径全部穿过同一组单元那大概率是那组单元所在的模块有设计缺陷比如复杂的组合逻辑没有流水化。如果违例路径散落在各模块那大概率是约束整体偏紧需要重新审视全局约束设定。5.4 报告数值和后端对不上是怎么回事综合报告里的面积和后端算出来的面积不一致、时序报告的slack和后端不一致这种问题是所有项目都会遇到的。原因很简单工具不同、模型不同、环境不同。面积差别的来源是DC用线负载模型估算连线面积后端布局布线用真实物理信息计算。所以DC的面积从来都是“估”的后端才是“算”的。时序差别来源更多综合阶段时钟ideal、没有时钟树、没有考虑布线拥塞、库的derate设置不同。正确的处理方式不是纠结数字能不能对上而是保证趋势一致。综合阶段WNS -0.05ns后端STA结果在CTS后变成0.2ns完全不奇怪。但综合阶段WNS -0.5ns后端说0.8ns那就有问题了说明前端约束里对时钟、端口延时的描述和后端实际输入不一致。5.5 如何利用报告快速对比两版综合结果项目迭代中“这版比上版好/差”是每天的日常。做法是保存每版的报告写一个简易脚本对比关键指标。我的对比模板通常是echo QoR comparison for tag in v1.2 v1.3 v1.4; do echo --- $tag --- grep -E WNS|TNS|Total Area|Total Power reports/${tag}_qor.rpt done不用做得太复杂能自动把WNS、TNS、面积、功耗四个数拉出来就行。这四组数字已经能覆盖绝大多数综合版本的优劣判断。更细的对比再单独开report_timing看差异路径在哪里。6. 报告驱动的综合迭代从数据到决策的习惯文章最后聊一个方法论层面的习惯。我在带新人的时候反复强调一个观点综合的本质是迭代迭代的本质是对比对比的基础是报告。6.1 每次综合都必须保存哪些报告我个人的习惯是每次综合跑完至少保存五份报告report_qor、report_timingmax/min各一份、report_area -hierarchy、report_constraint -all_violators、report_analysis_coverage。这五份报告足够回答“综合结果行不行”这个最核心的问题。文件命名一定要有版本号和时间戳别用report_final.rpt这种名字。项目周期一长你会同时有十几个版本的报告命名不清会让对比变得极其痛苦。6.2 报告与RTL代码的联动报告看完不回去改RTL等于白看。典型的联动动作包括时序报告的违例路径对应到一个逻辑层级过深的组合逻辑块考虑在RTL里插入流水寄存器面积报告发现某个模块面积异常回去审视RTL里是否写入了不必要的逻辑功耗报告发现某个模块开关功耗占比异常高检查是否有多余的信号翻转。我自己通常会在综合报告中标注对应的修改位置比如在report_timing违例路径最前面加一行注释说明这版是在RTL的哪个文件哪一行做的修改。这样两个星期后再看到这份报告你依然能回忆起当时的决策背景。6.3 把报告能力变成团队资产如果团队里不只你一个人做综合建议把常用报告命令整理成一份脚本模板统一输出目录结构和文件名规则。报告命令本身不复杂但不同人的使用习惯会导致报告格式五花八门给后端对齐数据带来额外成本。统一模板之后不光你自己看得舒服跨人交接也顺畅很多。模板脚本里可以固定加上redirect记录日志、报告落盘的路径变量、关键指标自动提取的Tcl片段。这些都属于一次投入长期收益的工程习惯。我在实际项目中还发现一个很实用的小技巧用DC的Tcl接口直接拿关键指标而不是从报告文本里grep。因为文本解析对格式变化很敏感而get_attribute [get_timing_paths ...] slack这种接口拿到的数据是结构化的不会因为报告版式改变而失效。这也是从“会看报告”到“会用报告做自动化”的分水岭。
返回列表