博客

简化 FPGA 代码开发:ChatGPT 如何改变游戏规则

利用 AI 的强大功能和灵活性来打破 FPGA 编程的复杂世界,使用 Python 开始

众所周知,VHDL 等硬件描述语言 (HDL) 很难学习。 尽管它们很复杂,但这些强大的工具对于使用现场可编程门阵列 (FPGA) 执行自定义算法是必需的,例如使用 Liquid Instruments 的一体化 Moku 测试设备。 其他语言(如 Python)有大量易于访问的信息支持,使它们易于研究、学习和掌握。 现在,借助 ChatGPT 等先进语言学习模型,您可以使用 Python 等易于理解的知名编程语言输入脚本,并在行为层面(而不仅仅是语法层面)快速将其转换为 FPGA 代码,从而为加速测试目标。

借助这项新功能,您无需完全了解代码如何在 FPGA 上运行。 相反,您只需要了解一些基本的计算机编程即可创建必要的代码。 虽然使用人工智能 (AI) 加速 FPGA 代码开发很方便,但了解 ChatGPT 等工具可能犯的常见错误也很重要。 在此示例中,我们演示了如何转换平方根函数,并概述了使用 ChatGPT 从 Python 编写 FPGA 代码时最重要的注意事项。 但首先,让我们回顾一下编写 FPGA 代码的挑战:

  • 该编程范式与 C 和 Python 等更常见语言的过程执行有很大不同。
  • 这不是一项非常常见的技能,这意味着像 Stack Overflow 帖子和示例设计这样的资源也不是很常见。
  • 调试很困难。 构建在 FPGA 上运行的设计需要相对较长的时间,这限制了迭代。 当它在那里时,很难看到设备内部发生了什么。 另一方面,需要花费大量时间来设置高质量的模拟来揭示可能是非常简单的菜鸟错误。

分解 FPGA 编码

让FPGA编程更像计算机编程一直是制造商的长期目标。 高级综合 (HLS) 工具允许您用 C 或类似语言编写代码,并在 FPGA 上运行它,但它们从未达到手工制作的 HDL 的执行效率。 MathWorks HDL Coder™ 和 MyHDL 等工具允许您分别在 MATLAB 或 Python 中编写专门设计的代码,并再次将其转换为在 FPGA 上运行,但这些程序的特殊设计意味着您无论如何都需要了解 FPGA 编程范例- 同时使用更好的语法和测试环境。

随着 ChatGPT 等大型语言模型 (LLM) 的出现,您现在可以访问可以采用一种范式编写的程序(例如 Python 中的过程代码)的系统,了解您想要完成的任务,并用另一种范式重写代码范例(如 FPGA 的硬件描述语言)。 这从根本上是解决高级综合问题的一种不同方法,具有一些巨大的优点,也有一些有趣的缺点:

  • 您可以用您最喜欢的编程语言编写算法。
  • 您可以使用相同的语言来调试您的算法,并使用您所期望的所有功能,从简单的打印语句到完整的交互式调试器。
  • 即使第一次转换并不完美,您也可以将 ChatGPT 输出视为恰好为您完美制作的一段示例代码。 从中学习、理解它,您和 ChatGPT 可以帮助彼此更好地理解问题及其解决方案。

当然,有一个问题:有些 FPGA 概念不一定能用程序代码来表达。 因此,您如何期望 ChatGPT 生成正确的代码? 这就是 ChatGPT 对话界面发挥作用的地方。 只要告诉它要做什么! 您可以根据需要在提示中添加任意多的额外信息,经过 ChatGPT 的几次迭代后,它将成为您合作过的最有用的结对程序员。

示例:在 FPGA 上求平方根

我们以在 FPGA 上求平方根为例。 这是一个中等复杂的运算,通常使用浮点运算,这两种运算在 FPGA 上都不容易处理。 我们可以从提示 ChatGPT 开始,帮助我们思考一些解决问题的方法,如图 1 所示:

图 1:使用整数运算计算平方根的常见算法

然后,我们可以使用它来帮助我们用 Python 编写和测试其中一种算法,如图 2 所示。这是尝试专用 AI 编码工具(如 GitHub Copilot 或 AWS CodeWhisperer)的机会。

图 2:确定 16 位精度

在 Python 中调试代码,同时确保其保持正确的精度位数和预期的输出值。 然后,就可以进行转换了,如图 3 所示:

图3: 将Python函数转换为VHDL实体

检查你的工作

很多时候,FPGA 代码第一次就能正确运行。 然而,ChatGPT 在进行转换时可能会犯一些常见错误:

  • 不保持正确的精度位数,导致输出总是向下舍入为零、向上舍入到某个最大值,或者根本没有足够的细节。
  • 创建信号时未正确跟踪位宽度。 HDL 要求您手动精确指定每个变量的位宽,而 Python 不必关心这一点。 您可以通过在提示中显式添加有关输入和输出信号所需精度位数的信息来帮助缓解这种情况,但当它们不匹配时,您仍然可能会遇到综合错误。
  • 简单的转换错误,例如将左移转换为右移、添加导致算法失败的中间变量等等。

这一切都表明:当您和 ChatGPT 共同开发解决方案时,您会获得最佳结果,而不是期望它变得完美。

尽管如此,情况一直在变得更好。 我们以 Python for 循环为例。 这可以转换为 VHDL for 循环,但事实上,它们在语义上非常不同。 在Python中,每次迭代一个接一个地发生,而在VHDL中,每次迭代同时发生,但在不同的逻辑门组中。

目前免费版本的ChatGPT并没有理解其中的区别,直接将Python的for循环转换为VHDL的循环。

当前的 GPT4 模型正确推断了状态机,依次运行循环的每次迭代以及循环的每次调用。 例如,如果迭代平方根算法需要 16 次迭代才能完成,则在前一个输入完成之前它无法开始处理另一个输入,并且吞吐量为每 16 个时钟周期一个值。 

GPT4 模型能够发出完全流水线的实现,其中算法仍然具有 16 个时钟周期的延迟,但 16 项计算可以同时进行,每个时钟周期产生一个新结果。

随着 ChatGPT 功能的快速改进,用 Python 或其他常见编程语言编写 FPGA 代码变得更快、更有效,为更多用户使用用户可编程 FPGA 实现定制测试仪器、原型和其他算法打开了大门。 通过更容易地访问具有自定义可编程性的 FPGA,即使那些不是 HDL 专家的人也可以从 FPGA 实现的时间关键型处理和并行处理中受益。 使用类似的工具 Moku 云编译 通过 Liquid Instruments,您可以与软件定义的测试和测量仪器一起测试这些设计,例如 示波器/电压表, 频谱分析仪PID 控制器 在单个设备中创建定制的、完全集成的系统。

有关如何将 ChatGPT 与 Moku Cloud Compile 结合使用的更多示例, 观看我们的网络研讨会。 您还可以查看我们的详细博客,其中包含多个示例 相关信息 (自定义瞬态故障检测)和 相关信息 (绝对值)。

对您想要使用 Moku Cloud Compile 开发的自定义仪器有疑问吗? 联系我们: support@liquidinstruments.com 与工程师联系。