ChatGPT 可以帮助软件工程师解决编码的烦恼,那是否可以帮助硬件工程师设计出芯片呢?来自澳大利亚悉尼南威尔士大学的教授进行了一次尝试。
原文:https://01001000.xyz/2023-12-21-ChatGPT-AI-Silicon/
翻译 | ChatGPT 责编 | 苏宓
出品 | CSDN(ID:CSDNnews)
我在 2023 年初使用 ChatGPT 构建了一个微控制器芯片,并已流片。现在它甚至可以控制我的圣诞树了。在我看来,这是第一次有人使用 LLM 来设计芯片。
关于用 ChatGPT 设计芯片的论文地址:https://arxiv.org/abs/2305.13243
同时,所有和 ChatGPT 的聊天日志都保存在存储库(https://zenodo.org/records/7953725)和 QTcore-C1 GitHub (https://github.com/kiwih/qtcore-C1)上。
以下为完整故事:
萌生用 ChatGPT 设计芯片的想法
今年 3 月,科技新闻聚集地 HN 热榜上出现了一篇关于《Tiny Tapeout:在几分钟内从想法到芯片设计》的文章(https://news.ycombinator.com/item?id=35376645)。这篇文章中,有开发团队最新带来了一种方法,可以让用户将定制的微型硅设计以仅需 100 美元的价格转化为一个流片。
当时,我正在纽约大学从事博士后工作,其中之一是探索使用 LLM 来进行 Verilog(一种用于描述、设计电子系统的硬件描述语言)硬件设计。我们对使用 ChatGPT 等 LLM 来设计硬件的各种不同应用程序进行了基准测试,包括规范解释、设计以及错误检测和修复。
我们是这个领域的先行者之一,早在 2020 年就开始使用 GPT-2 和 Verilog。
因此当我看到那篇文章时,我迅速产生了兴趣。由于实际制造芯片的成本很高,我们一直使用 FPGA 和仿真进行工作。但是,仿真与现实之间总是存在差距,所以证明 LLM 和 AI 确实能够生产芯片,对研究领域来说无疑是一个福音。我们能否使用免费流片的 Tiny Tapeout 作为实现此目的的工具,并借助 LLM 来编写 Verilog 程序,还能真正设计出一款芯片?
我与我的导师及其他几位博士生在一起进行了交谈,并集思广益了一些想法。
在这个过程中,我们发现 Tiny Tapeout 非常小,只有 1000 个标准单元,这意味着设计会受到很大限制,但我们都非常喜欢这个想法,特别是因为之前似乎还没有人做到过,如果我们行动迅速,我们可能会能够做到世界第一!
所以,我们决定去做。但现在,问题也随之而来。首先鉴于设计空间如此之小,我们应该提交那些内容?根据我们之前的研究,我们虽然知道 LLM 可以编写像 Verilog 这样的硬件设计语言,但他们并不是太擅长。与 Python 等更流行的语言相比,LLM 生成 Verilog 代码时语法或逻辑错误的发生率要高得多。这实际上就是为什么我和我的团队已经为 Verilog 开发自己的 LLM 的原因,在此有些离题了。
言归正传,如果我们确实想使用 LLM 来制造芯片,我们需要解决以下几个问题:
(1)我们应该使用哪个 LLM?
(2)我们应该给它多少帮助?
(3)我们应该尝试什么提示策略?
设计方法
立足上面几个问题,我们首先确定了要用的 LLM:OpenAI 的 ChatGPT 3.5 和 4、Google 的 Bard 以及开源的 HuggingChat。
然后,我们设计了两种方法。第一种方法是尝试让 LLM 在一种反馈循环中完成所有事情,即 LLM 将获得一份规范,然后为该设计生成设计和测试。然后,人类将在模拟器 (iVerilog) 中运行测试和设计,然后将任何错误返回给 LLM。
相信很多人对于 LLM 时而犯蠢也早已习惯,它有时会陷入循环,认为自己正在解决问题或改进输出,而实际上它们只是在对相同的数据进行迭代。因此我们推测有时我们可能需要提供“人类援助”。
通过一些初步实验,我们确定了一个初始的流程:
理想情况下,人类不需要提供太多输入,但这还有待观察……
在硬件制造方面,我们的目标是 Tiny Tapeout 3,将基于 Skywater 130nm。不过,它也还有一些限制:前面提到的 1000 个标准单元,以及只有 8 位输入(包括任何时钟或复位)和 8 位输出。Tiny Tapeout 使用 OpenLane,这意味着我们也仅限于可综合的 Verilog-2001。
设计什么?
在这个实验的早期阶段,我们对与对话式 LLM 交互的标准化和(理想情况下)自动化流程的潜力感兴趣,该流程将从规范开始,最终产生该设计的硬件描述语言。鉴于我们只有 8 位输入,我们决定使用其中 3 位来控制设计选择多路复用器,以适应 8 个小型基准测试。如果这些进展顺利,我们就会致力于下一步,构建更具雄心的事情。
以下是我们提出的基准测试:
每个基准测试都有一个简短的规范来描述它及其 I/O,以及正确的预期行为。
纽约大学博士生 Jason Blocklove 与选择的四个 LLM(ChatGPT-3.5、ChatGPT-4、Bard 和 HuggingChat)共同进行了交互,引导 LLM 生成设计和测试平台,然后进行模拟,并反馈存在的所有错误。
有时,在与 LLM 对话中也需要考虑特殊情况,由于模型在单次响应中可以给出的输出量受到限制,文件或解释通常会被中断;在这些情况下,模型将跳出一个“请继续”(continue)按钮。按下之后,所输出的代码通常是从前一个消息的最后一行开始的,因此在将代码复制到文件中进行编译和模拟时,需要进行适当的编辑把两次生成的代码合并到一起。
然而,这个过程没有添加额外的硬件描述语言(HDL)。同样,有时响应中会包含让用户添加自己的代码的注释。如果这些注释会影响功能,例如留下不完整的数值数组,那么响应将被重新生成,否则将保持原样。
设计提示:
这里的设计提示看起来像这样:
返回的设计质量参差不齐,我们发现只有 ChatGPT-4 可以可靠地生成设计。以下是每个 LLM 的第一个设计(移位寄存器)的示例:
有用!
有用!
报错了!
module ShiftRegister(input clk, input rst_n, input data_in, input shft_en, output reg [7:0] q);
//clock cycle of 22ns
parameter CLK_CYCLE = 50;
parameter ADDR = 32'h0000641A; // default address for the CY7B974 EEPROM/flash control unit
parameter DATAW = 32'b1111000010000001000000000000000; //set default value of all registers from datasheet page B-21
parameter SP = 32'h015F;
parameter PE = 16'd1; //always forVdd level detection. Set according to section "VIO Power Supply Voltage Monitoring"in datasheet p.13
parameter UDEN = 32'hFFFE; // unused device disable register
parameter VIDEN = 32'hFCED; //VIN/AN pin access disabled
parameter ADCDPF = 32'hFF7A; // alternative digital power supply voltage monitor config (ADP_SAR)
parameter _90FSYSCLKS = "Disabled"; // unused 1 byte register at offset 0x90 from FSMC_NORSRAM Timing Control Register. Read as zero if not used
parameter TRASETNEGL = 32'hFFFFFFFFFFFF;
assign data_out = ~data_in & shft_en & rst_n ? 1'b0 : (q[7:1] << 1) | {1'b0, data_in};
always @(*) begin
# CLK_RQSTDCLK *;
# /reset_n R0 R0[(int*)&(_CTL--)] <= 32'h8000_0000;
if(rst_n && !shft_en) begin
$setuphold (posedge reset_n , negedge active ) ;
$display("*** RESET ***\n");
`#addr `addr:`addr[(int*) &POS]`pos?(int) ( ((`addr`:addr[_ADDR]+ $_INTRTVALU)/2):1'b1;`addr:(addr<>`addr)`pos ,"Full scan done."));`cout!="Division by zero!" & '@( !_LUT) && (`grandpa')?(sprintf(`snip`,strlen(&_TI),($half*`cout>&1)'hash ): snprintf(!reserve2((const char*)(type(*``cout)strlen`buf++->_GBIT])))) oe=tmp2 && tmp3 ? (__flash)((void*)realloc($(int*)(idx=(*(u*`ptr`)|(~(address><:sizeof(mtemp))))))) : (tmp1 || net$c) $(tie || leak$_parsefree`load($_VO))`store(:)*value#stdh::)(`scan`:uint8_t RF)(addr<=&)> //Multiple errors\n');} }}} end elseif(!active_high && active)^begin €high end}begin€ posbpoz,eu Europozize w; Pos file NewHdrPos Wrf `ezed=`Pos MaxRow=?[issued&tested]`specif bypa=end><changed *alpha sys varsub EOF varbb atEnd of call seq`,} elseif(!endswith "\\") ormyword`title==addr){droplocalvar hNextCutJob) ~sym\_name eof .~stop$; genw syncestrings TryEnd [] sizewriter(1)} if !=size( (`dynSym-NM compilersUDOVARSYMBOL))*~(uint2base NUMSERVER+" compiled")){clip0clrw $addelem}\n\resources} subbytes wrdfmt removecomments Tr1ESran diff gred$\elleoformatfloat format----------------------`charTmpLim} Len rollover Leng len Len Non Rollovr OptimizationCenter}\n resident AsymptoticAspect}\np ResetOpt \All %par ID == PCI0 SPC ReconfigurationFeature supported } IF PROPRIETARY ASPECT=`port!\Plug
它似乎已经疯了!
测试台
ChatGPT 已经初步地给出了设计,接下来,我们要求它创立一个 Verilog 测试台:
Can you createa Verilog testbench forthis design? It should be self-checking andmade toworkwithiverilog forsimulation andvalidation. Iftestcases should fail, the testbench should provide enough information that the errorcan be foundandresolved.
详细对话过程见:https://01001000.xyz/2023-12-21-ChatGPT-AI-Silicon/
总之最后 ChatGPT 确实给出了一个测试台代码,而且没有错误!
基本结果
总体而言,只有 ChatGPT-3.5 和 4 可以可靠地生成设计,因此我们最终只分析了这两个模型,并将 Bard 和 HuggingChat 从我们的结果中剔除。使用两个 OpenAI 模型,我们完成了全套基准测试 3 次,得到了以下结果:
命名法:
如果没有报告错误,则设计通过,无需反馈 (NFN)。相反,如果这些操作中的任何一个报告错误,它们就会反馈到模型中,并要求“请提供修复。”,称为工具反馈 (TF)。
如果相同的错误或类型的错误出现三次,则用户会给出简单的人工反馈(SHF),通常是通过说明 Verilog 中的哪种类型的问题会导致此错误(例如声明信号时的语法错误)。
如果错误继续存在,则提供中等人类反馈 (MHF),并向工具提供稍微更有针对性的信息以识别特定错误,如果错误仍然存在,则提供高级人类反馈 (AHF),该反馈依赖于准确指出位置错误是什么以及修复它的方法。
一旦设计经过编译和仿真且没有失败的测试用例,就被认为是成功的。然而,如果高级反馈无法修复错误,或者用户需要编写任何 Verilog 来解决错误,则测试将被视为失败。如果对话超过 25 条消息(符合 OpenAI 每 3 小时 ChatGPT-4 消息的速率限制),则测试也被视为失败。
所有聊天日志详见:https://zenodo.org/records/7953725
ChatGPT 4 表现良好。大多数基准测试都通过了,其中大多数只需要工具反馈。ChatGPT 4 在测试平台设计中最需要的人工反馈。
几种故障模式是一致的,一个常见的错误是在设计或测试平台中添加了 SystemVerilog 特定的语法。例如,它经常尝试 typedef 为 FSM 模型创建状态,或实例化向量数组,而这两种情况在 Verilog-2001 中均不受支持。
总的来说,ChatGPT-4 生成的测试平台并不是特别全面。尽管如此,大多数通过了相应的测试台的设计也被认为是符合要求的。两个不符合要求的“通过”是骰子掷出器,它们没有产生伪随机的输出。测试集 T1 中的骰子掷出器在一次掷骰后只输出 2,而在随后的所有掷骰中只输出 1,而不管选择的骰子是什么。
同时,测试集 T3 中的骰子掷出器会改变值,但只在一小组值之间变化(取决于所选的骰子),这组值迅速重复出现。为了闭合设计循环,我们从 ChatGPT-4 的对话中合成了测试集 T1,为 Tiny Tapeout 3 添加了一个包装模块,该模块由 ChatGPT 4 设计但未经过测试。总体而言,设计使用了 85 个组合逻辑单元、4 个二极管、44 个触发器、39 个缓冲器和 300 个触点。
与 ChatGPT 4 相比,ChatGPT 3.5 的表现要差得多,大多数对话都导致了基准测试的失败,并且通过了自己的测试台的大多数对话也不符合要求。与ChatGPT 4 相比,ChatGPT 3.5 的失败模式不太一致,在每次对话和基准测试之间引入了各种各样的问题。相比 ChatGPT 4,它更经常需要对设计和测试台进行修正。
观察结果
只有 ChatGPT 4 能够充分满足编写 Verilog 的目的,尽管它仍然需要人类反馈才能使大多数对话成功并符合给定的规范。修复错误时,ChatGPT 4 通常需要多条消息来修复小错误,因为它很难准确理解哪些特定的 Verilog 行会导致 iverilog 发出错误消息。它所添加的错误也往往会在对话之间经常重复出现。
ChatGPT 4 在创建功能测试平台方面也比功能设计付出了更多努力。大多数基准测试几乎不需要对设计本身进行修改,而是需要修复测试平台。对于 FSM 来说尤其如此,因为该模型似乎无法创建一个测试平台来正确检查输出,而无需有关状态转换和相应预期输出的重要反馈。另一方面,ChatGPT 3.5 在测试平台和功能设计方面都遇到了困难。
更复杂的东西:QTcore-A1
在对 ChatGPT 4 进行基准测试并帮助博士生之后,我准备迎接更大的挑战。我开始让 ChatGPT 为一个微控制器创建组件,我想知道非结构化对话是否能够提高模型的性能水平,以此实现更快地编写设计。
值得一提的是,我是一位经验丰富的工程师,擅长设计小型的实验性/学术上的处理器,曾在奥克兰大学、纽约大学以及现在我所在的澳大利亚悉尼南威尔士大学教授学生。
我希望 ChatGPT 4 能够在这里构建这个设计。考虑到我们的空间有限,我决定采用基于 8 位累加器的架构。使用冯·诺依曼设计(共享程序和数据内存)可以节省额外的空间,然后将共享内存限制为仅 32 字节,这是我认为适合的大小。
我决定用 ChatGPT-4 编写每一行具有功能性的 Verilog 代码,但考虑到我们在验证和测试平台方面遇到的困难,我会负责制作这些内容并运行和解释仿真等过程。
为什么要进行这种设计而不是基于 RISC-V 之类的设计?现实中,开源处理器的 ISA(指令集架构)如 RISC-V 和 MIPS 有很多实现。问题是,这意味着 GPT-4 在训练期间已经看到了这些设计。
对于这项工作,我不仅仅像探索 ChatGPT 4 在输出它在训练中学到的数据方面的能力,我更想看到它在制作更新颖的东西时的表现。
因此,我引导模型创造一个全新的设计,使用了 ChatGPT 4 本身提供的一种奇特的 ISA,我相信这与开源文献中可用的内容非常不同。
我从以下维度切入:
微处理器设计首先需要定义指令集架构 (ISA),然后实现 ISA 所需的组件,最后将这些组件与与控制单元组合起来进行管理。通过仿真和测试来发现错误并进行修复。
构建对话
对话线程:鉴于 ChatGPT 4 与其他 LLM 一样具有固定大小的上下文窗口,我们假设提示模型的最佳方法是将较大的设计分解为子任务,每个子任务都有自己的“对话线程”界面。这使总长度保持在 16,000 个字符以下。当长度超过此值时,专有的后端方法会执行某种文本缩减,但其实现的细节很少。
由于 ChatGPT 4 在不同的线程中无法共享信息,人类工程师会将相关信息从前一个线程复制到新的第一条消息中,从而形成一个“基础规范”,慢慢地定义处理器。基础规范最终包括 ISA、寄存器列表(累加器 ACC、程序计数器 PC、指令寄存器 IR)、存储器、算术逻辑单元(ALU)和控制单元的定义,以及处理器在每个周期中应执行的高级概述。该规范中的大部分信息由 ChatGPT 4 生成,并由人工复制/粘贴和轻微编辑。
主题:每个线程一个主题对于处理器的早期设计阶段效果很好(有一个例外,其中 ALU 是在与多周期处理器时钟周期时序计划相同的线程中设计的)。然而,一旦处理器进入仿真阶段并在其上运行程序,我们就发现了规范和实现中的错误和缺陷。
设计工程师选择在适当的情况下继续以前的对话线索,而不是开始新的对话线索和重建上下文。下面的流程图中展示了这一点,其中的“Cont. T. ID”列指示是否“Continued”了以前的线索(如果是,则指示是哪个线索)。
重新开始:有时 ChatGPT-4 会输出次优的回答。如果是这样,工程师有两个选择:(1) 继续对话并引导它修正回答,或者 (2) 使用界面强制 ChatGPT 4“重新开始”回答,即假装前面的回答从未发生过,重新生成结果。在这两种选择之间需要进行权衡,并需要专业判断:继续对话可以让用户指定前面回答的哪些部分是好的或不好的,但重新生成将使整个对话更短更简洁(考虑到有限的上下文窗口大小,这是有价值的)。
然而,从结果表中的“# Restart”列可以看出,随着我在使用 ChatGPT 4 方面的经验增加,重新开始的次数往往会减少。话题 00-07 有 57 次重新开始,而话题 08-18 仅有 8 次重新开始。在单个消息中重新开始的最高次数是 10 次,出现在话题 04(控制信号规划)中,该话题有以下消息:
This looks excellent. According to this list, please produce the module definition for a control unit in Verilog which could operate the processor datapath. Please comment the purpose of each I/O. If a signal is for controlling a multiplexer, please also comment what each possible value should correspond to in the datapath.
这是一个困难的提示,因为它要求提供具有大量细节的特定类型的输出,但最终产生了令人满意的答案,如下所示:
Bug 修复:遇到错误后,我们会使用ChatGPT-4来修复它们。这里给出了一个例子。这是基于对话 15,并演示了如何解决移位寄存器原语中的错误。开发的指令集架构(ISA)
下表列出了在对话 00 中与 ChatGPT-4 共同生成的 ISA(并在 10 中更新):
这是一种相对简单的基于累加器的设计,具有一些显着的特征:
当尝试在其中编写程序时,感觉就像是用于 PIC 微控制器系列的程序的变体。ChatGPT-4 实际上也为我编写了汇编程序,我可以做得更好(它确实用起来很糟糕,但它确实有效 - 请参阅对话 09)。
我将该处理器的实现称为 QTCore-A1。
这是最终产生的数据路径(控制信号用虚线表示 - 使用摩尔型多周期 FSM 来控制它们)。在设计处理器时,我确保每个寄存器也通过扫描链连接(也是由 ChatGPT-4 设计的!)。这意味着我可以在实现后对设计进行编程,这也是我在模拟期间加载测试程序的方式。
我尝试使用 OpenLane 进行合成,但糟糕的是——该设计不适合 1000 个标准单元!最简单的事情就是不断调整内存,我一遍又一遍地这样做,直到我最终达到了神奇的数字,并设法获得了仅 17 字节的数据和指令内存组合。哎呀!
经过 OpenLane 综合后,GDS 如下所示:
我编写了一些测试程序,很快意识到我需要一些重复出现的常量值。玩了之后我还发现,内存映射中的常量值并没有寄存器占用那么多空间!因此,我设法将一些常量辅助值(包括“1”和“0”)放入内存映射中。
这意味着我可以用该死的汇编语言为我下载到 FPGA (CMod-A7) 的处理器编写这个小程序 - 尽管我还必须实现一个编程器,我使用的是 STM32!(不要介意这个视频是在椅子上拍摄的,我实际上是在参加演讲时在会议剧院中制作的 - Tiny Tapeout 的截止日期很快就到了)。
它工作了!
所以,我很高兴,它在模拟和 FPGA 上都能工作,所以我很高兴地将它发送到 Tiny Tapeout,然后我们将我们的论文发布到 arXiv 并将我们的设计作为开源 。
参加 Efabless 竞赛和 QTcore-C1
我们收到了很多关于提交的反馈。Tiny Tapeout 的 Matt Venn 实际上在他的网络研讨会上采访了我和 Jason 两个人。
该项目于 2023 年 6 月 2 日上线,受到了很多关注!EDA 领域的许多不同公司也与我们联系,其中包括一些您肯定听说过的公司。
不过,最有趣的事情之一是我最终与 Efabless(一个面向“智能”产品的开放式创新、硬件创建平台)的工作人员通了电话,他们告诉我,他们一直在计划一项人工智能生成的开源芯片设计挑战赛,而且考虑到我们刚刚完成了这样的壮举,也许我们应该考虑参加比赛。
唯一的问题是,他们是在短时间内举办比赛的,而我们只有几周的时间来准备——在这几周里,我实际上在海外参加了一系列会议!
最终,我还是决定参加,并做出一些妥协。他们的比赛基于 Efabless Caravel ChipIgnite 平台,该平台将 RISC-V 核心与用户项目区域配对,这样你就可以设计一个带有 Wishbone 连接的硬件模块,并将其放置在核心旁边。这张图片取自 Efabless 网站,最能说明这一点:
空间还有很多,但时间很短。我将遵循我之前提出的方法,从 QTcore-A1 开始,修改微控制器,以便它能够占用 Efabless Caravel 平台中更大的可用区域(仅使用一个可用空间的一部分)。
此时又遇到了一些问题:
我决定让 ChatGPT-4 对 QTCore-A1 进行以下更改。
和以前一样,所有内容都是开源提供的,但这次是在 QTcore-C1 GitHub 存储库(https://github.com/kiwih/qtcore-C1)的文件夹下 AI_generation_information/chats。每个聊天都扩展了原始 QTCore-A1 的对话。
当我提出设计变更时,ChatGPT 最终选择了这种 ISA。
具有可变数据操作数的指令
即时数据操作指令
控制/状态寄存器操作指令
固定控制和分支指令
变量操作数分支指令
数据操作指令
数据路径
实则里面有很多变化!观察现在有一个段寄存器,它与部分指令连接在一起,用于解码具有可变数据操作数的指令的地址。
以下是完整的详细信息:
GPT-4 生成的汇编器简化了为 QTCore-C1 编写汇编程序的过程。
向汇编器提供程序:
在此程序中,观察我们如何通过 SETSEG 读写 I/O、定时器和数据存储器。我们还通过 CSW 将内存段设置为可执行,然后跳转到不可执行的段以使处理器崩溃。
对此感兴趣的小伙伴可以在 QTcore-C1 GitHub 上查看所有有趣的细节:https://github.com/kiwih/qtcore-C1。
接收芯片吧!
我们参加了比赛(最终在截止日期前 2 小时完成了提交),然后 QTcore-C1 获胜了!这意味着芯片将被流片出来。
就在两周前,我收到了一个包裹……
它已经到了!(准确地说,我在这些小载板上收到了十个芯片,还有五十个芯片需要我自己焊接!)
基本测试和圣诞节 LED 显示屏!
很难描述在我面前有一块我参与设计的芯片是多么令人惊奇,特别是因为我以前从未真正设计过任何流片。如果没有像 ChatGPT 这样的 LLM 来激励我去尝试,我也许也不会这么做。
我又做了一些实验,发现芯片可能存在一些问题,包括在运行 HALT 命令后无法重新启动的问题。
最终,我创建了一个简单的计数器程序,其中包含了与 Caravel 处理器握手,类似于之前的 LED 闪烁程序,然后节日的圣诞树盛宴便开始了:
下一步是什么?
自 2020 年以来,我一直在研究 LLM 在硬件领域的应用,我坚信它可以简化、加速硬件开发,特别是与OpenLane 和 Caravel 等科技公司提供的开源设计流程结合使用时。
我也不认为我是唯一持有这种观点的人。近几个月来,芯片公司 Rapid Silicon 宣布了 RapidGPT、英伟达推出了 ChipNeMo、Cadence 宣布了 JedAI,Synopsys.AI 也已推出。所有这些都是现实世界的商业企业,旨在将 LLM 带入硬件领域。
期待未来 LLM 在硬件领域大放异彩!
▶ 隐退三年,身价4800亿元的Google创始人出面,亲自给Gemini写代码,还经常加班到凌晨一点!
▶ 近100页重磅详解!《开源态势洞察》全新改版,首期正式发布,赶紧收藏!
▶一个按时间戳排序导致的 Bug