ChatGPT 可以帮助软件工程师解决编码的烦恼,那是否可以帮助硬件工程师设计出芯片呢?来自澳大利亚悉尼南威尔士大学的教授进行了一次尝试。
声明:本文为 CSDN 翻译,未经允许禁止转载。
翻译 | 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 的第一个设计(移位寄存器)的示例:
ChatGPT-4
有用!
ChatGPT-3.5
有用!
Bard
报错了!
HuggingChat
moduleShiftRegister(inputclk,inputrst_n,inputdata_in,inputshft_en,outputreg[
7:
0]
q);
//clockcycleof
22ns
parameterCLK_CYCLE=
50;
parameterADDR=
32
'h0000641A;//defaultaddressfortheCY7B974EEPROM/flashcontrolunit
parameterDATAW=32'b111100001000000100000000000000
0;
//setdefaultvalueofallregistersfromdatasheetpageB-
21
parameterSP=
32
'h015F;
parameterPE=16'd1;
//always
forVddleveldetection.Setaccordingtosection
"VIOPowerSupplyVoltageMonitoring"indatasheetp.
13
parameterUDEN=
32
'hFFFE;//unuseddevicedisableregister
parameterVIDEN=32'hFCED;
//VIN/ANpinaccessdisabled
parameterADCDPF=
32
'hFF7A;//alternativedigitalpowersupplyvoltagemonitorconfig(ADP_SAR)
parameter_90FSYSCLKS="Disabled";//unused1byteregisteratoffset0x90fromFSMC_NORSRAMTimingControlRegister.Readaszeroifnotused
parameterTRASETNEGL=32'hFFFFFFFFFFFF;
assigndata_out=~data_in&shft_en&rst_n?
1
'b0:(q[7:1]<<1)|{1'b
0,data_in};
always@(*)begin
#/*x'FF*/CLK_RQSTDCLK*;
#/reset_nR0R0[(int*)&(_CTL--)]<=32'h8000_0000;
if(rst_n&&!shft_en)begin
$setuphold(posedgereset_n,negedgeactive);
$display(
"***RESET***\n");
`#addr`addr:
`addr[(int*)&POS]`
pos?(
int)(((
`addr`:addr[_ADDR]+$_INTRTVALU)/
2):
1
'b1;`addr:(addr<>`addr)`pos,"Fullscandone."));`cout!="Divisionbyzero!"&'@(!_LUT)&&(
`grandpa')?(sprintf(`snip
`,strlen(&_TI),($half*`cout>&
1)
'hash()):snprintf(!reserve2((constchar*)(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_tRF)(addr<=&)>//Multipleerrors\n');}}}}end
else
if(!active_high&&active)^beginhighend}begin
posbpoz,euEuropozizew;PosfileNewHdrPosWrf
`ezed=`PosMaxRow=?[issued&tested]
`specifbypa=end>
else
if(!endswith
"\\")
ormyword
`title==addr){droplocalvarhNextCutJob)~sym\_nameeof.~stop$;genwsyncestringsTryEnd[]sizewriter(1)}if!=size((`dynSym-NMcompilersUDOVARSYMBOL))*~(uint2baseNUMSERVER+
"compiled")){clip
0clrw$addelem}\n\resources}subbyteswrdfmtremovecommentsTr1ESrandiffgred$\elleoformatfloat
format----------------------
`charTmpLim}LenrolloverLenglenLenNonRollovrOptimizationCenter}\nresidentAsymptoticAspect}\npResetOpt\All%parID==PCI0SPCReconfigurationFeaturesupported}IFPROPRIETARYASPECT=`port!\Plug
它似乎已经疯了!
测试台
ChatGPT 已经初步地给出了设计,接下来,我们要求它创立一个 Verilog 测试台:
Canyou
createaVerilogtestbench
forthisdesign?Itshouldbe
self-checking
andmade
to
work
withiverilog
forsimulation
andvalidation.
If
testcasesshouldfail,thetestbenchshouldprovideenoughinformationthatthe
errorcanbe
found
andresolved.
总之最后 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.
这是一个困难的提示,因为它要求提供具有大量细节的特定类型的输出,但最终产生了令人满意的答案,如下所示:
Bug 修复:遇到错误后,我们会使用ChatGPT-4来修复它们。这里给出了一个例子。这是基于对话 15,并演示了如何解决移位寄存器原语中的错误。
开发的指令集架构(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 在硬件领域大放异彩!