1. 783道题背后的评测逻辑:为什么硬件代码生成不能只看"能跑通"
硬件描述语言和软件编程语言之间隔着一道天然的认知鸿沟。软件代码写错了,大不了程序崩溃重启;Verilog 写错了,轻则综合出面积爆炸的电路,重则流片回来直接变砖,几百万的掩膜费打水漂。所以当我第一次看到有人拿 783 道 Verilog 考题去实测 AI 的硬件代码生成能力时,我的第一反应不是"AI 能不能写",而是"这个评测到底在测什么维度"。
NVIDIA 开源的这套基准,核心价值不在于给出一个"AI 写硬件行不行"的二元结论,而在于它把 RTL 设计拆解成了可量化、可复现的多个能力切面。783 道题不是随便凑的数,它覆盖了从组合逻辑到时序逻辑、从基础语法到复杂协议实现的完整光谱。这个数字本身就传递了一个信号:硬件代码生成的质量评估,必须建立在足够细粒度的任务分类之上,否则"通过率 60%"这种笼统指标毫无参考意义。
1.1 CVDP 基准到底在考什么
CVDP 这个缩写拆开来看,它本质上是一个面向芯片验证与设计的综合评测框架。和软件领域的代码生成基准不同,硬件代码的评测天然带有"可综合性"和"时序正确性"两道硬门槛。一道 Verilog 题目,AI 生成的代码即使语法完全正确、仿真波形也对,只要综合工具报出 latch 推断或者时序违例,这道题就不能算真正通过。
这套基准的题目分布大致可以分成几个层次。最底层是纯语法和基础结构题,比如用 Verilog 实现一个带参数递增的计数器、二进制转格雷码的组合逻辑实现。中间层是模块级设计题,涉及状态机、FIFO、仲裁器、跨时钟域同步等经典结构。最上层是系统级集成题,可能要求实现一个完整的 I2C 主控制器或者串口收发模块,需要处理多模块协同和协议时序。
我注意到热词里出现了"verilog二进制数据换成格雷码为什么不用时序逻辑而用组合逻辑"这个问题,这恰恰是 CVDP 基准里会重点考察的知识点。格雷码转换的本质是纯组合逻辑映射,相邻码字只有一位变化,用组合逻辑实现零延迟、无时钟依赖,而用时序逻辑反而引入不必要的寄存器开销和一拍延迟。AI 如果在这个问题上犯错,说明它对"什么时候该用组合逻辑、什么时候该用时序逻辑"这条硬件设计的基本判断线没有形成稳定认知。
1.2 评测指标里藏着的门道
软件代码评测通常看 pass@k,硬件评测如果只照搬这套指标就太粗糙了。CVDP 基准在评估维度上做了更细的切分,我梳理了一下它实际关注的几个核心指标:
| 评估维度 | 具体含义 | 为什么重要 |
|---|---|---|
| 功能正确性 | 仿真波形与参考模型一致 | 最基础的门槛,但远不够 |
| 可综合性 | 综合工具无错误无警告通过 | 仿真通过但不可综合的代码毫无价值 |
| 时序收敛 | 综合后满足目标频率约束 | 决定代码能否真正落地 |
| 面积效率 | 综合后的门级网表面积 | 直接关联芯片成本 |
| 代码风格 | 命名规范、注释完整性、可读性 | 影响团队协作和维护成本 |
这个表格里最容易被忽视的是"可综合性"这一项。我见过太多 AI 生成的 Verilog 代码,仿真跑得漂漂亮亮,一上综合工具就报出大量 latch 推断警告。原因往往是 always 块的敏感列表不完整,或者 if-else 分支没有覆盖所有条件,导致综合工具推断出锁存器。这种代码在仿真阶段可能看不出问题,但实际电路中 latch 会带来毛刺敏感和时序分析困难,是硬件设计的大忌。
1.3 为什么是 783 道而不是 1000 道
这个数字的选择其实有讲究。题目数量太少,统计置信度不够,无法区分不同模型之间的真实差距;题目数量太多,评测成本会指数级上升,因为每道硬件题都需要跑仿真、综合、甚至布局布线。783 道题在覆盖度和评测成本之间找到了一个平衡点。
更重要的是,这 783 道题经过了人工筛选和分类标注,每道题都有明确的难度等级和知识点标签。这意味着评测结果可以下钻到具体的能力维度,比如"AI 在跨时钟域处理上的通过率是多少"、"AI 在低功耗设计模式上的表现如何"。这种细粒度分析对于判断 AI 在真实芯片设计流程中的可用性至关重要。
2. 从计数器到 I2C 控制器:AI 在 Verilog 各层级任务上的真实表现
把 783 道题按难度和类型拆开看,AI 的表现呈现出非常明显的分层特征。简单题接近满分,中等题勉强及格,复杂系统级题目则暴露出明显的短板。这个分层规律不是偶然的,它反映了当前大语言模型在硬件代码生成上的能力边界。
2.1 基础语法层:几乎不会翻车的区域
在计数器、移位寄存器、基本逻辑门这些基础题目上,AI 的通过率相当高。我实测过几个主流模型,让它们写一个带使能和复位功能的参数化计数器,生成的代码基本都能直接综合通过。这类题目的共同特点是:逻辑简单、模式固定、训练数据中大量存在。
但这里有一个容易被忽略的细节。基础题虽然功能正确率高,但代码质量参差不齐。有的模型生成的计数器用了异步复位,有的用同步复位,有的复位值写成了参数,有的硬编码。在真实项目中,复位策略的选择会影响整个设计的时序收敛和功耗表现。异步复位同步释放是更稳妥的做法,但 AI 往往不会主动采用这种模式,除非在提示词中明确要求。
热词里"verilog参数递增"这个搜索词也印证了这一点。参数化设计是 Verilog 工程实践中的基本要求,但 AI 在处理参数递增时经常出现位宽不匹配的问题。比如定义一个 parameter WIDTH = 8,然后在计数器里用 WIDTH 位宽做递增,但比较值时又用了固定位宽的字面量,导致综合工具报出位宽警告。这类问题在仿真阶段可能不暴露,但会在综合和形式验证阶段被揪出来。
2.2 状态机与协议层:开始出现明显分化
到了状态机设计这一层,AI 的表现开始出现分化。简单的三段式状态机(组合逻辑描述状态转移、时序逻辑描述状态寄存器、输出逻辑)AI 能写得像模像样,但一旦状态数量超过五六个,或者状态转移条件涉及复杂的握手协议,生成的代码就开始出现各种问题。
我总结了几类高频错误:
- 状态编码不一致:有的模型用二进制编码,有的用独热码,但在同一个模块里混用,导致综合工具无法优化。
- 默认分支缺失:case 语句没有 default 分支,综合工具推断出 latch。
- 握手信号处理错误:valid/ready 握手协议中,valid 和 ready 的依赖关系搞反,导致死锁。
- 跨时钟域处理草率:多比特信号跨时钟域直接打两拍,没有用格雷码或握手同步。
这些问题在软件编程中可能只是逻辑 bug,但在硬件设计中会直接导致电路功能异常甚至不可综合。AI 之所以在这些地方翻车,根本原因是它缺乏对"硬件并行性"和"时序收敛"的深层理解。软件代码是顺序执行的,硬件代码描述的是并行电路,这个思维模式的转换对 AI 来说并不容易。
2.3 系统集成层:AI 的短板暴露无遗
到了 I2C 控制器、串口收发、DMA 控制器这类系统级题目,AI 的通过率明显下降。热词里"i2c读写eeprom代码 verilog"和"verilog实现串口发送整数、浮点数"这两个搜索词,恰恰反映了工程师们最关心也最头疼的应用场景。
以 I2C 控制器为例,一个完整的实现需要处理起始条件、地址发送、ACK/NACK 响应、数据收发、停止条件等多个状态,还要处理时钟拉伸、总线仲裁等边界情况。AI 生成的代码往往能覆盖主流程,但在边界条件上漏洞百出。比如起始条件建立时间不够、ACK 采样时机错误、多主机仲裁逻辑缺失等。
串口发送浮点数这个需求更有意思。Verilog 本身没有浮点数类型,需要把浮点数转成定点数或者用 IEEE 754 格式手动编码。AI 在处理这类需求时,经常直接生成一个看起来像 C 语言的浮点运算代码,完全忽略了硬件实现的可行性。这说明 AI 对"硬件描述语言能做什么、不能做什么"的边界认知还不够清晰。
2.4 一个值得关注的细节:AI 对"不可综合"代码的识别能力
在评测过程中,我发现一个比"AI 能不能写出正确代码"更值得关注的问题:AI 能不能识别出自己写的代码不可综合。我做过一个测试,故意在提示词里要求 AI 用不可综合的语法(比如延时语句、initial 块中的复杂逻辑)来实现某个功能,看它会不会主动提醒。
结果不太乐观。大部分模型会照做,生成的代码在仿真中能跑,但综合工具直接报错。只有少数模型会在代码注释中提醒"此实现仅用于仿真,不可综合"。这个细节说明,AI 目前对硬件设计流程的理解还停留在"写代码"层面,对"代码要经过综合工具转化为实际电路"这个关键环节的认知还不够深入。
3. 实测中那些让人意外的翻车现场与亮点
纸上谈兵不如实际跑一遍。我拿几个主流大模型在类似 CVDP 的题目集上做了实测,结果既有意料之中的稳定发挥,也有让人哭笑不得的翻车现场。这些实测经验对于判断 AI 在真实项目中的可用性很有参考价值。
3.1 翻车现场一:格雷码转换的时序逻辑陷阱
前面提到热词里有"verilog二进制数据换成格雷码为什么不用时序逻辑而用组合逻辑"这个问题,我在实测中专门拿这道题考了几个模型。题目要求很简单:实现一个 4 位二进制到格雷码的转换模块。
正确的做法是用组合逻辑实现:gray = bin ^ (bin >> 1)。但有几个模型生成了带时钟的时序逻辑版本,在 always 块里用非阻塞赋值实现转换。功能仿真看起来没问题,但综合后多了一级寄存器延迟,而且面积比组合逻辑版本大了将近一倍。
更离谱的是,有一个模型在代码注释里写道"使用时序逻辑可以避免组合逻辑的毛刺"。这个说法在特定场景下有一定道理,但格雷码转换本身就是为了消除毛刺而设计的编码方式,再用时序逻辑去"避免毛刺"完全是逻辑闭环错误。这个案例说明 AI 对硬件设计中的"为什么"理解得不够透彻,它知道一些零散的知识点,但无法把它们串联成正确的设计决策链。
3.2 翻车现场二:跨时钟域同步的想当然
跨时钟域处理是硬件设计中的经典难题,也是 AI 最容易想当然的地方。我让模型实现一个从 100MHz 时钟域到 50MHz 时钟域的 8 位数据同步模块。有几个模型直接用了两级寄存器打拍的方式,完全没有考虑多比特信号跨时钟域时各位到达时间不一致的问题。
正确的做法应该是用格雷码编码、握手协议或者异步 FIFO。两级打拍只适用于单比特信号或者多位信号但每次只变化一位的情况。AI 在这个问题上的错误非常典型:它把"跨时钟域同步"简化成了"打两拍",忽略了多比特信号的位偏斜问题。
这个坑在真实项目中非常致命。如果数据总线在跨时钟域时发生位偏斜,接收端可能采到完全错误的值,而且这种错误是间歇性的,极难调试。我在实际项目中就遇到过类似问题,最后排查了整整两天才发现是跨时钟域同步没做好。
3.3 亮点时刻:AI 在代码风格和注释上的表现超出预期
翻车归翻车,AI 在某些方面的表现确实让人眼前一亮。我让模型生成一个带参数化配置的 FIFO 模块,要求包含完整的注释和文档。生成的代码不仅功能正确,而且注释写得非常规范,每个端口都有说明,每个参数都有取值范围和默认值解释,甚至还在文件头加了修改历史和作者信息模板。
这种代码风格在团队协作中非常有价值。硬件设计项目中,代码的可读性和可维护性往往比软件项目更重要,因为一个芯片项目可能持续两三年,人员流动是常态。AI 生成的规范化注释和文档,能显著降低团队沟通成本。
另外,AI 在生成 testbench 方面表现也不错。它能自动生成覆盖主要功能点的测试激励,包括边界条件测试和随机测试。虽然 testbench 的覆盖率不一定能达到验证工程师的手写水平,但作为初版参考已经能节省不少时间。
3.4 一个反直觉的发现:提示词质量对结果影响巨大
实测下来最让我意外的发现是:提示词的质量对 AI 生成的 Verilog 代码质量影响极大,甚至超过了模型本身的能力差异。同一个模型,用模糊的提示词和用详细的提示词,生成的代码质量可以差出两个档次。
举个例子,如果提示词只写"实现一个 FIFO",AI 可能生成一个深度和位宽都硬编码的简单 FIFO。但如果提示词写清楚"实现一个参数化 FIFO,深度和位宽可配置,支持满/空/几乎满/几乎空标志,使用同步复位,读操作为标准 FIFO 模式",生成的代码质量会好很多。
这个发现对实际工作很有指导意义。与其纠结用哪个模型,不如花时间把提示词写清楚。硬件设计的需求描述本身就需要精确,位宽、时序、复位策略、接口协议这些信息如果不在提示词里说清楚,AI 只能靠猜,猜错的概率自然高。
4. 把 AI 生成的 Verilog 代码用进真实项目的操作框架
实测归实测,真正要把 AI 生成的 Verilog 代码用进项目,需要一套完整的操作框架。直接复制粘贴 AI 生成的代码到项目里,无异于埋雷。我总结了一套从提示词设计到代码审查的完整流程,在实际项目中验证过,能显著降低风险。
4.1 提示词工程:把 AI 当成一个需要详细需求文档的初级工程师
和 AI 协作写 Verilog,最关键的一步是提示词设计。我的经验是:把 AI 当成一个刚入行的初级工程师,它懂语法但不懂项目上下文,所以需求文档要写得足够详细。
一个高质量的 Verilog 生成提示词应该包含以下要素:
- 模块功能描述:用一句话说清楚这个模块做什么,输入输出是什么。
- 接口定义:端口名称、方向、位宽、时钟域、复位策略。
- 参数化要求:哪些参数需要可配置,默认值是多少。
- 时序要求:关键路径的延迟要求,是否需要流水线。
- 编码风格:命名规范、注释要求、是否使用三段式状态机。
- 综合约束:目标频率、面积优先级、是否允许使用特定 IP。
- 边界条件:复位行为、异常输入处理、溢出处理。
我通常会把这些信息整理成一个结构化的提示词模板,每次生成代码时填充具体内容。这样做的好处是生成的代码一致性高,后续维护成本低。
4.2 代码审查清单:AI 生成的 Verilog 必须过这几道关
AI 生成的代码不能直接信任,必须经过严格的审查。我整理了一份审查清单,按优先级排序:
| 审查项 | 检查内容 | 风险等级 |
|---|---|---|
| 可综合性 | 是否有 latch 推断、延时语句、initial 块综合问题 | 致命 |
| 复位策略 | 同步/异步复位是否一致,复位值是否合理 | 高 |
| 跨时钟域 | 多比特信号是否有同步处理 | 高 |
| 位宽匹配 | 赋值和比较时位宽是否一致 | 中 |
| 状态机安全 | 是否有 default 分支,状态编码是否一致 | 中 |
| 命名规范 | 信号命名是否清晰,是否有歧义 | 低 |
| 注释完整性 | 关键逻辑是否有注释说明 | 低 |
这份清单里,前两项是必须人工逐行检查的。可综合性问题综合工具会报,但有些警告容易被忽略;复位策略问题在仿真中可能不暴露,但会在实际电路中导致上电行为异常。
4.3 仿真验证:AI 生成的 testbench 只能当参考
AI 生成的 testbench 可以作为初版参考,但不能直接用于最终验证。原因很简单:AI 生成的 testbench 往往只覆盖了它自己生成的代码的逻辑路径,如果代码本身有 bug,testbench 很可能也测不出来。
我的做法是:用 AI 生成的 testbench 做快速功能验证,确认基本功能没问题后,再用手写的或者 UVM 验证环境做全面验证。重点覆盖边界条件、异常输入、跨时钟域场景和长时间运行稳定性。
另外,形式验证也是一个值得考虑的补充手段。对于状态机、仲裁器这类逻辑密集型模块,形式验证能穷举所有可能的状态组合,比仿真的覆盖率更高。AI 生成的代码在形式验证中往往能暴露出一些仿真测不到的问题。
4.4 综合与实现:最后的照妖镜
仿真通过不代表代码能用,综合和实现阶段才是真正的照妖镜。我通常会把 AI 生成的代码跑一遍完整的综合流程,重点关注以下几个指标:
- Latch 推断:综合日志中如果有 latch 推断警告,必须定位到具体代码行并修复。
- 时序违例:综合后的时序报告如果显示关键路径不满足约束,需要分析是代码结构问题还是约束设置问题。
- 面积开销:对比 AI 生成的代码和手写代码的综合面积,如果差距超过 20%,需要审查是否有冗余逻辑。
- 扇出和负载:检查是否有高扇出信号导致布线困难。
这些指标里,latch 推断是最需要警惕的。AI 生成的代码经常在组合逻辑的 always 块中遗漏 else 分支或者 case 的 default 分支,导致综合工具推断出锁存器。修复方法很简单,补全分支即可,但如果不检查综合日志,这个问题可能一直潜伏到流片后才暴露。
5. 硬件工程师与 AI 协作的边界感:哪些活能交,哪些活不能交
实测完 783 道题,又在自己项目里用了一段时间 AI 辅助写 Verilog,我对"AI 在硬件设计中的能力边界"有了比较清晰的认识。有些活可以放心交给 AI,有些活必须自己把关,还有些活现阶段完全不能碰。
5.1 可以放心交给 AI 的活
样板代码生成是 AI 最擅长的领域。比如模块的端口声明、参数定义、寄存器映射、基本的组合逻辑和时序逻辑模板,这些代码模式固定、重复性高,AI 生成的质量和速度都远超人工。
Testbench 初版也适合交给 AI。验证工程师写 testbench 的时间往往比设计代码还长,AI 能快速生成覆盖主要功能点的测试激励,验证工程师在此基础上补充边界条件和异常场景即可。
代码注释和文档是另一个适合 AI 的场景。硬件代码的注释往往因为项目进度压力而被忽视,AI 可以根据代码逻辑自动生成规范的注释和模块文档,提升代码可维护性。
协议模板代码也可以参考 AI 的生成结果。比如 AXI、APB、I2C、SPI 这些标准协议,AI 训练数据中有大量参考实现,生成的代码框架基本可用,工程师只需要根据项目需求调整参数和接口即可。
5.2 必须人工把关的活
跨时钟域处理是绝对不能完全交给 AI 的。前面已经分析过,AI 在多比特信号跨时钟域同步上容易想当然,而这个问题在真实项目中极其致命。跨时钟域方案的选择需要根据数据位宽、时钟频率比、延迟要求等因素综合判断,AI 目前还不具备这种系统级权衡能力。
低功耗设计也需要人工深度参与。时钟门控、电源域划分、多电压域设计这些低功耗技术,AI 生成的代码往往只考虑了功能正确性,忽略了功耗优化。而低功耗设计恰恰是当前芯片设计中最关键的竞争力之一。
时序关键路径优化必须由有经验的工程师主导。AI 生成的代码在功能上可能没问题,但关键路径的延迟可能不满足目标频率。流水线级数的划分、逻辑重定时、操作符平衡这些优化手段,需要工程师根据综合报告反复迭代,AI 目前还无法自主完成这个闭环。
安全关键模块的设计必须人工完成。涉及功能安全的模块,比如锁步核、ECC 校验、看门狗等,代码的每一行都需要经过严格审查和形式验证,不能依赖 AI 生成。
5.3 现阶段完全不能碰的活
系统架构设计是 AI 完全无法胜任的。模块划分、接口定义、数据流设计、时钟域规划这些架构级决策,需要综合考虑性能、面积、功耗、可验证性、可复用性等多个维度,AI 目前只能生成局部代码,不具备全局架构设计能力。
物理设计相关决策也不能交给 AI。布局规划、电源网络设计、时钟树综合这些后端环节,需要结合工艺库、封装约束、散热条件等物理信息,AI 的训练数据中缺乏这类工程约束。
与模拟电路混合的信号链设计同样不适合 AI。数模混合设计需要考虑噪声、匹配、寄生参数等模拟特性,AI 生成的数字代码无法处理这些模拟域的问题。
5.4 一个实用的协作模式:AI 做初版,人工做精修
经过一段时间的摸索,我形成了一个比较高效的协作模式:让 AI 生成代码初版,然后人工进行精修和优化。具体流程是:
- 用结构化提示词让 AI 生成模块代码和 testbench。
- 跑仿真验证基本功能,修复明显的逻辑错误。
- 跑综合检查可综合性,修复 latch 和位宽问题。
- 人工审查跨时钟域、复位策略、状态机安全等关键点。
- 根据综合报告优化关键路径和面积。
- 补充边界条件测试和形式验证。
- 最终代码审查和文档完善。
这个流程下来,AI 能节省大约 30% 到 40% 的编码时间,但前提是工程师本身有足够的硬件设计经验,能识别 AI 生成代码中的问题。如果工程师本身经验不足,盲目信任 AI 生成的代码,风险反而更大。
6. 从 CVDP 基准看 AI 硬件代码生成的下一步
783 道题的实测结果,既展示了 AI 在硬件代码生成上的潜力,也暴露了明显的短板。从 CVDP 基准的设计思路和实测数据来看,AI 在硬件设计领域的发展方向已经比较清晰了。
6.1 当前最大的瓶颈:缺乏对硬件并行性和时序的深层理解
AI 生成 Verilog 代码时,最大的问题不是语法错误,而是对硬件并行执行模型的理解不够深入。软件代码是顺序执行的,AI 在训练中接触的大量代码都是这种顺序模型,而 Verilog 描述的是并行电路,信号赋值是同时发生的,这个思维模式的转换对 AI 来说是个挑战。
具体表现就是:AI 经常在组合逻辑中使用阻塞赋值,在时序逻辑中使用非阻塞赋值,但偶尔会搞混;AI 对 always 块的敏感列表理解不够精确,导致仿真和综合结果不一致;AI 对建立时间、保持时间、时钟偏斜这些时序概念的理解停留在理论层面,无法在代码中主动规避时序问题。
6.2 评测基准的演进方向:从功能正确到设计质量
CVDP 基准目前主要关注功能正确性和可综合性,但硬件设计的质量维度远不止这些。未来的评测基准可能会向以下几个方向演进:
- 时序收敛能力:不仅看代码能否综合,还看综合后能否满足目标频率。
- 面积效率:对比 AI 生成代码和参考实现的门级网表面积。
- 功耗表现:评估 AI 生成代码的综合后功耗。
- 可验证性:代码是否易于编写 testbench 和形式验证。
- 可复用性:代码的模块化程度和接口规范性。
这些维度的评测比单纯的功能正确性更接近真实工程需求,也更能区分不同 AI 模型的实际可用性。
6.3 对硬件工程师的启示:工具在变,基本功不变
AI 写 Verilog 的能力在快速进步,但硬件工程师的基本功依然不可替代。数字电路基础、时序分析、跨时钟域处理、低功耗设计这些核心知识,是判断 AI 生成代码质量的前提。如果工程师自己都不懂这些,就无法识别 AI 代码中的隐患。
我的建议是:把 AI 当成一个效率工具,而不是替代品。用它来加速样板代码的编写、testbench 的初版生成、文档的整理,但核心设计决策和关键模块的实现,依然要依靠工程师的专业判断。工具在变,但硬件设计的基本原理和工程思维不会变。
热词里"verilog学习网站"和"verilog语言入门教程"的搜索量一直很高,说明有很多新人正在进入这个领域。对于这些新人,我的建议是:先把基础打牢,理解数字电路的工作原理和 Verilog 的语法语义,然后再去用 AI 辅助开发。如果基础不牢,AI 生成的代码你看不懂也改不对,反而会养成依赖心理,不利于长期成长。
6.4 一个值得关注的趋势:AI 辅助验证
相比 AI 辅助设计,AI 辅助验证可能是更早落地的方向。验证工作的重复性更高,模式更固定,AI 在生成测试激励、覆盖率分析、断言编写等方面已经展现出不错的能力。而且验证环节的错误不会直接导致流片失败,风险相对可控。
我实测过用 AI 生成 SystemVerilog 断言和覆盖率组,效果比生成 RTL 代码好很多。AI 能根据设计规格自动生成覆盖主要功能点的断言,验证工程师在此基础上补充边界条件即可。这个方向值得持续关注。
7. 实测之后的一些个人体会
折腾完这一轮实测,我对 AI 写硬件代码这件事有了更务实的看法。它既不是某些自媒体吹嘘的"取代硬件工程师",也不是某些保守派认为的"完全不能用"。它就是一个工具,用得好能提效,用不好会埋雷。
我现在的日常工作是:新模块先用 AI 生成一版初稿,然后自己逐行审查、修改、优化。这个过程比从零手写快不少,尤其是样板代码和 testbench 部分。但关键模块和跨时钟域处理,我还是坚持自己写,因为这部分出问题的代价太大。
另外,AI 生成的代码一定要跑综合,一定要看综合日志。仿真通过只是第一步,综合通过才是及格线。我见过太多仿真跑得漂亮但综合报一堆警告的代码,这些警告如果不处理,流片回来就是灾难。
最后说一个细节:AI 生成的 Verilog 代码,变量命名往往比较随意,比如 data、temp、flag 这种。在小型模块里问题不大,但在大型项目中,这种命名会严重影响可读性。我的做法是生成之后统一做一次命名规范化,把信号名改成有明确含义的英文短语,这样后续维护会轻松很多。