简介:Cadence Cerebrus User Guide 是面向电子设计自动化工程师与技术人员的官方操作参考文档,针对 Cadence Cerebrus 工具的产品版本 22.1x 编写,最后更新于 2023 年 12 月,可帮助读者掌握该工具在优化电子设计流程中的具体指令、功能特性与典型使用案例。资源包内共 1 个 PDF 文件,压缩包整体约 6.19MB,内容涵盖工具操作指南、商标与版权声明、使用条件及免责条款等模块,适合需要查阅官方权威说明、了解 Cerebrus 高级功能与合规使用要求的从业者。目前已有 539 人学习下载,读者可从中获取完整的操作指引与功能说明,用于提升设计效率与质量,同时明确文档的授权范围与知识产权边界。需注意文档由 OCR 扫描生成,可能存在个别字识别偏差,使用时应结合上下文理解与修正。
1. 从一份用户手册说起:Cadence Cerebrus 到底在解决什么
如果你正在跑先进工艺节点的数字后端,大概率听过 Cadence Cerebrus 这个名字。它不是某个单独的 EDA 工具,而是架在 Innovus 之上的一层机器学习驱动优化引擎,官方叫它 Intelligent Chip Explorer。说白了,它把过去靠人反复调参、反复跑 PPA 的活儿,交给一组强化学习 agent 去自动搜索。你给它一个设计、一套约束、一个优化目标,它自己决定下一轮用什么 floorplan 策略、什么 place 密度、什么 CTS 参数,然后一轮轮迭代,直到 PPA 收敛到你要的水平。
这件事的价值在于:传统后端优化里,一个模块从 RTL 到 signoff 可能要跑几十甚至上百次 full flow,每次几小时到几天,工程师靠经验猜参数。Cerebrus 把这部分变成可复现、可追溯的自动搜索,而且它学到的策略能迁移到相似模块上。适合谁?适合手里有多个相似 block、PPA 压力大、人力又不够反复手调的团队。但前提是你得先把它的 user guide 读明白,知道它怎么接进现有 flow、怎么定义 search space、怎么看它到底有没有在干活。
2. Cerebrus 的接入方式与运行机制:先搞懂它怎么“接管”你的 flow
2.1 它不是替代 Innovus,而是包在 Innovus 外面的一层
很多人第一次接触会误以为 Cerebrus 是独立工具,其实它的运行模型是:Cerebrus 作为 master 进程,按轮次启动 Innovus 子进程,每轮传入一组它选定的参数,Innovus 跑完把结果(timing、power、area、DRC 等)回传给 Cerebrus,agent 根据 reward 决定下一轮参数。所以你的 Innovus flow 必须能被参数化——也就是那些你想让 Cerebrus 去搜的点,得做成变量,而不是写死在脚本里。
常见做法是把 flow 拆成几个阶段:floorplan、place、cts、route,每个阶段暴露若干可调参数。Cerebrus 的 user guide 里把这叫 knobs。你不需要一次暴露几百个,先挑对 PPA 影响最大的十几个就够。暴露太多会让搜索空间爆炸,收敛变慢,这是血泪经验。
2.2 启动一个最小 Cerebrus 实验的命令结构
下面是一个典型的启动命令骨架,基于常见做法整理,具体路径和版本相关参数请以你本地安装的 user guide 为准:
# 启动 Cerebrus master,指定设计、flow 和 search space cerebrus \ -design ./designs/my_block \ -flow ./flows/innovus_flow.tcl \ -search_space ./config/search_space.json \ -objective "timing,power,area" \ -max_iterations 40 \ -num_parallel 4 \ -output ./runs/exp_001逻辑说明:-design指向设计目录,里面通常放网表、lef、lib、sdc 等;-flow是你参数化后的 Innovus 脚本;-search_space定义每个 knob 的取值范围和类型;-objective是优化目标,可以多目标加权;-max_iterations控制总轮次;-num_parallel决定同时跑几个 Innovus 实例,受 license 和机器核数限制。
参数说明:-num_parallel不是越大越好。每个 Innovus 实例本身可能吃几十核,如果你只有一台 64 核机器,设 4 个并行就会互相抢资源,单轮时间反而拉长。我一般先设 2,观察单轮耗时和 CPU 利用率再调。-max_iterations也不是越多越好,前 10 轮通常是探索期,20 轮后如果 reward 曲线平了,再加轮次收益很低。
2.3 search space 怎么写才不让 agent 乱撞
search space 一般用 JSON 描述,每个 knob 有类型、范围、步长。下面是一个简化示例:
{ "place_density": { "type": "float", "min": 0.60, "max": 0.85, "step": 0.05 }, "cts_buffer_list": { "type": "categorical", "values": ["BUF_X4", "BUF_X8", "BUF_X16"] }, "route_layer_opt": { "type": "int", "min": 2, "max": 5 } }逻辑说明:float 型适合密度、阈值这类连续参数;categorical 适合 buffer 类型、策略枚举;int 适合层数、迭代次数。步长决定搜索粒度,步长太细会让 agent 在相近值上浪费轮次,太粗又可能跳过最优区间。
参数说明:place_density 的范围不要照搬别人的 0.60 到 0.85,得看你设计的利用率。如果综合后利用率已经 0.75,下限还设 0.60 就会导致大量 legalization 失败,reward 直接崩。我一般先跑一两次 baseline,看默认密度下 congestion 和 timing 的平衡点,再把范围收窄到 baseline 上下 0.1 左右。
3. 把 user guide 里的配置落到实际 flow:参数化、reward 与并行
3.1 参数化 Innovus flow 的四个关键改动
Cerebrus 要能控制你的 flow,你的 Innovus 脚本必须做四件事:读取外部传入的参数、在对应阶段应用这些参数、输出结构化结果、正常退出并返回状态码。下面是一个参数化片段的示意:
# 从环境变量或参数文件读取 Cerebrus 传入的 knob 值 set place_density $env(CEREBRUS_PLACE_DENSITY) set cts_buf $env(CEREBRUS_CTS_BUF) # 在 place 阶段应用密度 setPlaceMode -place_global_density $place_density place_opt_design # 在 cts 阶段应用 buffer 选择 set_ccopt_property buffer_cells $cts_buf ccopt_design # 输出结构化结果供 Cerebrus 解析 report_timing -max_paths 100 > ./results/timing.rpt report_power > ./results/power.rpt report_area > ./results/area.rpt逻辑说明:环境变量方式最直接,Cerebrus 每轮启动子进程时注入不同值。也可以用参数文件,但环境变量在并行场景下更干净,不会互相覆盖。输出报告要固定路径和格式,Cerebrus 的 parser 通常按正则提取关键指标,格式变了就解析失败。
参数说明:setPlaceMode -place_global_density这个参数在不同 Innovus 版本里名字可能略有差异,以你本地 user guide 为准。report_timing的-max_paths不要设太小,否则 worst slack 可能没被抓到;也不要设太大,解析慢。100 到 200 条通常够用。
3.2 reward 函数怎么定义才不让 agent 走偏
Cerebrus 的 agent 靠 reward 判断一轮好坏。reward 通常由多个指标加权而成,比如 timing、power、area、DRC。user guide 里一般会给默认权重,但默认值不一定适合你的设计。下面是一个 reward 配置的思路:
{ "reward": { "timing": {"weight": 0.5, "metric": "worst_slack", "target": 0.0}, "power": {"weight": 0.3, "metric": "total_power", "target": null}, "area": {"weight": 0.2, "metric": "design_area", "target": null}, "drc": {"weight": -1.0, "metric": "drc_count", "target": 0} } }逻辑说明:timing 权重最高,因为后端第一要务是收敛;power 和 area 作为次要优化;DRC 用负权重,一旦出现 DRC 就大幅扣分,逼 agent 避开会导致 DRC 的参数组合。target 表示期望值,worst_slack 的 target 设 0 表示希望非负。
参数说明:权重之和不必等于 1,Cerebrus 内部会归一化。但如果某个指标量纲差异大,比如 power 是几百毫瓦、area 是几十万平方微米,直接加权会让 area 主导 reward。常见做法是先做归一化,或者给 area 一个很小的权重。我一般会先跑 5 轮看 reward 构成,如果某一项波动特别大,就调整它的权重或加 log 变换。
3.3 并行轮次与 license 的平衡
Cerebrus 支持多轮并行,但每个 Innovus 实例都要占 license。如果你 license 有限,-num_parallel设太大,会出现排队等 license,实际并行度上不去,还拖慢整体。下面是一个检查并行效率的简单方法:
# 查看当前 Innovus 进程数和 CPU 利用率 ps -ef | grep innovus | wc -l top -b -n 1 | head -20逻辑说明:如果进程数等于-num_parallel但 CPU 利用率很低,说明在等 license 或 IO;如果进程数少于设定值,说明 license 不够。这时候要么降并行数,要么错峰跑。
参数说明:top的采样间隔和次数按需调。我一般会在第一轮跑起来后手动看几次,确认每个 Innovus 都吃到了足够的核。如果单实例只分到 4 核,而它本身需要 16 核才能跑动,那并行就是假并行。
4. 避坑与排查:Cerebrus 跑不起来时先看这几处
4.1 现象:第一轮就报 flow 失败,日志里只有 Innovus 的 error
原因:Cerebrus 本身不解析 Innovus 的内部错误,它只看子进程返回码和输出文件。如果 Innovus 因为某个 knob 值非法而退出,Cerebrus 只会标记这轮失败,不会告诉你具体哪一行。
解决:在 Innovus flow 里加错误捕获,把关键阶段的日志单独落盘。比如在 place 前打印当前 knob 值,在每步后检查getPlaceMode是否生效。这样失败时能直接定位到是哪个参数导致的。
4.2 现象:reward 曲线一直平,agent 好像没在学
原因:常见有三种。一是 search space 太窄,所有组合结果差不多;二是 reward 函数被某个量纲大的指标主导,其他指标变化被淹没;三是 flow 里 knob 没真正生效,agent 以为在变,实际 Innovus 用的还是默认值。
解决:先手动改一个 knob 跑两次 baseline,确认 PPA 有差异。如果没差异,说明参数化没生效。再看 reward 构成,把每个指标的原始值打印出来,确认它们确实在变。最后检查 search space 范围,如果 place_density 只在 0.70 到 0.72 之间,那确实没什么可搜的。
4.3 现象:并行跑的时候结果互相覆盖
原因:多个 Innovus 实例共用同一个输出目录或同一个临时文件路径,后跑的覆盖先跑的。
解决:在 flow 里用轮次 ID 或进程 ID 隔离输出目录。Cerebrus 通常会注入一个 run ID 环境变量,用它拼路径。比如./results/$env(CEREBRUS_RUN_ID)/timing.rpt。不要图省事写死路径。
4.4 现象:CTS 阶段报 buffer 不存在
原因:search space 里写的 buffer 名字在你的库里面没有,或者名字拼写和库不一致。
解决:先grep一下库文件确认可用 buffer 列表,再把 categorical 值改成库里真实存在的。不同工艺库的命名规则不同,别直接抄别人的配置。
4.5 现象:跑到一半 license 掉了,整轮失败
原因:license 服务器波动或并行数超过可用 license 数。
解决:在 Cerebrus 配置里加 license 检查重试机制,或者把-num_parallel降到 license 数以下。如果 license 本身不稳定,考虑错峰跑,别和团队其他人的任务抢。
5. 进阶用法:让 Cerebrus 学到的策略可复用
5.1 用历史 run 做 warm start
Cerebrus 支持从已有 run 的结果继续搜索,而不是每次从零开始。如果你已经跑过一个相似模块,可以把它的 search space 和 reward 配置拿过来,用-warm_start指向之前的 run 目录。这样 agent 会优先在历史好点附近探索,收敛更快。但要注意:如果两个模块的利用率、时钟频率差异大,warm start 可能反而误导 agent,先跑几轮观察再决定是否继续。
5.2 把最优参数导出成可复现的 Innovus 脚本
Cerebrus 跑完后会给出 best run 的参数组合。你可以把它导出成一份固定参数的 Innovus 脚本,用于后续手动复现或交给团队其他人。下面是一个导出思路:
# 从 best run 目录提取参数并生成固定配置 cerebrus -export_best ./runs/exp_001 -output ./best_params.tcl逻辑说明:导出的 tcl 里会把每个 knob 赋成最优值,你把它 source 进原始 flow 就能复现。但要注意,Cerebrus 的 best 是基于 reward 的,reward 权重变了 best 也会变。所以导出前确认 reward 配置就是你最终想要的。
参数说明:-export_best的具体参数名以 user guide 为准。导出后建议手动跑一次 full flow 验证,确认 PPA 和 Cerebrus 报告的一致。有时候并行环境下的资源竞争会导致单次结果有波动,复现一次能排除这个因素。
5.3 用迁移学习跨模块复用策略
如果你有一组结构相似的 block,比如同一 IP 的不同配置,Cerebrus 的策略迁移能省很多轮次。做法是先在其中一个 block 上跑充分轮次,得到一组好参数,然后把它们作为另一个 block 的初始搜索点。但迁移的前提是两者的约束和库一致,否则 agent 学到的映射关系不成立。我一般会先跑 5 轮 baseline 确认两个 block 的 PPA 响应趋势相似,再决定迁移。
5.4 一个我常犯的错:太早调 reward 权重
刚开始用的时候,我看到 power 没降下来就猛加 power 权重,结果 timing 崩了,又回头加 timing 权重,来回折腾好几轮。后来学乖了:先让默认 reward 跑 20 轮,看 agent 自己怎么平衡,再根据结果微调。reward 权重是方向盘,不是油门,频繁打方向只会让车画龙。希望帮到你。
本文还有配套的精品资源,点击获取