ChatGPT 设计了一款芯片
ChatGPT 可以帮助软件工程师解决编码的烦恼,那是否可以帮助硬件工程师设计出芯片呢?来自澳大利亚悉尼南威尔士大学的教授进行了一次尝试。
原文:https://01001000.xyz/2023-12-21-ChatGPT-AI-Silicon/
声明:本文为 CSDN 翻译,未经允许禁止转载。
我在 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 的第一个设计(移位寄存器)的示例:
ChatGPT-4
有用!
ChatGPT-3.5
有用!
Bard
报错了!
HuggingChat
module ShiftRegister(input clk, input rst_n, input data_in, input shft_en, output reg [7:0] q);
// clock cycle of 22 ns
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 for Vdd 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
# /* x'FF */ 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 else if (!active_high && active)^begin €high end}begin€ pos bpoz,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`,} else if (!endswith "\\") or myword`title==addr){droplocalvar hNextCutJob) ~sym\_name eof .~stop$; genw syncestrings TryEnd [] sizewriter(1)} if !=size( (`dynSym-NM compilersUDOVARSYMBOL))*~(uint2base NUMSERVER+" compiled")){clip0 clrw $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 create a Verilog testbench for this design? It should be self-checking and made to work with iverilog for simulation and validation. If test cases should fail, the testbench should provide enough information that the error can be found and resolved.
详细对话过程见: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,我相信这与开源文献中可用的内容非常不同。
我从以下维度切入:
Let us make a brand new microprocessor design together. We're severely constrained on space and I/O. We have to fit in 1000 standard cells of an ASIC, so I think we will need to restrict ourselves to an accumulator based 8-bit architecture with no multi-byte instructions. Given this, how do you think we should begin?
微处理器设计首先需要定义指令集架构 (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.
这是一个困难的提示,因为它要求提供具有大量细节的特定类型的输出,但最终产生了令人满意的答案,如下所示:
开发的指令集架构(ISA)
下表列出了在对话 00 中与 ChatGPT-4 共同生成的 ISA(并在 10 中更新):
这是一种相对简单的基于累加器的设计,具有一些显着的特征:
考虑到大小限制,内存访问“带有可变数据操作数的指令”仅使用 5 位来指定内存地址,这意味着处理器将被限制为绝对最大 32 字节内存。
只有一条具有立即数据编码的指令。
这些指令使用完整的 256 种可能的字节编码。
JSR指令使得实现子例程调用成为可能,尽管有点笨拙(没有堆栈指针)。
分支指令有限制但很有用。向后跳过两条指令可以实现高效轮询(例如加载输入,屏蔽相关位,然后检查是否为 0)。向前跳过 3 条指令可以跳过 JMP 或 JSR 所需的指令。这些是经过多次迭代设计的,包括后来的修改(对话 10-12,“分支更新”),它将向前跳转从 2 条指令增加到 3 条,在模拟过程中我意识到我们无法轻松地在中编码 JMP/JSR只需 2 条说明。
LDAR 指令允许对内存加载进行类似指针的取消引用。这使我们能够有效地使用内存映射中的常量表(在对话 17 中添加)将二进制值转换为 7 段显示器的 LED 模式。
当尝试在其中编写程序时,感觉就像是用于 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 平台中更大的可用区域(仅使用一个可用空间的一部分)。
此时又遇到了一些问题:
尽管这是基于 OpenLane 的,就像 Tiny Tapeout 一样,但它是一个更加复杂的过程,并且没有一个简单易懂的 GitHub 操作指南来做参考。我必须在我的笔记本电脑上安装很多东西!
模拟需要比 Tiny Tapeout 更加稳健,并且考虑到你的设计需要与 Caravel 核心一起进行验证,因此需要更长的时间。即使是我最基本的仿真仍然需要超过 45 分钟,而 Tiny Tapeout 只需要约 10 秒。
这是一场竞赛,参赛作品的评判标准是它们的文档质量、可用性、对开源项目的贡献等。所以我还必须确保这方面的一切都很好!
我决定让 ChatGPT-4 对 QTCore-A1 进行以下更改。
首先,内存大小将升级为 256 字节共享指令/数据内存,分为 16 字节页面。
其次,我会添加一些外设——一个 16 位定时器、一些 I/O 端口,并且考虑到我的日常工作是硬件安全研究员,我还决定添加 2 个八位“内存执行保护”控制寄存器为 16 个页面中的每个页面提供“执行”位,并更新原始的、不受欢迎的分支逻辑。
新的指令集架构
和以前一样,所有内容都是开源提供的,但这次是在 QTcore-C1 GitHub 存储库(https://github.com/kiwih/qtcore-C1)的文件夹下 AI_generation_information/chats。每个聊天都扩展了原始 QTCore-A1 的对话。
当我提出设计变更时,ChatGPT 最终选择了这种 ISA。
具有可变数据操作数的指令
即时数据操作指令
控制/状态寄存器操作指令
固定控制和分支指令
变量操作数分支指令
数据操作指令
数据路径
实则里面有很多变化!观察现在有一个段寄存器,它与部分指令连接在一起,用于解码具有可变数据操作数的指令的地址。
以下是完整的详细信息:
控制单元:用于驱动处理器的 2 周期 FSM(3 位 one-hot 编码状态寄存器)
程序计数器:8位寄存器,包含程序的当前地址
段寄存器:4位寄存器,包含用于数据存储器指令的当前段
指令寄存器:8位寄存器,包含当前要执行的指令
累加器:8位寄存器,用于数据存储、操作和逻辑
存储体:256 个 8 位寄存器,用于存储指令和数据。
控制和状态寄存器:8 个 8 位寄存器,用于特殊功能,包括定时器、I/O、内存保护、发送中断以及接收和发送信号给更大的 Caravel 处理器。
控制/状态寄存器 (CSR) 及其地址
SEGEXE_L (000):8 位——表示指定为可执行文件的内存段的低半部分。寄存器中的每个位对应内存空间低半部分的一个段。如果某个位设置为 1,则相应的段被标记为可执行。
SEGEXE_H (001):8 位 - 表示指定为可执行文件的内存段的高半部分。寄存器中的每一位对应内存空间上半部分的一个段。如果某个位设置为 1,则相应的段被标记为可执行。
IO_IN (010):8 位 - UART(或任何通用 I/O 设备)操作的输入寄存器。这用于从外部设备读取数据。
IO_OUT (011):8 位 - UART(或任何通用 I/O 设备)操作的输出寄存器。这用于将数据写入外部设备。
CNT_L (100):8 位 - 16 位计数器寄存器的低 8 位。这可用于存储计数值的下半部分,可用于计时操作或编程中的循环等。
CNT_H (101):8 位 - 16 位计数器寄存器的高 8 位。这可用于存储计数值的上半部分,类似于 CNT_L 寄存器。
STATUS_CTRL (110):8 位 - 用于保存 CPU 中不同操作状态的控制寄存器。这些位是:{SIG_OUT[7:2], CNT_EN[1], IRQ_OUT[0]}。SIG_OUT 位用于向较大的 Caravel 处理器发送信号(6 位)。CNT_EN 位用于使能计数器。IRQ_OUT 位用于向较大的 Caravel 处理器发送中断。
SIG_IN (111):8 位 - 这里的 8 位可以来自更大的 Caravel 处理器。这可用于向 CPU 发送信号,例如作业开始、作业结束等。
使用汇编程序的示例编程
GPT-4 生成的汇编器简化了为 QTCore-C1 编写汇编程序的过程。
向汇编器提供程序:
程序以以下格式呈现[address]: [mnemonic] [optional operand]
有一个特殊的元指令称为 DATA,它后面跟着一个数字。如果使用的话,只需将该号码放在该地址即可。
程序不能超过内存的大小(在QTCore-C1中,这是256字节)。
存储器包含指令和数据。
示例程序:
在此程序中,观察我们如何通过 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 在硬件领域大放异彩!