Anlogic FPGA Synthesis Flow Skill
把 TD 工程从 RTL 推进到综合交付物 *_gate.db,并只对 read_design -> opt_rtl -> opt_gate 三个阶段负责。
依据 TD 6.2.1 官方脚本:
DefaultFlow.tcl的完整流程是read_design -> opt_rtl -> opt_gate -> opt_place -> opt_route -> bitgenSynIpFlow.tcl只覆盖read_design -> opt_rtl -> opt_gateMultiSeed.tcl从opt_place才开始,直接消费上游生成的*_gate.db
因此,本 skill 的边界应固定为:
- 上游交付进来的是工程、器件上下文、源列表、约束和可执行的综合 run
- 本阶段交付出去的是可验证的
*_gate.db、面积/时序摘要和综合阶段状态结论 - 本阶段不拥有
place、route、bitgen、下载和板级调试
核心边界
本 skill 负责
- 确认
read_design、opt_rtl、opt_gate是否真正闭环 - 判断综合失败点属于工程入口、顶层/源列表、约束、IP/primitive,还是 gate 阶段资源映射
- 输出是否生成了本轮有效的
*_gate.db - 输出面积报告、gate 时序摘要、marker、
flow.status的一致性结论 - 判断是否允许把结果交给
anlogic-place-route或其他下游流程
本 skill 不负责
- 不负责修 place/route 造成的拥塞、hold、时钟树或 DRC 问题
- 不负责等待
.place.end.f、.route.end.f、.bitgen.end.f - 不负责 bit 生成、AJE/SVF、Flash/SRAM 下载
- 不负责把“综合已完成”误写成“实现已完成”
默认停止线
满足下面条件之一,就应停止在综合阶段给出结论,而不是继续无效等待:
- 日志已出现明确失败,且当前阶段缺少
.end.f flow.status已表明综合阶段失败*_gate.db未生成或时间戳没有更新- 问题已经落到下游物理实现或 bit 生成领域
上游输入与下游交付
上游最小输入
- 工程入口:
.prj、.al或syn_1run 目录 - 器件上下文:
device_name、package_name、可选speed - 设计入口:
top_model_name - 源与约束:RTL/IP/netlist、
ADCList、IpADCList、SDCList、IpSDCList - 当前 run 的日志、marker、数据库和
flow.status
本阶段最小交付
*_elaborate.db*_rtl.db*_gate.db*_rtl.area*_gate.ts*_gate.timing或至少*_gate.tsflow.status- 阶段级结论:卡在哪个阶段、能否放行、最小修复动作是什么
下游如何消费
anlogic-place-route从*_gate.db开始,不应重新承担综合阶段诊断MultiSeed.tcl在prepare中直接import_db $parent/${prj_name}_gate.dbPRFlow.tcl的opt_place也依赖上游综合产物或静态 PR 数据库bitgen依赖的是 route 后的pr.db,不是综合阶段的gate.db
这意味着:
- 只要目标是
place/route/bitgen的结果,就不能继续在综合 skill 里等待 - 只要
gate.db还不可信,就不能把问题推给下游
官方脚本对应的真实边界
DefaultFlow.tcl
综合阶段的真实命令顺序是:
prepareimport_deviceopen_project/open_project ... -noanalyze- 必要时
import_db
read_design_funcommit_param -step designelaborate -topread_adc/read_ip_adcread_sdc/read_sdc -ipexport_db ${prj_name}_elaborate.db
opt_rtl_funcommit_param -step rtlinsert_debuggeroptimize_rtlreport_areaexport_db ${prj_name}_rtl.db
opt_gate_funcommit_param -step gateoptimize_gatelegalize_phy_instupdate_timingreport_timing_statusreport_timing_summaryflow_status -file flow.statusexport_db ${prj_name}_gate.db
关键结论:
flow_status -file flow.status在opt_gate内就写出,是综合阶段自带的闭环证据export_db ${prj_name}_gate.db是综合交付动作,不是 place-route 的预动作opt_place之后才会产出place_flow.status、*_place.db
SynIpFlow.tcl
这是最清晰的综合边界旁证:
- stepList 只有
read_design opt_rtl opt_gate opt_gate里会额外执行export_sdc_targetoptimize_gate -ip ...create_syn_iplegalize_phy_instupdate_timingreport_timing_statusexport_db ${prj_name}_gate.db
关键结论:
- 就算是 IP 综合流,边界也停在
gate.db - 如果用户的问题是“IP 综合是否已经完成”,判断依据仍然是
opt_gate闭环和gate.db
PRFlow.tcl
它证明了“综合完成”不等于“物理实现开始/完成”:
- 仍然有
read_design -> opt_rtl -> opt_gate - 但
opt_place才会导入重配置模块或静态数据库并继续放置 opt_route才会导出static_pr.db
关键结论:
- PR 模式下也不能把 place/route 的等待塞回综合 skill
- 如果问题出现在
import_db -link -mode ooc -inst ... _gate.db之后,已进入下游物理实现领域
MultiSeed.tcl
它证明 multi-seed 是综合下游,而不是综合的一部分:
- stepList 只有
opt_place opt_route bitgen prepare直接import_db $parent/${prj_name}_gate.db
关键结论:
- multi-seed 的输入就是综合产出的
gate.db - 一旦用户问题落在 seed、place、route、fix_hold、route.qor,就该切到
anlogic-place-route
工作流程
1. 先确认是不是综合问题
只有当问题仍落在下面三段之一时,才留在本 skill:
read_designopt_rtlopt_gate
如果用户已经在问:
placeroutefix_holdreport_qorbitgensetup_debuggerexport_bitgen_param
那已经越过综合边界,应切到对应 skill。
2. 找到真实 run 入口
- 优先读取
syn_1目录里的 Tcl、bat、日志、marker 和数据库 - 优先相信 run 目录中的实际执行脚本,而不是 GUI 名称
- 若存在多个 run,先用时间戳和日志增量锁定当前 run
3. 先判入口,再判阶段,再判交付
固定检查顺序:
- 入口是否正确
- 工程、器件、顶层、源列表、约束是否指向本轮设计
- 阶段是否闭环
read_designopt_rtlopt_gate
- 交付是否成立
flow.status*_gate.db*_gate.timing*_gate.ts
4. 给出放行或停线决定
最终结论必须显式二选一:
允许放行到 anlogic-place-route停留在 anlogic-synthesis 修复
不要给模糊说法,例如“看起来差不多可以继续”。
阶段判断规则
read_design
重点确认:
elaborate -top <top_module>是否对准真实顶层.prj与 run 脚本是否包含最新 RTL/IP/netlistread_adc、read_ip_adc、read_sdc、read_sdc -ip是否读到正确对象
常见失败归因:
- 顶层名错误
- 新文件未入工程
- 约束文件路径错误或未执行
- family 不匹配,导致 primitive 入口即失效
交付要求:
*_elaborate.db生成.read_design.end.f存在
opt_rtl
重点确认:
insert_debugger是否引用了有效配置- wrapper、厂家 primitive、综合所需 netlist 是否成套存在
- 黑盒问题究竟来自普通漏文件还是器件/IP 依赖缺失
常见失败归因:
- debugger 配置缺失
- wrapper 在、底层原语不在
- 引入了错误 family 或错误版本的模块
交付要求:
*_rtl.db生成*_rtl.area可读.opt_rtl.end.f存在
opt_gate
重点确认:
optimize_gatelegalize_phy_instupdate_timingreport_timing_statusreport_timing_summaryflow_status -file flow.statusexport_db ${prj_name}_gate.db
常见失败归因:
legalize_phy_inst暴露 primitive 落地或资源映射非法- gate 阶段时序已明显失控
flow.status已给出失败态export_db没有得到本轮新的*_gate.db
交付要求:
flow.status存在且可解释*_gate.db为本轮有效产物*_gate.ts/*_gate.timing存在.opt_gate.end.f存在
Marker、错误与等待规则
关注这些文件:
.read_design.begin.f.read_design.end.f.read_design.error.f.opt_rtl.begin.f.opt_rtl.end.f.opt_rtl.error.f.opt_gate.begin.f.opt_gate.end.f.opt_gate.error.f
等待规则:
- 若出现
.error.f,直接按当前阶段失败处理 - 若日志出现
ERROR、FATAL、failed、cannot、unable to、minidump,且.end.f未生成,不继续等 - 若只有
.begin.f没有.end.f,并且日志、flow.status、*_gate.db、*_gate.timing连续两轮都无变化,按卡住或异常中断处理 - 不因为“后面可能还会继续 place/route”而延长综合阶段等待
明确禁止的无效动作
- 为了等
bit文件而继续停在综合 skill - 因为没有
pr.db就认定综合失败 - 因为 place/route 的 WNS、拥塞或 hold 问题而回头重判综合成功状态
- 在已经进入
opt_place之后继续拿综合 marker 解释全部问题 - 把
open_project ... -noanalyze当成默认安全选项 - 只看控制台输出,不看
flow.status、marker 和数据库时间戳
输出要求
完成任务时至少给出:
- 当前问题属于
read_design、opt_rtl、opt_gate还是已经越界到下游 *_gate.db是否已生成且是否为本轮有效交付*_rtl.area、*_gate.ts、*_gate.timing、flow.status分别在哪里- marker 是否闭环,是否存在
.error.f - 是否允许放行到
anlogic-place-route - 若不允许,最小修复动作是什么
与其他 skills 的联动
- 上游通常来自
anlogic-design - 若问题还停留在工程创建、器件选择、源文件组织,切到
anlogic-project-creation - 若需要先做编译/仿真预检,联动
anlogic-modelsim - 综合成功后,下一步进入
anlogic-place-route - 若问题已到
bitgen、下载、AJE/SVF、Flash/SRAM,切到anlogic-create-bitstream或anlogic-download - 若确认了新的 primitive、wrapper 或稳定修复路径,联动
anlogic-learnings
需要时再读取的 references
- 读取 references/td-synthesis-flow.md
- 当需要查看官方脚本里的命令顺序、阶段交付、上下游数据库关系和停线规则时
- 读取 references/td-synthesis-warning-playbook.md
- 当日志出现
SYN-*、PLL、时钟结构、multi-driver、SerDes/IOCLK 等高频告警时
- 当日志出现
约束
- 不要把 place-route、bitgen、下载动作写进综合阶段结论
- 不要把“日志还在滚动”直接等同于“综合健康进行中”
- 不要只报现象,必须给阶段、证据、交付状态和最小修复动作
- 对厂家 primitive、RAM/ROM、PLL、PCIe/SerDes IP 要显式标注,不要笼统当普通 RTL 处理