Anlogic FPGA Place and Route Flow Skill
把综合交付的 *_gate.db 推进到物理实现交付物 *_pr.db,并只对 opt_place -> opt_route 两个阶段负责。
依据 TD 6.2.1 官方脚本:
DefaultFlow.tcl的后半段是opt_place -> opt_route -> bitgenPRFlow.tcl也把 place-route 与 bitgen 分开MultiSeed.tcl只覆盖opt_place -> opt_route -> bitgen,并且 place-route 直接消费上游*_gate.db
因此,本 skill 的边界固定为:
- 上游输入是已放行的
*_gate.db及其相关约束和 run 上下文 - 本阶段交付是已验证的
*_place.db、*_pr.db、物理时序/异常报告与放行结论 - 本阶段不负责综合重判,不负责 bit 文件生成、下载和板级 bring-up
核心边界
本 skill 负责
- 确认
opt_place、opt_route是否真正闭环 - 判断失败点属于入口数据库、place、route、hold 修复、时钟结构、拥塞或 DRC
- 输出是否生成了本轮有效的
*_pr.db - 输出
route_flow.status、时序报告、异常报告与 marker 的一致性结论 - 判断是否允许把结果交给
anlogic-create-bitstream
本 skill 不负责
- 不负责重新证明综合阶段
gate.db本身是否正确,除非入口数据库明显失配 - 不负责等待
.bitgen.end.f、.bit、.bitgen_param.f - 不负责 BitWriter、ChipLinker、SVF、AJE、Flash/SRAM 下载
- 不负责把“route 完成”误写成“bitstream 已可交付”
默认停止线
满足下面任一条件,就应停在线路实现阶段给出结论,而不是继续无效等待:
- 当前阶段日志或
.error.f已表明 place/route 失败 route_flow.status或关键时序/异常报告已表明结果不可放行*_pr.db未生成或不是本轮有效产物- 问题已经越界到 bitgen、下载或板级调试
上游输入与下游交付
上游最小输入
- 来自
anlogic-synthesis的有效*_gate.db - 工程入口:
.prj或phy_1run 目录 - 器件上下文:
device_name、package_name、可选speed - 当前 run 的日志、marker、数据库和状态文件
- 仍参与物理阶段的约束、ADC、debugger/probe 相关输入
本阶段最小交付
*_place.db*_pr.db*_place.ts*_place.timing*_phy.ts*_pr.timing*_exception.timingroute_flow.status- 必要时
place_flow.status、route.qor、route_clock_utilization.txt - 阶段级结论:卡在 place、route、post-route 检查还是入口数据问题
下游如何消费
anlogic-create-bitstream只应从已放行的*_pr.db开始DefaultFlow.tcl的bitgen_fun明确在opt_route之后才运行PRFlow.tcl里bitgen也在export_db ${prj_name}_pr.db之后才进入
这意味着:
- 只要目标是
.bit、.bid、.bitgen_param.f,就不能继续停在 place-route skill - 只要
*_pr.db或 route 结论还不可信,就不能把问题推给 bitstream
官方脚本对应的真实边界
DefaultFlow.tcl
物理实现阶段真实命令顺序是:
prepareimport_deviceopen_project/open_project ... -noanalyzeimport_db
opt_place_funcommit_param -step placeinsert_debugger- 可选
read_adc placeupdate_timing -mode manhattanreport_timing_statusreport_timing_summaryreport_area -io_infoflow_status -file place_flow.statusreport_clock_utilization- 可选
flow_continue_check -step place export_db ${prj_name}_place.db
opt_route_funcommit_param -step route- 条件式
set_param route fix_hold off route- 条件式
flow_continue_check -step route - 条件式
fix_hold - 恢复
set_param route fix_hold on report_qorreport_area -io_infoupdate_timing -mode finalreport_timing_statusreport_timing_summaryreport_timing_exceptioncheck_timing -verboseflow_status -file route_flow.statusreport_clock_utilizationexport_db ${prj_name}_pr.db
关键结论:
place_flow.status与route_flow.status是本阶段内部证据export_db ${prj_name}_pr.db是 place-route 的正式交付bitgen之后的任何产物都不属于本 skill 的交付
PRFlow.tcl
它证明 PR 模式下 place-route 仍是独立阶段:
opt_place前会import_db -link -mode ooc -inst ... _gate.dbopt_route后会导出*_pr.db与static_pr.dbbitgen仍然在 place-route 闭环之后
关键结论:
- PR 场景下,如果问题出在
import_db -link、place -eco、route -eco之后,仍属于 place-route - 如果
static_pr.db还没生成,就不能把问题推进到 bitgen
MultiSeed.tcl
它证明 multi-seed 是 place-route 的变体,不是 bitstream 的一部分:
prepare直接import_db $parent/${prj_name}_gate.dbopt_place、opt_route完成后才bitgen
关键结论:
- seed、congestion、
fix_hold、route.qor都属于 place-route 域 - multi-seed 里也不能因为想看 bit 文件而延长 route 分析
工作流程
1. 先确认是不是物理实现问题
只有当问题仍落在下面两段之一时,才留在本 skill:
opt_placeopt_route
如果用户已经在问:
bitgensetup_debuggerexport_bitgen_param.bit- 下载、SVF、AJE、Flash
那已经越过本 skill 边界,应切到 anlogic-create-bitstream 或 anlogic-download。
2. 找到真实 phy run 入口
- 优先读取
phy_1目录里的 Tcl、bat、日志、marker、数据库和状态文件 - 优先相信 run 目录中的实际执行脚本,而不是 GUI 名称
- 若存在多个 run,先用时间戳和日志增量锁定当前 run
3. 先判入口,再判阶段,再判交付
固定检查顺序:
- 入口是否正确
*_gate.db是否来自本轮综合、器件配置是否一致
- 阶段是否闭环
opt_placeopt_route
- 交付是否成立
place_flow.statusroute_flow.status*_pr.db*_pr.timing*_exception.timing
4. 给出放行或停线决定
最终结论必须显式二选一:
允许放行到 anlogic-create-bitstream停留在 anlogic-place-route 修复
不要给模糊说法,例如“route 看着差不多”。
阶段判断规则
opt_place
重点确认:
placeupdate_timing -mode manhattanreport_timing_statusreport_timing_summaryreport_area -io_infoflow_status -file place_flow.status- 可选
flow_continue_check -step place
常见失败归因:
- 旧
*_gate.db被错误导入 - 资源装箱、原语落地、约束或区域限制冲突
- place 阶段拥塞或 WNS 已严重到不应继续 route
交付要求:
*_place.db生成.opt_place.end.f存在- 若启用了
flow_continue_check,结论未被其拦截
opt_route
重点确认:
route- 条件式
fix_hold report_qorreport_timing_statusreport_timing_summaryreport_timing_exceptioncheck_timing -verboseflow_status -file route_flow.statusexport_db ${prj_name}_pr.db
常见失败归因:
route未完成或 route 状态明确失败- hold 修复顺序错误
- route 后时序、异常路径或时钟资源仍不可接受
*_pr.db没有得到本轮有效更新
交付要求:
route_flow.status存在且可解释*_pr.db为本轮有效产物*_pr.timing、*_exception.timing存在.opt_route.end.f存在
Marker、错误与等待规则
关注这些文件:
.opt_place.begin.f.opt_place.end.f.opt_place.error.f.opt_route.begin.f.opt_route.end.f.opt_route.error.f
等待规则:
- 若出现
.error.f,直接按当前阶段失败处理 - 若日志出现
ERROR、FATAL、failed、cannot、unable to、minidump,且.end.f未生成,不继续等 - 若只有
.begin.f没有.end.f,并且日志、状态文件、*_pr.db、*_pr.timing连续两轮都无变化,按卡住或异常中断处理 - 不因为“后面还要 bitgen”而延长 place-route 阶段等待
明确禁止的无效动作
- 因为
.bit没出来就继续停在 place-route skill - 因为
bitgen失败就回头否定已经放行的 route,除非 route 交付本身缺失 - 只看
*_pr.db存在就宣告 route 成功 - 在已进入 bitgen 后继续拿 place/route marker 解释全部问题
- 把
fix_hold当成 route 前默认常开参数 - 忽略
flow_continue_check的拦截信号
输出要求
完成任务时至少给出:
- 当前问题属于
opt_place、opt_route还是已经越界到 bitstream *_pr.db是否已生成且是否为本轮有效交付*_place.timing、*_pr.timing、*_exception.timing、route_flow.status分别在哪里- marker 是否闭环,是否存在
.error.f - 是否允许放行到
anlogic-create-bitstream - 若不允许,最小修复动作是什么
与其他 skills 的联动
- 上游通常来自
anlogic-synthesis - 若问题回溯到时钟/IO/约束策略,联动
anlogic-timing-constraints - 若问题其实暴露的是旧
gate.db或综合入口不一致,回切anlogic-synthesis - place-route 成功后,下一步进入
anlogic-create-bitstream - 若后续是下载、SVF、AJE、Flash/SRAM,切到
anlogic-download - 若确认了稳定的物理实现修复路径,联动
anlogic-learnings
需要时再读取的 references
- 读取 references/td-place-route-flow.md
- 当需要查看官方脚本里的命令顺序、阶段交付、状态文件和停线规则时
- 读取 references/td-place-route-warning-playbook.md
- 当日志出现
PHY-*、时钟资源、IOCLK、拥塞、hold 等高频告警时
- 当日志出现
- 读取 references/chip-viewer-eco-flow.md
- 当需要图形化复查 placement、route、region 约束或 ECO 时
约束
- 不要把 bitgen、下载动作写进 place-route 结论
- 不要把“route 还在跑”直接等同于“结果健康可放行”
- 不要只报现象,必须给阶段、证据、交付状态和最小修复动作
- 对时钟资源、PLL、PCIe/SerDes、IOCLK、region 约束要显式标注,不要笼统当普通拥塞处理