|
|

楼主 |
发表于 2026-5-11 18:00:31
|
显示全部楼层
# FPGA 代码生成:AI 能做到什么,做不到什么
## 一、FPGA 的开发语言
大家都知道,主流 FPGA 所使用的代码是 HDL(Hardware Description Language,硬件描述语言)。HDL 大类又包含两个体系,即 Verilog 和 VHDL。
Verilog:简洁、灵活、容易快速写 RTL。
VHDL:严谨、笨重,描述更加稳定。
Verilog 和 VHDL 的区别,好比一个青年学者和老学究。
VHDL 往往用于一些超长期使用,且底层代码不易变更的工程中。比如军工、航空、医疗等场景,底码变更难度巨大,会更倾向于使用 VHDL。我以前的房东年轻的时候就是写 VHDL 出身,他的 VHDL 一直写到 70 岁被辞退,也能看出来 VHDL 的历史之悠久。
Verilog 则是当下更流行的 HDL 语言。由于轻量级,更具有开发优势和代码量优势。同时到了 SystemVerilog 之后,接口、类型、约束和验证能力都有了更好的补充,因此更加好用。
楼主是数字 IC 设计出身,常年和这两个东西打交道。整体来讲,当下市场还是 Verilog/SystemVerilog 比 VHDL 用得更多。本帖后面所提及的 HDL 语言,主要特指 Verilog/SystemVerilog 这一套体系。
---
## 二、SystemVerilog 和 Verilog
在国内很多时候,大家讨论 SystemVerilog 和 Verilog,往往会说:
> SystemVerilog 用于验证,Verilog 用于设计。
事实真的如此么?
大错特错。
更准确地说,SystemVerilog 是 Verilog 的扩展增强,兼容传统 Verilog 代码。换句话说,Verilog 能做的事情,SystemVerilog 基本都能做。
SystemVerilog 额外提供了很多更适合现代工程的能力,比如更清晰的 RTL 描述方式、更好的类型系统、更方便的接口封装能力,以及对 C 更友好的 DPI 接口。这些能力不仅服务于验证,也服务于设计和工程组织。
但是这里也要注意,SystemVerilog 里面有一部分高级验证语法,比如 class、随机约束、coverage 等,是不可综合的,不能直接变成硬件。所以不是所有 SystemVerilog 语法都能用于 RTL 设计。
因此二者不是“SystemVerilog 只能验证,Verilog 只能设计”的关系。更准确的说法是:
> SystemVerilog 既可以用于设计,也可以用于验证;
> Verilog 可以理解为 SystemVerilog 体系中的一个旧子集;
> 只是 SystemVerilog 中的部分验证特性不可综合。
很多工程里嘴上说写 Verilog,实际已经在用 SystemVerilog 的语法。尤其在现在的 ASIC/FPGA 设计中,SystemVerilog 已经是更加工程化的写法。传统 Verilog 当然还能用,但如果一个新工程完全不使用 SystemVerilog 的增强能力,本质上就是自己给自己加难度。
---
## 三、传统 HDL 代码生成
不是所有的模型都能生成 HDL,不是所有的 HDL 都能烧到 FPGA。
这句话解释起来比较复杂。一旦涉及 HDL,由于其独特的 PPA 概念,也就是功耗 Power、性能 Performance、面积 Area,它就不是“生成代码之后就能用”的东西。
HDL 不是普通软件代码。C 代码只要编译通过,CPU 大概率就能按指令执行。但是 HDL 背后对应的是硬件结构,后面还要经过综合、实现、布局布线、时序分析、资源分析和板级验证。
所以 FPGA 工程里经常会出现这种情况:
能仿真,不代表能综合。
能综合,不代表能实现。
能实现,不代表能过时序。
能过时序,不代表资源合理。
资源合理,也不代表上板之后一定没问题。
这也是很多非科班出身的人对 FPGA 敬而远之的原因。它不是写完代码就完事,后面有大量硬件级二次开发工作。
从模型到静态 HDL 代码生成的效率往往很低,其根本原因是:你需要在模型层级就提前考虑 HDL 代码的时序和并行能力。
### 1. 并行能力的问题
一般来讲,工程上 FPGA,对性能是有需求的。FPGA 之所以快,就在于其特殊的并行能力和多 IO 能力。
但是从建模层级,很难真正操作和提升并行能力。模型更多描述的是系统行为、数学关系和信号流,它告诉你“这个系统怎么算”,但不一定告诉你“这个硬件应该怎么长”。
真正到 FPGA 里,需要考虑的是:
哪个循环要展开,哪个模块要流水,哪个数组要分区,哪个乘法要进 DSP,哪个存储要用 BRAM,哪个路径要打拍,哪个接口要流式化。
这些问题本质上已经不是单纯的模型问题,而是硬件微架构问题。
所以模型生成 HDL 最大的问题,不是“能不能生成代码文本”,而是“生成出来的硬件结构到底好不好”。
### 2. 时序违例的问题
从建模层级也很难真正处理时序违例问题。
即使有部分时序参数可调,也往往只是粗粒度调节。它可以给你一些参数和容差,但很难像 IC/FPGA 工程师一样,对关键路径、寄存器位置、流水结构、资源映射和布线压力做细节调整。
而时序问题往往又非常具体:
组合路径太长,乘加链太深,BRAM 端口不够,数组访问冲突,pipeline 插得不合理,模块之间握手反压,跨时钟域没处理好,接口协议拖慢吞吐。
这些东西不是模型层级点几个按钮就能彻底解决的。
而对于模型工程师来说,像 IC 设计工程师一样考虑 HDL 的综合行为、时序路径和硬件资源映射,更是天方夜谭。
所以 HDL Coder 类的静态编译器能用,但是不好用。
它可以解决一部分规则清晰、边界明确、性能压力不大的场景。但如果目标是高频、高性能、强实时的 FPGA 工程,后面大概率还是要 FPGA 工程师下场继续修。
|
|