芯片项目做到中后期,最怕一句话:功耗超标了。早几年我们一个团队,RTL阶段完全不看功耗,综合后一算,数据通路某段的动态功耗直接顶破了预算,后端砸了大半个月做降频、插门控、调电压域,代价极高。痛定思痛之后,我们把功耗评估整体前移,直接在RTL阶段用Synopsys SpyGlass做功耗估计,第一轮就能定位到高功耗模块、异常翻转信号和时钟门控缺失的位置,后期返工量明显下降。这篇就把这条流程完整讲讲——从为什么要在RTL阶段算功耗,到SpyGlass原理、完整实操、报告解读、避坑清单,一次写透。适合做芯片前端设计、验证或功耗方案的同学参考。
1. 为什么要把功耗估计提前到RTL阶段
1.1 后端再回头改RTL,代价实在太高
功耗问题最怕晚发现。门级网表出来之后,功耗超标了,传统思路是降电压、降频率、换低功耗单元库,或者在后端做时钟门控微调。但这些手段都有副作用:降频影响性能,调电压要重新过时序签核,换库要重跑一整轮实现流程。真到了这一步,项目组往往只能硬着头皮把超标模块里几个大户的RTL重写一遍,然后重新综合、重新布局布线,一个来回就是几周。
我见过一个做MCU的项目,总线矩阵里的仲裁器动态功耗占了芯片总功耗的18%。门级功耗分析报告出来后大家傻眼了,因为RTL阶段从来没关注过这个模块。最后把仲裁器的轮询调度改成分时优先级调度,把一组翻转率极高的计数器砍掉,才把功耗拉回来。问题是,这个改动发生在物理设计已经铺开的阶段,ECO打得人心态崩溃。
提早到RTL阶段的意义,不是要把功耗算得多准,而是要尽早建立“哪类电路结构会吃电”的概念。RTL阶段改代码的成本,和物理设计阶段改代码的成本,差着一到两个数量级。用SpyGlass在RTL阶段做个快速的功耗估计,本质上是给项目买一份保险。
1.2 RTL阶段功耗估计能回答哪些问题
RTL阶段的功耗估计,无法替代门级签核,但它能在很短的时间里回答几个关键问题。
第一个问题:架构选型。两个FIFO深度方案、两种状态机编码方式、两组数据通路结构,到底哪个更省电?RTL阶段跑两遍SpyGlass,十几分钟就能看到趋势对比,不需要等综合。
第二个问题:模块功耗排序。芯片里几十个模块,功耗大户是存储、总线、计算单元还是控制逻辑?RTL阶段功耗估计给出各模块功耗占比的排序,方便设计者把优化精力花在最值钱的地方。
第三个问题:活动因子异常。某个信号翻转率异常高,可能是设计冗余、总线总线翻转太频繁,也可能是时钟没门控。SpyGlass能输出高翻转率net的排名,从中往往能发现意料之外的功耗漏洞。
第四个问题:多电压域功耗分配。后端做多电压域之前,RTL功耗估计可以粗略看各电压域的功耗占比,帮助架构师决定哪些模块放在低电压域,哪些必须待在高压域。
1.3 为什么选择SpyGlass来做这件事
当时选型也对比过几种方案,最后落在SpyGlass上,核心原因有三。
第一,工具生态契合。团队本身就是Synopsys流程,前端仿真用VCS,综合用Design Compiler,后端时序功耗签核用PrimeTime。SDC约束、活动因子文件、工艺库都是现成的,SpyGlass可以直接复用这些输入,省去格式转换。特别是SDC,SpyGlass和DC/PT对SDC的理解高度一致,不用单独维护一套约束。
第二,SpyGlass本身是静态验证平台,除了功耗估计,还能做Lint、CDC、Constraints检查。项目反正要跑Lint和CDC,功耗估计只是在同一个环境里多勾一个Goal,团队学习成本低,工具配置也集中。
第三,功耗估计的启动速度确实快。同样的设计,综合后再做门级功耗分析,至少得等综合跑完,再加几个小时跑功耗分析。SpyGlass直接读RTL,分钟级就能出报告,适合在设计迭代过程中反复看。
下表是RTL阶段功耗估计与门级功耗分析的定位差异,方便理解两条流程的分工:
| 对比维度 | RTL阶段功耗估计 | 门级功耗签核 |
|---|---|---|
| 主要输入 | RTL、SDC、活动因子 | 门级网表、SDC、寄生RC、SPEF |
| 精度定位 | 趋势级,适合横向对比 | 交付级,用于最终签核 |
| 速度 | 分钟级 | 小时级,甚至更久 |
| 主要用户 | 前端设计、架构评估 | 后端实现、签核 |
| 典型作用 | 早发现问题,指导RTL优化 | 确认达标,指导物理层优化 |
2. SpyGlass RTL功耗估计的原理:它到底在算什么
2.1 功耗公式在RTL阶段如何落地
功耗估计的基础公式是芯片功耗最核心的那条:动态功耗P ≈ α × C × V² × f。其中α是信号翻转的活动因子,C是节点等效电容,V是工作电压,f是时钟频率。RTL阶段没有门级网表,没有精确绕线电容,SpyGlass只能用“结构估算”的思路来处理这几个变量。
SpyGlass读入RTL之后,会先把代码映射成内部电路模型。寄存器、组合逻辑、多路选择器、算术单元这些结构,都会被转换成带逻辑深度的内部表示。每个逻辑节点会分配一个等效负载电容,这个电容可以从标准单元库里查,也可以使用工具内部的默认模型。V和f则来自SDC约束中的时钟定义和电压设置;活动因子α来自用户设定的翻转率,或从仿真波形中统计得到。
最后,SpyGlass把每个逻辑节点的功耗累加起来,再叠加存储单元、IO单元和时钟网络的功耗,形成一张层次化功耗报告。因为整个过程用的是估算电容和统计翻转率,不是后端提取的真实RC,所以结果天然会与门级有偏差。但这不妨碍它用来做排序和对比:如果某个模块在RTL估算里是功耗大户,在后端大概率也是,只是具体数字不同。
2.2 动态功耗、内部功耗、静态功耗怎么分
网上很多介绍动态功耗和静态功耗的文章喜欢把概念讲得很玄,其实拆开看就三部分。
开关功耗是信号在充电和放电时消耗的功耗,对应公式里的0.5 × α × C_load × VDD² × f。RTL阶段主要靠翻转率和负载电容估计。
内部功耗是单元内部短路电流以及内部节点充放电造成的功耗。一个门电路的输入信号不可能瞬间跳变,在跳变过程中会有从电源到地的直流通路,这部分就是短路功耗。SpyGlass在带了标准单元库时,会根据库里的功耗查找表来估算内部功耗;没带库时,就用默认的估算模型。
静态功耗就是漏电流功耗,只要芯片上电就存在,和翻转率无关。RTL阶段做静态功耗估算的价值有限,因为它严重依赖工艺库的漏电流模型和温度转角。SpyGlass可以在有库的情况下给出粗略静态功耗,但真正精确的漏电流分析要等门级实现后,用PrimeTime PX这类工具来做。
2.3 活动因子的三种输入方式,怎么选
活动因子是整个RTL功耗估计中最敏感的参数,甚至比工艺库还敏感。同一个设计,翻转率设为5%和20%,总功耗能差出好几倍。SpyGlass支持三种活动输入方式,使用场景完全不同。
第一种是使用默认翻转率。在工具里设置一个全局的toggle rate,比如10%,所有数据信号按这个比例翻转,时钟信号根据时钟周期自动计算。这种方式最快,适合微架构早期对比和快速筛选,缺点是精度很粗,不同模块的真实活动差异会完全消失。
第二种是SDC约束加手工约束。SDC里的时钟定义会决定时钟网络的翻转率,设计者还可以针对特定信号设置翻转率值,比如总线信号设20%,复位信号设1%。这种方式介于快速和精确之间,适合对关键模块有预估的场合。
第三种是导入仿真波形。把VCS仿真输出的VCD、SAIF或FSDB文件喂给SpyGlass,工具会统计波形的真实翻转次数,得到每个信号的实际活动因子。这种方式精度最高,但依赖仿真场景的覆盖率。仿真没跑到的工作模式,在功耗报告里就是空白。
三种方式的对比总结如下:
| 输入方式 | 精度 | 额外成本 | 适用阶段 |
|---|---|---|---|
| 默认翻转率 | 低,能看趋势 | 无 | 架构探索、快速对比 |
| 手工设置翻转率 | 中 | 需要人工指定关键信号 | 模块级功耗评估 |
| 仿真波形VCD/SAIF/FSDB | 高 | 需要仿真场景和波形文件 | 功能基本稳定后 |
2.4 SpyGlass功耗估计的完整流程框架
整个功耗估计的执行流程并不复杂,大致是:读入RTL源文件,读入SDC约束,配置功耗目标库和电压域,设置活动因子,运行Power Goal,最后生成报告。
这里要提一下SpyGlass里的Goal概念。SpyGlass把不同检查任务组织成Goal,比如Lint有Lint Goal,CDC有CDC Goal,功耗估计就在Power分类下的Goal里。跑一个Goal,工具会执行一整套规则引擎和计算引擎,最终给出报告。功耗估计这个Goal内部做了三件事:第一,解析RTL并推断电路结构;第二,结合SDC和活动信息构建功耗计算场景;第三,逐模块累计功耗并输出报告。
值得一提的是,SpyGlass在运行功耗估计前还会做一轮内部设计检查,如果RTL有明显语法问题、模块例化对不上、时钟树没有定义,它会直接报错,这些错误会直接影响功耗计算的正确性。所以第一次跑功耗之前,通常建议先跑一遍Lint,把最基本的RTL问题清干净,免得功耗数据建立在一个有问题的设计上。
3. 实操:用SpyGlass跑出一轮RTL功耗估计
3.1 开始前的准备清单
动手之前,先把输入文件准备好。一套完整的SpyGlass功耗估计输入,至少需要以下几样东西。
第一是RTL源文件列表。把所有需要分析的RTL文件整理成filelist,可以是 .f 文件,也可以用 tool 的 sourcelist 类型导入。文件列表里包含RTL顶层模块和全部子模块。建议这里的路径用相对路径,方便工程迁移。
第二是SDC约束文件。不需要像综合那样把约束写满,但至少要有create_clock,把设计中所有时钟频率定义清楚。如果设计有生成时钟,也要写create_generated_clock。在功耗估计里,时钟频率直接决定动态功耗公式里的f,没定义时钟,功耗数据就是空的。
第三是活动因子来源。可以是默认翻转率设置,可以是手工翻转率约束,也可以是仿真波形文件。如果手里有VCS仿真的波形,建议优先用波形,精度高很多。VCD、SAIF、FSDB三种格式SpyGlass都支持。
第四是可选的工艺库。如果手头有标准单元库的 .lib 或 .db 文件,可以读进去,功耗估算会用库里的功耗模型和输入电容,精度会更高。这里要强调的是,RTL功耗估计不是必须有库才能跑,没有库时SpyGlass会用内部默认模型,只是结果更粗糙。
最后是安装和授权。SpyGlass的安装和License按公司IT或Synopsys官方标准流程来,正式商业用一定走正规渠道,这里不展开讲盗版相关的事。
3.2 命令行建工程,导入源文件
SpyGlass可以全程命令行操作,也可以GUI界面操作。命令行更适合脚本化回归,我把最基础的建工程和导入流程写下来。
# 新建工程 spyglass -project power_demo.prj -new# 进入Goal配置模式后,依次导入输入文件 read_file -type sourcelist ../rtl/rtl_filelist.f read_file -type constraints ../misc/top.sdc read_file -type activity ../sim/top.fsdbread_file 是三段式导入的关键。sourcelist告诉工具RTL文件清单;constraints导入SDC;activity导入活动波形。这三样齐了,功耗估计的场景基本构建完成。
注意,这里读入的活动文件类型需要跟实际文件后缀匹配,FSDB和VCD的读取方式略有差异,但导入语法都是read_file。如果暂时没有波形文件,这行可以去掉,后面用默认翻转率设置代替。
3.3 切换到Power Goal,设置功耗参数
接下来是关键一步:切换到功耗估计Goal。不同版本的SpyGlass里,这个Goal的路径和名称可能有差异,常见的是Power分类下的 RTL Power Estimation 或 power 相关Goal。可以用命令行切换:
# 查看当前可用的Goal列表 list_goals # 切换到功耗估计Goal,-top指定顶层模块 current_goal power/power_mt -top top_module这里的 -top 参数必须正确填写RTL顶层模块名,SpyGlass要根据它来建层次树。顶层写错了,后面所有功耗报告都会乱掉。
切换Goal后,就开始设置功耗估计的参数。不同版本参数名有差异,但逻辑是相通的:
# 设置功耗估计的精细程度 set_goal_option power_estimation_effort medium # 设置默认翻转率,这里设10% set_goal_option default_toggle_rate 0.10 # 如果设计有多个电压域,设置对应电压值 set_goal_option vdd 0.9default_toggle_rate 是最敏感的参数。0.1表示平均每个时钟周期翻转0.1次,也就是10%。数据总线一般10%到20%,控制信号5%到10%,复位信号1%左右。项目早期做快速估算时,可以先统一设10%,后面再根据模块特点细化。
如果没有波形文件,又想对关键信号单独设置翻转率,可以在GUI的功耗活动设置页里操作,也可以直接修改约束文件。针对特定信号设定翻转率的命令在不同版本里名字略有差异,建议在GUI里找到对应功能,工具会自动生成正确写法。
3.4 SDC约束文件里至少要有什么
很多第一次用SpyGlass做功耗估计的同学,SDC随便写一个空的就丢进去,结果报告里所有功耗都显示不出来。这里把SDC的要点列一下。
SDC里最重要的就是时钟定义。以下是一个最小可用的功耗估计SDC示例:
# 定义两个主时钟 create_clock -name clk_sys -period 10 [get_ports clk_sys] create_clock -name clk_periph -period 20 [get_ports clk_periph] # 如果有时钟分频,定义生成时钟 create_generated_clock -name clk_div -source [get_ports clk_sys] \ -divide_by 2 [get_pins u_div/clk_out] # 设置输入转换时间,影响输入端口功耗估算 set_input_transition 0.2 [get_ports rst_n] set_input_transition 0.2 [get_ports data_in*]功耗估计其实不关心时序约束的setup和hold能不能满足,因为这不是时序签核。但它非常关心时钟周期和时钟结构,因为f在里面。SDC里缺少任何一个时钟定义,对应的时钟域功耗就算不出来。
还要注意,如果设计里有多个时钟域,要确保所有时钟都在SDC里定义完整,否则跨时钟域的模块功耗会被低估。我在实际项目里因为漏了一条分频时钟的定义,某个数据通路模块的功耗少算了一半,后来翻了半天才发现问题在SDC,而不是设计本身。
3.5 运行Goal并查看报告
参数配置完成,执行:
run_goal命令跑起来之后,SpyGlass会经历导入设计、解析库、统计活动、计算功耗、生成报告几个阶段。日志里会看到功耗计算引擎的运行进度。设计规模不大时,几分钟就能跑完。
跑完之后,SpyGlass会生成一系列报告文件,常见的有功耗汇总报告、模块层次功耗报告、净活动报告、时钟功耗报告。下面是一份简化的模块功耗报告示意,格式上类似表格,实际工具里的输出会更详细:
Module Name Internal Power(mW) Switching Power(mW) Total Power(mW) Percentage top_module 12.35 25.68 38.03 100.00% top_module/u_alu 2.18 11.52 13.70 36.02% top_module/u_bus_arb 1.67 7.30 8.97 23.59% top_module/u_dma 2.05 4.62 6.67 17.54% top_module/u_rom 0.98 1.20 2.18 5.73% top_module/u_icg - 1.85 1.85 4.86%看报告有个习惯:先看总功耗和功耗占比前三名的模块,再对比内部功耗和开关功耗的比例。如果某个模块开关功耗特别高,说明活动因子高、翻转频繁,优先检查它的数据通路;如果内部功耗特别高,可能是单元库模型或特殊结构的问题,需要更细致地核。
时钟网络功耗也要单独看。正常情况下,时钟网络功耗占总功耗的10%到30%,如果占比超过40%,要检查是不是时钟门控缺失,或者SDC里时钟活动信息设置有误。
3.6 用GUI操作时的路径参考
习惯GUI的同学,操作路径大致是:启动SpyGlass后,通过Project菜单新建工程,在Design Setup里导入RTL Filelist和Constraints,在Activity Setup里设置翻转率或导入波形文件,然后在Goal选择窗口里勾选Power相关Goal,最后点击Run Goal。GUI的好处是能直接在原理图视图里点选高功耗信号,追踪到RTL代码的对应位置,调试效率高一些。
GUI和命令行脚本可以混用。我建议把建工程和导入输入文件用脚本固化,跑Goal用命令行做回归,只有在分析具体高功耗信号时才打开GUI做可视化定位。
4. 常见问题与排查技巧实录
4.1 功耗报告里所有模块功耗接近0,问题出在哪
这是最常遇到的坑,新人很容易被吓住。现象是报告跑出来了,但每个模块的功耗都低得离谱,有的甚至全是0.0。排查思路很简单:先确认SDC读入正确。打开日志,搜一下SDC读取过程的报错,看看有没有“can’t find”之类的警告。
最常见的原因是SDC里的时钟端口名和RTL顶层端口名对不上。SpyGlass找不到时钟端口,就不知道时钟周期是多少,功耗公式里的f变成0或默认值,结果当然算不出功耗。解决方法是在SDC里检查get_ports的端口名,确保和RTL顶层module的端口完全一致。
还有一种可能是顶层模块选错了。current_goal里的-top指定了一个非顶层模块,工具只分析了部分设计,结果里大量模块没有功耗数据。需要确认顶层模块名是设计的最顶层,而不是某个子模块。
4.2 默认翻转率设太高,时钟网络功耗占掉一半
另一个高频问题:功耗报告里时钟网络功耗占总功耗比重过高,动辄40%以上,看起来很不合理。这种情况多半是默认翻转率设得太激进,把数据信号的活动也当成了高频翻转。
我当时把default_toggle_rate设成0.2跑一轮快速估算,结果时钟树功耗几乎占了一半。后来改成0.1,再把关键总线信号单独设到0.15,报告就正常了。实际经验是,默认翻转率设10%起步比较稳,如果和门级结果对比后再校准一轮,效果更好。
如果手里有波形文件,最保险的做法还是直接用波形统计活动,不用手工设默认值。波形里的翻转率是真实行为,会自然反映不同模块的不同活动水平,比统一设置合理得多。
4.3 波形文件导入了,但功耗比预期低很多,活动覆盖率不足
导入VCD或FSDB后,报告显示很多模块活动因子为0,总功耗反而比用默认翻转率还低。这一般是波形覆盖的场景不够,或者波形文件的时间长度太短。
排查方法是查看SpyGlass生成的活动覆盖率报告。如果某个模块只有一两根信号有活动,其他信号都是静态,那基本上可以断定仿真波形里没有跑到这个模块的功能场景。常见原因是测试bench只在复位阶段跑了一下,没有进入正常工作模式。
解决办法是选择有代表性的功能场景,把波形时长拉长,确保每个主要模块都有信号翻转。做RTL功耗估计时,仿真场景的质量比波形文件大小更关键,宁可场景短但要覆盖到关键工作模式,也不要放大段无意义的空闲时间。
4.4 报告里出现负功耗或异常大的内部功耗
负功耗一般是工艺库功耗模型与工具版本不兼容时出现的边界问题。某个查找表在特定翻转率和输出负载组合下,模型算出了负值。这种情况首先确认SpyGlass版本和库文件版本是否匹配,再看库的operating condition设置是否正确。
内部功耗异常偏大的情况,通常是电压域设置错误,比如把低电压模块的电压设成了高电压。功耗和电压的平方成正比,电压填错一位小数,功耗就能偏差30%以上。检查一下set_goal_option vdd的设置,以及SDC里是否有多电压域的定义。
如果核实了输入都没错,可以尝试换用不带库的默认模型跑一轮,和带库的结果对比。有时候库模型里的内部功耗表本身在这个转角下就不够准,换一个corner的库文件,数据会合理很多。
4.5 RTL功耗估计和门级功耗结果对不上,正常吗
正常,而且非常正常。RTL阶段没有RC寄生参数,没有精确的单元关内部功耗,没有IO负载模型,估算结果和门级PrimeTime PX差20%到40%都属于合理范围。关键不在于绝对值,而在于趋势。
我们团队的做法是,在项目早期用RTL功耗估计做横向比较,锁定功耗大户;到综合后、版图前再用门级功耗工具做纵向验证,校正RTL阶段的误差带。每做一个项目,就会积累一批“RTL估算值 vs 门级实际值”的对比数据,用这些数据可以校准下一个项目的RTL功耗预估。
常见问题速查表整理如下,方便对照排查:
| 现象 | 常见原因 | 排查方向 |
|---|---|---|
| 时钟功耗占比过高 | 默认翻转率设太大 | 调低默认值,或改用波形 |
| 模块功耗全是0 | SDC端口不匹配、顶层选错 | 检查日志和顶层模块名 |
| 导入波形后功耗偏低 | 活动覆盖率不足 | 检查场景覆盖,加长波形 |
| 内部功耗异常大 | 电压域设置错误 | 核对vdd值 |
| 负功耗 | 库模型兼容问题 | 换库corner或版本 |
| 与门级偏差大 | RTL估算天然误差 | 建立对比校准机制 |
5. 把RTL功耗估计真正用进项目流程
5.1 建立一套统一的功耗评估规范
RTL功耗估计最怕没有统一规范。同样一个模块,A工程师设10%翻转率,B工程师设20%,两个人报出来的功耗完全不可比。建议项目一开始就约定一套功耗评估规范,写进团队文档。
规范至少要包含几项内容:默认翻转率统一设多少;关键信号分类的翻转率范围;波形导入时必须覆盖哪些功能场景;每个阶段跑功耗估计的时间点。比如我们项目约定,默认翻转率统一0.1,控制信号0.05,数据总线0.15,复位信号0.01;RTL freeze前必须用波形文件跑一轮完整功耗回归。这份规范保证所有模块的功耗数据在同一基准下可比。
项目里还应该设置固定功耗检查点。通常建议三个时间点:第一次RTL集成后,做快速估算,看总功耗量级;功能冻结前,用波形做精确一点的活动统计;综合前,再做最后一轮RTL功耗检查,确认没有新引入的功耗异常模块。
5.2 从功耗报告反推RTL优化方向
SpyGlass功耗报告不只是用来“看一眼”,它能直接告诉我们RTL该怎么优化。
如果某个模块开关功耗高,去查这个模块里翻转率最高的几条信号。经常有一种情况:地址总线在最上层没有被门控,模块即使不工作,地址总线也在每周期翻转,白白消耗动态功耗。这种问题在RTL阶段很容易通过毛刺过滤或数据使能逻辑解决。
如果时钟网络功耗占比高,优先查时钟门控覆盖率。SpyGlass报告里能看出来哪些时钟节点没有插入门控,哪些模块的时钟一直在翻转。RTL阶段补上ICG,通常能省下可观的时钟树功耗。
状态机编码也会影响功耗。one-hot编码状态内只有一位翻转,但寄存器数量多;二进制编码寄存器少,但多位同时翻转。如果设计对功耗敏感,状态机编码的选择也能从SpyGlass报告的寄存器翻转数据里看出差异。我之前见过一个模块从one-hot改成gray编码后,同场景下功耗降了15%左右,优化效果相当明显。
5.3 功耗估计结果要跟后端形成闭环
RTL功耗估计不能只停留在RTL阶段,最好和后端形成一个闭环。每次跑完SpyGlass功耗报告,把各模块功耗占比存档;综合后跑DC的功耗报告,也把同样维度的占比存下来;后端版图跑完PrimeTime PX,再存一份。三份报告一对比,就能看出从RTL到门级,哪个模块功耗占比变化最大,这个偏差往往预示着结构性问题。
闭环保留下来的数据,最终会转化成团队的“功耗预报线”。做新项目时,拿到RTL功耗估计结果,结合历史项目的经验系数,能提前预测门级功耗的大致范围,后端收到的是一个有准备的功耗估计值,而不是等版图完成后才发现超标。
6. 最后聊几句个人经验
说了这么多,还是想补一句实在话:RTL功耗估计的目的不是替代门级签核工具,它的价值在于让你在项目早期就知道功耗走势。我个人的习惯是每个阶段至少跑两轮功耗估计,代码一集成先跑一轮快速估算,功能冻结前再带着波形跑一轮仔细的,然后把这几轮结果和综合后功耗、后端功耗放在一起做回归对比。
真正用好SpyGlass功耗估计之后,你会发现自己对设计的“电耗敏感度”明显不一样了。看到某个模块大面积使能信号长期有效、看到某条总线不停翻转、看到时钟门控缺失的地方,第一反应就不是等后端去收拾,而是直接在RTL里动手优化。这个变化带来的返工减少,是实打实的项目收益。
如果你正在为后端功耗超标焦头烂额,趁早把这条RTL功耗估计流程搭起来。等到版图铺满天再回头改代码,那种痛苦,体验过一次就够了。