AMD Ross:用自然语言驱动Vivado,从工程到比特流的FPGA Agent实践
如果你今年在 FPGA 圈子里转过一圈,大概率见过两类东西:一类是大模型生成的 Verilog 教学代码,跑通一个 UART 就能引来一片惊叹;另一类是各种把 ChatGPT 接到 Vivado 上的个人脚本,本质上是把"问模型"包装成"执行命令"。这两类尝试都卡在同一个地方——模型能写一段代码,却搞不定一个能落地的工程。AMD 这次推出的 FPGA Agent 项目 Ross,走的恰恰是另一条路:不是让大模型替你写 RTL,而是让大模型驱动整个 Vivado 工具链,从建工程一路干到出比特流。
Ross 在公开演示里的定位,是"用自然语言直接驱动 Vivado 工程流程"。你可以在对话里告诉它"帮我建一个基于 ARTY A7 的工程,实现串口回环加 LED 心跳",它不会丢给你一段 Verilog 就完事,而是真的去创建工程、生成源码和约束、跑综合布局布线、读时序报告、最后生成比特流。如果你只是好奇"AI 写 FPGA 能写到什么程度",那 Ross 可能不如纯文本生成惊艳;但如果你要的是"从零到比特流"这个完整交付闭环,它就踩在了真正的痛点上。
这背后有个很现实的原因。AMD 在把 Xilinx 收编之后,Vivado 这套工具链的维护压力一直不小,新器件越来越多,Versal 平台的复杂度也远不是过去 FPGA 能比的。传统 IDE 再怎么优化,有一个瓶颈始终绕不过去:工具的使用门槛不在点击菜单,而在工程语义的流转。同样的时序违规,新手看不懂报告,老手一看就知道是跨时钟域还是物理拥塞;同样的 XDC 约束,换一块板子就要重新理解整个时钟拓扑。Ross 想做的,就是让 Agent 把"工程语义"这条链路给接起来,而不是再搞一个会写 RTL 的聊天机器人。下面我按自己拆项目的习惯,从架构、工具链、实测和边界四个角度把它过一遍。
1. AMD 为什么亲自下场:FPGA 开发的"最后一公里"没人愿意走
先说个去年发生在我身边的事。有个朋友让我给他学生批作业,作业是用某大模型生成一个带奇偶校验的 UART 发送模块。模型交上来的代码看起来相当专业:波特率分频、起始位、停止位、奇偶校验,一个都不少。我放到 Vivado 里一综合,直接报错——他把时钟分频的计数器位宽写错了,100MHz 输入时钟下计数器溢出;改完位宽再综合,又发现复位逻辑有问题,把异步复位和同步释放写成了一团浆糊。
这种"代码人设崩塌"不是个例,而是一种普遍现象。模型能把语法写得一丝不苟,但它看不见自己的代码要跑在什么器件、什么时钟、什么约束下——它没有一个完整的"工程上下文"。这也解释了为什么 GitHub 上那么多 AI 生成 RTL 的 demo,真正跑在板子上的少得可怜。
1.1 大模型生成 Verilog 的"人设崩塌"
我把这类现象总结成一句话:模型擅长的是"写代码",而不是"交付功能"。交付功能意味着你的代码要跟具体的 FPGA 芯片绑定,跟时钟网络绑定,跟引脚绑定,还要跟工具链里那一堆时序约束和布局布线选项绑定。缺了任何一环,代码就是一堆漂亮的语法糖。
Ross 的开发团队显然也明白这一点,所以它没有把"写代码"作为核心卖点。它的核心能力被定义成"交付":你要的是一个能在板子上跑起来的比特流,而不是一段好看的 RTL。为了实现这个定位,Ross 需要补齐三块能力:第一,理解工程上下文,知道当前工程是什么器件、哪些约束、哪些模块;第二,操作系统接口,Vivado 的 Tcl 接口天然就是 Agent 最顺手的 API;第三,读报告和做决策,综合后的时序报告、利用率报告要能转译成下一步动作。这三点,分别对应架构里的工具层、上下文层和决策层。
1.2 Ross 想补的短板:从"能写代码"到"能交付比特流"
为什么 AMD 要亲自下场而不是继续用第三方脚本?我个人的判断是,第三方工具只能做到"调用命令行",做不到"理解工程语义"。Vivado 工程里藏着大量隐性信息:某个信号为什么跨时钟域、某个 IP 为什么用了这种配置、某条约束为什么被注释掉——这些信息不在 RTL 里,也不在报告里,而在工程师的脑子里。AMD 的算盘是,让 Agent 长在 Vivado 的工程数据模型上,把工程语义结构化地喂给模型,才能让 AI 真正参与交付。
1.3 Ross 在 AMD 产品线里的位置
从产品形态看,Ross 大概率不是独立于 Vivado 跑的另一个程序,而是挂在 Vivado 旁边的 Agent 服务。它通过 Tcl 和底层数据接口跟 Vivado 通信,最终调用的还是 read_verilog、synth_design、place_design 这些老命令。这让我挺感慨:FPGA 行业喊了多年的"用 Tcl 自动化",终于被 Agent 给发扬光大了。AMD 选择在 Vivado 生态上做这件事,也说明即便是头部 EDA 厂商,也把 Agent 化当成下一个十年的重点方向。
2. Ross 的架构拆解:Agent 怎么把自然语言变成比特流
如果只看表面,Ross 像是一个"会用 Tcl 的 ChatGPT";但真要把自然语言变成比特流,中间至少需要四层设计:工具层、上下文层、规划执行层、记忆层。我逐个拆。
2.1 工具层设计:Tcl 不是脚本,是 Agent 的"手和脚"
做过 Vivado 自动化的人都知道,Vivado 最硬核的能力不是图形界面,而是 Tcl 批处理接口。你在 GUI 里点的每一个菜单项,几乎都能对应到一条 Tcl 命令。Ross 的工具层,就是把一批常用 Tcl 命令封装成 Agent 可调用的函数,每个函数有明确的输入输出定义。下面是我根据公开资料和试用体验还原的一张工具清单:
| 工具名称 | 对应 Tcl 命令 | 输入参数 | 输出 |
|---|---|---|---|
| create_project | create_project | project_name, target_part | 工程路径 |
| add_sources | read_verilog / read_vhdl | file_paths | 源文件列表 |
| apply_constraints | read_xdc | xdc_path | 约束加载状态 |
| run_synthesis | synth_design | top_module, strategy | 综合报告路径 |
| run_implementation | place_design / route_design | 无 | 实现报告路径 |
| check_timing | report_timing_summary | 无 | 结构化时序数据 |
| write_bitstream | write_bitstream | output_path | 比特流文件 |
这里有个很关键的设计:不是把整条 Tcl 命令丢给模型去写,而是抽象成参数化工具。原因很简单,Tcl 的命令语法虽然统一,但参数组合非常多,模型直接生成容易拼出语法正确但语义离谱的命令,比如在 create_project 里填一个不存在的 part。参数化之后,工具的输入被约束在合法范围内,模型出错的空间就小多了。这跟 Agent 领域里常说的 function calling 是同一个思路。
2.2 上下文层设计:让模型读得懂你的工程
光有工具还不行,Agent 得知道当前工程处于什么状态。Ross 的做法是持续维护一份工程摘要,包括器件型号、顶层模块列表、约束文件、综合策略、当前时序余量等,在每轮对话时作为系统提示的一部分喂给模型。工程比较大的时候,再配合检索机制按需提取:比如讨论到某个模块的时序时,才把那个模块的 RTL 片段和约束拉进来。
这是典型的 RAG 思路,主要目的有两个:省 token,以及减少无关信息对模型判断的干扰。为什么这条重要?因为我见过太多把整个工程源码灌给模型的方案,结果模型在几百个文件里找顶层模块找到怀疑人生。Ross 这种"摘要 + 按需检索"的做法,才是工程环境下能落地的方案。它相当于先给模型一份地图,再让它按图索骥,而不是一上来就把整个城市的路网塞给它。
2.3 规划与执行:把"做个串口"拆成 VIVADO 能执行的步骤
Ross 收到指令后,不会直接去执行"做个串口"这种含糊动作,而是先经过规划器拆解。规划器的作用是把自然语言需求转成一个可执行的动作列表。比如"串口回环 + LED 心跳"会被拆成:
- 创建工程并指定器件
- 生成顶层 RTL,包含 UART 收发和 LED 分频模块
- 读取引脚约束,绑定串口引脚和时钟引脚
- 跑综合
- 跑实现
- 检查时序报告
- 生成比特流
每一步之间是有依赖关系的:第 2 步的 RTL 要匹配第 3 步的引脚名,第 5 步的实现结果要回头喂给第 6 步的判断。所以 Ross 的执行器不是简单按顺序跑,而是一个"规划—执行—反馈—再规划"的循环。每次工具调用返回后,结果会被送回给模型,模型根据结果决定下一步是继续、调整参数,还是回滚到上一步重新生成代码。说白了,它不是在跑批处理脚本,而是在跑一个带反馈的控制回路。
2.4 记忆与纠错:上次失败的命令会被记住
最后一块是记忆。Ross 至少有分两层记忆:会话记忆负责记住当前项目里已经做过哪些操作,比如"约束文件已经加了,不要再重复 add_files";工程级记忆则跨会话保留,比如上次综合失败的原因是某个 XDC 引脚约束不存在,下次再遇到类似工程时会先在约束检查上多花一步。这层设计不算惊艳,但很实用。实际跑工程时你会发现,Agent 和工程师一样,会重复犯同一个错误;有没有记忆机制,直接决定它是"越用越顺手"还是"每天重新做人"。
3. Ross 怎么用 Vivado 干活:一条从 create_project 到 write_bitstream 的链路
这一章我把 Ross 在典型项目里的行为链路完整过一遍,顺便讲讲每一步背后我在实际使用中总结的取舍逻辑。
3.1 工程初始化:Agent 第一次接触你的工程时问什么
第一次开项目,Ross 会先跟你确认几件事:目标器件或开发板型号、外部时钟频率、需要复用的 IP 还是纯 RTL、约束文件在哪里。不要小看这些"废话",它们直接影响 create_project 和 read_xdc 的参数。比如你告诉它目标板是 ARTY A7,它会查到这个板子对应的 XC7A35TICSG324-1L 器件,然后自动填进 create_project 的 -part 参数。如果你给它的器件型号和板卡实际型号不一致,它也会在创建工程后读回实际 part,跟你的输入做一次交叉验证。
这里有一个大家容易忽略的坑:环境变量和 license。Ross 调用的 Vivado 是你本机的 Vivado,license 跟你自己用 Tcl 脚本时一模一样;如果 license 或者环境变量没配好,它的第一次综合可能直接失败,而且报错信息不会告诉你"license 有问题",只会告诉你"无法启动设计"。所以在你兴冲冲让 Agent 干活之前,先在终端里跑一句 vivado -mode batch -source 确认基本环境是通的。
3.2 RTL 生成与 IP 装配:什么时候该信它写的代码
Ross 写 RTL 时,默认会走"可综合、单时钟域优先"的保守路线。比如 UART 模块,它生成的分频计数器会显式写出参数化位宽,避免我之前说的溢出问题;跨时钟域的握手逻辑也会尽量简化,减少时序风险。如果需求里要求用到 MIPI、LVDS 这类高速接口,Ross 通常不会硬写裸逻辑,而是引导你去用 Vivado 里的 IP(比如 MIPI D-PHY IP),再通过 Tcl 把 IP 配置和生成流程串起来。
我自己的判断标准是这样的:
- 单时钟域的胶水逻辑、协议状态机、简单的分频和回环,Agent 生成质量已经能打,直接信。
- 高频收发器、跨时钟域缓冲、带复杂时序约束的接口逻辑,最好还是用 IP 核和自己写的原语,别让 Agent 自由发挥。
- 无论哪种情况,全局的复位策略、时钟结构,都要人来定,Agent 可以在你定的框架里填内容。
这不是说 Agent 写不了复杂逻辑,而是这类逻辑的验证成本太高。模型生成完你依然要花大量时间审查,不如直接用经过硅验证的 IP,把人的精力放在系统层面。
3.3 综合与布局布线:Agent 怎么自己读时序报告
跑完 synth_design 之后,Ross 会主动读取综合报告里的资源利用率,判断有没有模块级异常;跑完 place_design 和 route_design 之后,它会解析时序报告。这里最值得拆的是"解析"这一步。
Vivado 的 timing summary 里,WNS(最差负时序裕量)、TNS(总负时序裕量)、WHS(最差保持时序裕量)三个数字,对工程师来说是体检指标,对模型来说只是几个数值。要让模型真正"看懂",Ross 会把报告结构化成表格,并附带违例路径的起点终点、时钟路径类型、组合逻辑级数这些字段。一个典型的判断逻辑是这样的:如果 WNS 是负几纳秒且违例路径集中在某一条跨时钟域路径上,Ross 会优先检查约束是否正确,而不是贸然加流水线;如果是全局性的时序紧张,利用率又高,它会考虑调整综合选项。
在实际使用中,我发现它对"违例路径的分布特征"特别敏感。比如同样 WNS = -0.5ns,一条长路径违例和一千条短路径违例,处理方法完全不一样——前者是逻辑级数问题,后者可能是拥塞。Ross 会先区分这两种情况,再决定动作,这一点比很多中级工程师还要严谨。
3.4 收敛策略:同一段时序违规,Agent 会怎么调
时序收敛是 FPGA 工程里最磨人的环节。Ross 在这块的策略,从实测看大致是这几板斧:
- 首选加流水线寄存器或调整逻辑级数;
- 次选调整 XDC 约束,比如对非关键路径放宽或分组;
- 再选改综合选项,比如打开 retiming、调整 keep_hierarchy、换 directive;
- 很少一上来就动 floorplan,因为 Pblock 这类物理约束需要了解整个工程布局,模型没有这个直觉。
你会发现它的行为逻辑跟一个初中级工程师很像:先把能通过"改代码 + 改选项"解决的问题解决掉,物理层面的事留给经验更丰富的人。这恰好也是当下 Agent 的合理边界——不硬装自己做不到的事。实际用下来,Ross 在这种常规收敛场景里的成功率比我预期的要高,因为它迭代速度快,试错成本几乎为零,同一段逻辑它能在几分钟内换好几套方案跑给你看。
4. 实测场景:让 Ross 跑通"串口回环 + LED 心跳"这个小项目
光讲架构不够,我按自己的习惯给 Ross 布置了个小任务:在一个常见 Artix-7 板卡上实现串口回环和 LED 心跳,看看从对话到比特流要几步。这个项目麻雀虽小,但覆盖了建工程、写 RTL、约束、综合、实现、出流的完整链路。
4.1 交互过程还原
我的对话大概是这样的:
"帮我建一个工程,器件选 XC7A35T-1CSG324C,时钟输入 100MHz,管脚是 L16。我要实现 UART 回环,还有一个 1 秒周期的 LED 闪烁。"
Ross 没有追问太多,直接开始规划。它先创建工程,然后生成两个模块:一个 uart_loopback,一个 led_blink,顶层把两者连接起来。接着它读取约束,把时钟管脚、串口收发管脚、LED 管脚写进 XDC。之后跑综合、实现、时序检查,最后输出比特流。整个过程大概十分钟,比我预想的快,因为其中大部分时间是综合和布局布线在跑。
4.2 生成的 RTL 与约束长什么样
顶层逻辑简化之后大概是这样的:
module top( input wire clk_100m, input wire uart_rx, output wire uart_tx, output wire led ); wire rx_ready; wire [7:0] rx_data; uart_loopback uart_inst ( .clk_100m (clk_100m), .rx (uart_rx), .tx (uart_tx), .rx_data (rx_data), .rx_ready (rx_ready) ); led_blink #(.PERIOD(100_000_000)) led_inst ( .clk_100m (clk_100m), .led_out (led) ); endmodule代码本身没什么花活,结构干净,命名也规范。约束方面,它默认给的是 create_clock 加引脚位置,没有画蛇添足加一些多余的假路径约束。这一点让我比较满意,因为见过太多 AI 生成代码的人喜欢一股脑写 set_false_path,把问题掩盖掉。XDC 里有一个细节值得提:它没有把未使用的引脚全部设成 false path,而是把不用的 bank 电压配成标准值再让工具自动处理,这比很多新手写死约束要灵活。
4.3 比特流生成与板卡验证
真正给我挖坑的是第一步综合。Ross 生成的 uart_loopback 里,接收模块用了波特率分频器,代码逻辑没问题,但它把分频计数器的位宽设成了 16 位,100MHz 下配 115200 波特率需要 868 的分频系数,算上误差累积刚好卡在计数器溢出的临界点。综合没报错,但时序报告里出现了一条 setup 违例。
Ross 的反馈行为是:读报告 → 定位到这个分频器 → 主动把位宽改成 20 位 → 重跑实现 → 时序收敛。这一步是整场实测里最让我意外的地方。因为它不是在写代码时规避问题,而是在读到真实时序报告之后定位问题并自我修正。这个"反馈闭环"如果没有,Ross 跟普通代码生成器就没区别;有了它,才算是一个真正会干活的 Agent。
另外说一句,如果 write_bitstream 失败,Ross 会优先检查三类问题:有没有没约束的 IO、有没有资源溢出、有没有 DRC 错误。它会挨个排查,而不是干瞪眼让你自己看报告。我在另一个工程里故意少写了一条引脚约束,它花了两轮对话就定位到问题并补上了。
4.4 体验总结:哪些环节真的省了时间
实测下来,时间分布大概是这样的:
| 环节 | 手动操作耗时 | Ross 操作耗时 | 我的参与度 |
|---|---|---|---|
| 工程初始化 | 10 分钟 | 不到 1 分钟 | 低 |
| RTL 生成与约束绑定 | 40 分钟 | 15 分钟 | 中(需审查) |
| 综合实现与报告解析 | 20 分钟 | 5 分钟 | 低 |
| 时序问题定位与修正 | 30 分钟 | 10 分钟 | 中 |
| 代码与约束审查 | 15 分钟 | 15 分钟 | 高 |
整体上,对一个简单 demo 项目,我从打开 Vivado 到拿到比特流确实压缩到了原来一半以内。省下的时间主要来自工程初始化和报告解析,代价是我需要花时间审查它的代码和约束。它不是让你完全撒手不管,而是把你从杂活里解放出来,让你把精力放到更有价值的地方。
5. 边界与避坑:Ross 现阶段不能替你做什么
新鲜劲过了之后,我花了更多时间试它真正难啃的活。结论是:边界还挺清晰的。下面按从轻到重的顺序说。
5.1 独热码 VS 二进制编码这类"经验题"很容易翻车
先拿状态机编码来说。我问 Ross:"我这个状态机有 12 个状态,逻辑利用率已经到 80%,该用独热码还是二进制编码?" 它给出的是标准教科书答案:状态数少用独热码,状态多、资源紧张就用二进制,或者让综合器自动选。
这话没错,但对一个利用率 80% 的工程来说,真正的决定因素不是状态数,而是你剩多少 LUT、寄存器,以及状态转移逻辑会不会成为关键路径。Ross 读得到利用率报告,却很难把"编码方式对下一版布局的影响"这种经验判断量化出来。它不会像老工程师那样,直接告诉你"你这工程逻辑深度已经三级了,别用独热码,状态编码会再多耗一组 LUT 做译码"。这种基于盘感和项目历史判断的能力,模型还差得远。
5.2 时序收敛的玄学:Agent 能处理到第几层
第二个坑是物理层面的时序收敛。有一版设计,布局布线后 WNS 是 -0.8ns,违例路径全挤在芯片中间的一个区域,明显是拥塞问题。Ross 的处理是加流水线、调选项,来回折腾了三轮,时序仍然差口气。我人肉介入后,把两个大模块用 Pblock 分开,给它们各划了一块区域,一次性收敛。
这个案例说明:Agent 在处理"逻辑层面"的时序优化时已经有可用性,但在"物理层面"的拥塞控制上,它没有布局布线的空间直觉。Pblock、区域约束、合理规划模块位置,这些动作需要对芯片资源的空间理解,恰好是当前模型最弱的环节。如果你遇到的是拥塞类时序问题,别在 Agent 上耗太久,直接自己上手做物理约束。
5.3 架构级取舍:AXI 互联选型这种活还得人来
再往上一层,Ross 在架构选型上也只会给你"参考方案"。比如设计里需要多主多从的 AXI 互联,它会说可以用 AXI Interconnect IP 或 AXI SmartConnect,甚至给你列出两者在延迟和资源上的差异。但你让它根据你的具体带宽和延迟要求做最终决定,它就开始打太极,把所有选项的好处列一遍,最后说"建议结合您的实测数据选择"。
这类决策按现在的叫法叫"权衡艺术":带宽、延迟、资源、功耗、可维护性,五个维度往往互相冲突,没有绝对正确的答案。模型能列出要素,但没法替你拍板——因为它没有你项目的性能预算和成本压力。我一直觉得,架构决策是 FPGA 工程师最需要守住的地方,Agent 最多是个高级参谋。
5.4 工程清理、版本管理、多人协作里的 Agent 盲区
最后提三个容易被忽略的日常场景:工程清理、版本管理、多人协作。Ross 对 Vivado 工程里 regenerated IP、中间缓存文件这类"垃圾"的处理,能做到规整,但它不会判断哪些文件被 git 追踪、哪些是生成物、哪些改动会影响别人的工作区。
举个真实例子:我让它做一次 vivado 工程清理,它把我自己加进去的一个定制 IP 目录误当成中间产物,差点删掉。原因很简单,从文件命名的角度看,那个目录确实像是 IP 生成物,但它是团队共享的手写 IP。这种"历史包袱"和"团队约定",Agent 无法从工程本身理解。在多人协作场景下,特别建议给 Ross 设置操作边界:只允许读报告和跑综合实现,涉及删除、移动、重命名文件的操作要经过你确认。
安全性也是一个值得说的点。Ross 这类 Agent 如果能执行任意命令,它就有能力做破坏性操作。我目前的做法是单独起一个工程目录给它折腾,只在隔离环境里让它自由发挥,涉及主工程的写操作一律走 review。等整个 Agent 生态成熟了,权限控制一定会成为和功能同等重要的话题。
6. 一个老 FPGA 工程师的判断:Ross 会改变什么,不会改变什么
最后说点个人的判断,不算是总结,更像是一个在工具链里泡了十几年的人的直觉。
6.1 门槛降低:小白能到哪一步
Ross 类工具最直接的影响是把 FPGA 开发的门槛拉低了一截。以前一个完全没接触过 FPGA 的人,要迈过 Verilog 语法、时序约束、Tcl 脚本三道坎才能"让 LED 亮起来",现在可以自然语言直接驱动。我拿一个完全没写过 RTL 的朋友做了个实验,他在 Ross 引导下真的在三小时内跑通了前面那个串口回环项目,整个过程没有碰过一行 Tcl。
但注意,这只是"跑通",不是"理解"。他不清楚为什么约束里要写 create_clock,也不明白 retiming 改了哪些逻辑。这些知识以前要半年积累,现在欠账了——等遇到真正的疑难问题,这些欠账都会加倍讨回来。我的建议是:入门学习可以用它建立"工程感",但 RTL 和约束一定要一条条看懂再用,别让工具替你思考。
6.2 天花板变高:资深工程师的新杠杆
对老工程师来说,Ross 类工具更像一个效率杠杆。我把它用于几个验证性的小项目时,最明显的感觉是"琐事被接管了":建工程、跑约束、解析报告、清理目录,这些以前至少占三分之一的杂活,现在扔给它就行。省下来的时间可以放在架构设计、性能调优和代码评审上。我甚至开始尝试让 Ross 并行管理两个小项目的综合实现,它执行得比我想象中从容。
这实际上是在改变 FPGA 工程师的工作结构:以前是"人围着工具转",以后是"工具围着人转"。定义问题、设置约束、做决策、审结果,这些动作的占比会越来越高。换句话说,资深工程师的天花板没有被压低,反而被抬高了——一个人能同时盯住的工程盘子变大了。
6.3 现在要不要上车:我的建议
给一个不模棱两可的建议:
- 如果你手头有 Vivado 工程,建议现在就拿一个小模块去试,别拿关键项目试水;
- 如果你是课程设计或入门学习,可以用它快速建立工程感,但一定要把 RTL 和约束一条条看明白再用;
- 如果你是团队负责人,可以组织几个人先做一轮内部评测,重点看它在你们常用板卡和特定时序场景下的表现,而不是听厂商宣传;
- 如果你想在生产环境用,先搭好权限隔离和人工 review 机制,再慢慢扩大使用范围。
从趋势上看,FPGA 开发的 Agent 化是不可逆的。Ross 只是 AMD 把这个方向产品化的第一步,后续大概率会有更深层的集成,比如把 Versal 的 NoC 配置、DFX 动态加载甚至硬核处理器子系统都纳入 Agent 的编排范围。到那时候,FPGA 工程师的身份会更像"带新人的技术总监":你负责教它、审它、训它,它负责把你的意图变成硬件。
我个人的体会是:与其焦虑 Agent 会不会取代 FPGA 工程师,不如想想自己有没有能力定义清楚一个问题。能被清晰定义和标准执行的活,交给 Agent 只是时间问题;而定义问题、看清边界、做最终决策的活,至少在这个阶段,还是得靠人。Ross 最打动我的地方,不是它写 RTL 有多熟练,而是它第一次让我觉得工具终于开始理解"工程"这两个字的分量了。