🏠

第 6 章:跨 HLS 流程迁移与运行(Migrating and running across HLS flows)

这一章是收官章。

前 5 章你已经会写“能综合、能并行、能跑快”的内核了。

现在你要学的是另一种能力:不改算法源码,也能在不同工具流程里跑起来
Imagine 你有一份菜谱(C/C++ 算法),但厨房有三种灶台(TCL、CFG、Python/Unified)。你不想重写菜谱,只想换灶台。


6.1 为什么会有多种流程:一份算法,三种“导航方式”

TCL(Tool Command Language)先解释一下:它是一种脚本语言,像“逐步导航”,你一句一句告诉工具先做什么再做什么。

CFG(配置文件,通常是 INI 格式)先解释一下:它是“静态配置清单”,像外卖下单页,你只填“我要什么参数”,不写执行过程。

Unified CLI(统一命令行)先解释一下:它是 Vitis 新流程的入口,像把过去分散的按钮收进一个总控制台。

graph TD A[C/C++算法源码] --> B[TCL脚本流程] A --> C[CFG配置流程] A --> D[Python驱动流程] B --> E[CSIM行为仿真] C --> E D --> E E --> F[CSYNTH综合成RTL] F --> G[COSIM联合仿真] G --> H[导出IP或XO]

这张图可以这样看:
同一份源码像同一个“剧本”,TCL/CFG/Python 只是三位“导演”。导演风格不同,但目标都一样:先验证行为(CSIM),再生成硬件(CSYNTH),再做软硬一致性检查(COSIM),最后导出可集成产物(IP/XO)。


6.2 TCL、CFG、Unified:它们到底等价在哪

Think of it as 从 Makefile 迁移到 package.json scripts:写法变了,任务本质没变。

classDiagram class 算法源码{ pointer_basic.c pointer_basic_test.c } class 过程式表达{ run_hls.tcl open_project/open_solution set_directive_* } class 声明式表达{ hls_config.cfg syn.top syn.file/tb.file syn.directive.* } class 统一执行器{ vitis-run v++ vitis -s } class 输出{ csim csynth cosim ip/xo } 算法源码 --> 过程式表达 : 被脚本调度 算法源码 --> 声明式表达 : 被配置引用 过程式表达 --> 统一执行器 : 执行 声明式表达 --> 统一执行器 : 执行 统一执行器 --> 输出 : 生成结果

这张关系图的重点是:
“表达方式”与“算法内容”是分层的。你把算法放在稳定层,把流程放在可替换层,就像前后端分离。这样工具升级时,你只改流程层,不动算法层。


6.3 三条常用运行路径(你今天就能跑)

flowchart TD S[进入示例目录] --> P{选择流程} P --> T[TCL脚本] P --> U[Unified CLI+CFG] P --> Y[Python脚本] T --> T1[vitis-run --mode hls --tcl run_vitis_unified.tcl] U --> U1[CSIM: vitis-run --mode hls --csim --config hls_config.cfg --work_dir w] U1 --> U2[CSYNTH: v++ --compile --mode hls --config hls_config.cfg --work_dir w] U2 --> U3[COSIM: vitis-run --mode hls --cosim --config hls_config.cfg --work_dir w] Y --> Y1[vitis -s run.py] T1 --> R[查看报告与输出] U3 --> R Y1 --> R

你可以把这三条路想成三种出行方式:
TCL 像“手动挡”,控制细;CFG+CLI 像“自动挡”,结构清晰;Python 像“车队调度系统”,适合批量自动化。


6.4 一次 Unified CLI 的真实交互时序

sequenceDiagram 可以理解为“聊天记录回放”,把谁在什么时候说了什么按时间展开。

sequenceDiagram participant Dev as 开发者 participant CLI as vitis-run/v++ participant CFG as hls_config.cfg participant HLS as HLS引擎 participant Out as 报告与产物 Dev->>CLI: 发起 --csim / --compile / --cosim CLI->>CFG: 读取配置项(syn.top, file, clock) CLI->>HLS: 创建/打开work_dir组件 HLS->>HLS: 执行CSIM HLS->>HLS: 执行CSYNTH HLS->>HLS: 执行COSIM HLS-->>Out: 生成日志、时序、资源、波形 Out-->>Dev: 返回通过/失败状态

这段时序告诉你:
CLI 不是“编译器本体”,更像“前台接待”。真正干活的是 HLS 引擎。CFG 就是接待台上的“需求单”。


6.5 迁移最小改动法:从老 TCL 到新 Unified

Imagine 你在给老房子换电闸,不拆整栋楼。

flowchart TD A[保留原C/C++与Testbench] --> B[复制旧run_hls.tcl] B --> C[把open_project/open_solution改为open_component] C --> D[确认top函数名一致] D --> E[抽取公共参数到hls_config.cfg] E --> F[先跑CSIM] F --> G[再跑CSYNTH] G --> H[最后跑COSIM与导出]

这条迁移线的核心原则:
先“跑通”,再“优雅”。先保证结果一致,再慢慢把 Tcl 指令迁到 cfg。像把单体应用拆微服务,先做兼容层最稳。


6.6 常见坑位速查(迁移时最容易踩)

graph TD Q[结果异常] --> Q1{Top函数找不到?} Q1 -->|是| A[检查syn.top与函数名大小写] Q1 -->|否| Q2{COSIM卡住?} Q2 -->|是| B[检查m_axi depth或stream深度] Q2 -->|否| Q3{脚本能跑但无输出?} Q3 -->|是| C[检查work_dir与相对路径] Q3 -->|否| D[对比TCL与CFG参数是否一致]

把这张图当作“急诊分诊台”:
先看是不是 top 名称问题,再看接口深度,再看路径和工作目录。90% 的迁移问题都在这几类。


章节小结

你现在已经掌握了跨流程复用的核心心法:

  • 算法源码是资产,流程文件是适配器
  • TCL 是过程式导航,CFG 是声明式清单,Python 是自动化编排
  • 先最小迁移跑通,再做配置收敛

Think of it as:你的 HLS 设计已经从“只能在一台机器上跑的脚本”,升级成“可移植、可自动化、可持续维护”的工程资产。

恭喜,你完成了这本入门指南的第 6/6 章。
你已经具备把示例库变成你自己项目模板库的能力了。

On this page