欢迎来到半导体与芯片的世界 - 数字电路
轮毂电机光电增量编码器的ABZ信号详解
轮毂电机ABZ信号详解。 轮毂电机的定位使用了霍尔信号和光电增量编码器，1024线的。也就意味着，轮子转一圈，A信号和B信号各有1024个高电平和低电平。实际应用中，我们将A/B信号的上升沿和下降沿分别设置为外部中断触发信号，这样，我们就进行了1024的四倍频，最后的结果就4096。 如下如所示：第一行是顺转，可以看到A比B快1/4个周期；第二行是倒转，A比B慢1/4个周期。 轮子机械角度上转一圈，A和B各有1024个周期，通过4倍频，就能实现轮子转一圈编码为4096了。 如何通过A和B判断转向呢: 第一行: A下降沿中断且B为高，或者A为上升沿中断且B为低 ，是顺转。 第二行: A下降沿中断且B为低，或者A为上升沿中断且B为高 ，是倒转。 Z信号相当于是每转一圈给一个脉冲。
https://zhuanlan.zhihu.com/p/393106129RISC-V￼作为一种全新的开源CPU指令集体系结构（ISA），目前无论是在高校与各研究机构，还是商业应用中，皆方兴未衰，大有与X86￼和ARM￼形成成三足鼎立之势。但对于RISC-V CPU本身的安全, 却资料少而凌乱，晦涩难懂，面目狰狞，拒人于千里之外。故有此冲动，写几篇有关RISC-V CPU侧信道攻击￼的文章，介绍RISC-V CPU侧信道攻击的原理和作者本人的实践；作者研究CPU侧信道攻击的初衷也是为“防守”，意在为某款RISC-V CPU提供一个安全性验证平台，验证该CPU安全设计加固方案之有效性。我将用一系列文章来来介绍：什么是CPU侧信道攻击？导致CPU产生侧信道攻击风险的微架构设计技术Spectre￼攻击的种类与攻击方法细节；Meltdown攻击原理与工具过程；降低CPU侧信道攻击风险的手段那就让我们开始吧。侧信道攻击概述1.1什么是侧信道攻击1.1.1 日常生活中的侧信道攻击在科技日新月异的今天，在享受高科技带来的幸福感的同时，我们的隐私也会在不知不觉中从各种渠道被泄露出去，有些甚至你完全想不到，可以说防不胜防，比如说，你想过单从按键声音就分析出你的手机号码么？大家可能听说过网友“清华南都”就根据一段视频中的按键音，还原出了360总裁周鸿祎的手机号。事情起源于优酷的记者电话采访周鸿祎先生的一段视频. 在视频的第33-43秒，记者与周鸿祎先生进行了电话连线，视频播放把整个拨号过程也原封不动地播放了出来，包括在电话拨号阶段的产生的电话拨号音，“清华南都”就根据这段拨号音结合一些DTMF￼（双音多频, Dual-tone multi-frequency）的技术基础，破解这个电话号码；在这个事情中，如果把周鸿祎先生的电话号码当做一个高度机密信息(private data)的话，“清华南都”本人并没有看到过周先生的电话号码，也没有采用暴力破解的方式一个个电话号码去尝试，而“清华南都”通过分析声音特征信息获取了该机密信息，这个过程从技术范畴的角度讲就是一种利用了声波信息的“侧信道攻击”。那到底什么是侧信道攻击？维基百科是这么定义的：“在密码学中，侧信道攻击（Side-channel attack）是一种攻击方式，它基于从密码系统的物理实现中获取的信息，而非暴力破解法或是算法中的理论性缺陷，例如利用时间信息、功率消耗、电磁泄露或甚是声音可以提供额外的信息，来对系统的破解。”这个定义对于非密码学行业从业人员来讲还是非常抽象的。我们简单一点理解就是利用一些“旁门左道”的手法来获取我们需要的机密信息；比如我们经常在电视剧中看到的一个场景：一个窃贼将听诊器压在保险柜的前面板上，通过内部的机械声来打开保险柜。小偷会慢慢地转动转盘，听着内部机械结构所泄露出的咔哒声或阻力声，来分析保险箱齿轮的内部运作，并从而得知其密码的组合。除了拨号盘上的数字和保险柜“是”或“否”的打开状态以外，这个保险柜并不会给用户任何反馈。但保险箱的物理机械所产生的那些微小的触动和声音线索，这也是一个典型的侧信道攻击。某网站（https://www.wired.com/story/lamphone-light-bulb-vibration-spying/...）曾经公布了一项新技术（lamphone）：“通过使用望远镜观察室内悬挂的灯泡的振动（通过灯泡所发出的光的微弱变化），可以实时窃听房间内的对话”。这种技术将测信道攻击变得更加具有广泛性。￼1.1.2 计算机领域的侧信道攻击计算机领域的侧信道攻击是利用计算机不经意间释放出的信息信号（如电磁辐射，电脑硬件运行产生的声音）来进行破译的攻击模式：例如，黑客可以通过计算机显示屏或硬盘驱动器所产生的电磁辐射，来读取你所显示的画面和磁盘内的文件信息；或是，通过计算机组件在执行某些程序时需要消耗不同的电量，来监控你的电脑；亦或是，仅通过键盘的敲击声就能知道你的账号和密码。最早的计算机侧信道攻击之一，是美国国家安全局(National Security Agency)所称的TEMPEST￼。1943年贝尔实验室发现，每当有人在电传打字机上打字时，电传打字机会导致附近示波器的读数移动。贝尔实验室的研究人员很快意识到这一问题。电传打字机的目的是为了实现安全、加密的通信，但任何接近它的人，只要能读到它的电磁辐射，就有可能破译它的秘密。这种现象直到1985年才被完全公开记录下来，当时一位名叫维姆·范·埃克（Wim van Eck）的计算机研究人员发表了一篇论文，这就是后来被称为 "屏幕辐射窃密（van Eck phreaking）"，即通过远距离检测电脑屏幕放电的电信号，在电脑屏幕上重建图像。计算机领域的侧信道攻击，目前使用最为广泛的攻击手段就是基于时序的攻击（timing attack）。讲了那么多故事，让我们来看一段代码直观地了解一下什么是时序攻击：这是某产品中的一个秘钥比对函数，假设这个函数的用户无法看到源码（也不进行反汇编），我们只是通过库函数的头文件知道这个函数接口定义为int does_password_match(char * input_password)。那我们怎么能够快速地获取函数内部设定的机密信息strPrivateKey的值呢？你可能首先想到的是采用暴力破解方式，逐一尝试各种字符组合，直到函数返回true为止；如果这个秘钥只使用字母和数字，并且秘钥的最大长度7，那你需要尝试的最大次数为62**7=3,521,614,606,208【注26大写字母+26小写字母+10数字）。如果我们利用一下这个函数的timing信息，测量一下这个函数的处理时间，我们其实可以有一种更为快捷的方法，我们可以采用逐位破解的方法快速地完成这个任务；因为我们输入的密码与机密信息的匹配度越高，该函数的处理时间越长，这样我们通过测量这个函数的处理时间就可以判断前面的第一位，第二位，第三位等是否验证通过；则最坏的尝试的次数为62*7=434；用这种方式实现的一个产品（比如密码门禁系统），通过采用timing-attack的方法，其破解是完全可以通过人力的方式在数分钟内完成的；￼1.1.3 CPU的侧信道攻击目前随着超标量CPU技术的飞速发展，其处理性能大幅提升的同时, 以计算机为中心的侧信道攻击也变得更加复杂和手段多样。所谓道高一尺，魔高一丈； 2018伊始，两个芯片级漏洞Meltdown（熔断）、Spectre（幽灵）漏洞震惊了安全界。受影响的CPU包括Intel、AMD和ARM，基本囊括的消费级CPU市场的绝大部分。Meltdown漏洞可以在用户态越权读取内核态的内存数据，Spectre漏洞可以通过浏览器的Javascript，读取用户态的内存数据。这两个漏洞摧毁了公有云的基石（用户数据隔离），因为通过Meltdown和Spectre的攻击，用户在虚拟机里就可以无限制的读取宿主机或者其他虚拟机的数据。Spectre、Meltdown等攻击方式利用了微处理器的 "微架构"设计中的这些特性（站在安全的角度也可以叫漏洞，包括但不局限于分支预测，推断执行，乱序执行，等）。随着计算机变得越来越复杂，如果计算行业继续优先考虑性能而不是安全，侧信道攻击将会越来越猖獗，今天一个你看似巧妙的设计，非常有可能成为明天攻击的一个突破口。1.2 侧信道攻击的分类对于CPU侧信道攻击，很多公司（比如google和微软）成立了专门的安全团队，用来发现目前市场上主流CPU的安全风险并提供安全解决方案以降低危害（mitigation of the risk）。 随着对上述meltdown和Spectre攻击方式的研究深入，越来越多的基于meltdown和spectre的变种被开发了出来。参考文献[A Systematic Evaluation of Transient Execution Attacks and Defenses]对瞬态执行攻击进行了系统的分析，并把当前已经发现的针对CPU微架构的侧信道攻击方法进行了总结与归类（见图），文献的作者认为当前大部分的安全防护方法无法有效应对当前如此多的攻击方式带来的安全风险。本系列文章主要描述如下几种Spectre变种攻击方式:• Variant 1 (Spectre_PHT): bounds check bypass• Variant 2 (Spectre_BTB): branch target injection• Variant 4 (Spectre_STL): Store bypass• Variant 5 (Spectre_RSB): Return Stack Buffer【注：PHT: Pattern History Table, BTB:Branch Target Buffer, STL:Store To Load, RSB:Return Stack Buffer】Meltdown属于 Variant 3, Meltdown还可以进一步细分为:• Meltdown-US(Supervisor-only Bypass)• Meltdown-P(Virtual Translation Bypass)• Meltdown-GP(System Register Bypass)• Meltdown-NM(FPU Register Bypass)• Meltdown-RW(Readonly Bypass)• Meltdown-PK(Protection Key Bypass)• Meltdown-BR(Bounds Check Bypass)我们重点关注高性能CPU的一些通用设计带来的风险，而对于某些厂家独特设计带来的问题，本文不做过多的描述。
近日，加州大学洛杉矶分校引入了一种新的硬件描述语言PyGears，以实现基于可重用组件和高级 Python 构造的敏捷芯片设计理念。PyGears 是对快速发展的软件世界的回应，这要求硬件设计与可扩展和智能未来的需求保持同步。据官网介绍PyGears 是一种免费的开源硬件描述语言 (HDL)，该门语言可作为 Python 库实现，专注于函数式编程、模块组合和同步。按照他们的说法，PyGears 的出现旨在将芯片设计的复杂性转变为简单、灵活且具有成本效益的开发过程，该过程遵循可扩展和智能的方式来构建未来。该框架允许您使用 Python 结构设计硬件并将其编译为可综合的 SystemVerilog 或 Verilog 代码。内置模拟器允许您使用任意 Python 代码及其大量库来验证您的硬件模块。PyGears 使连接模块 得容易 ，并具有内置的同步机制，可帮助您构建正确的并行系统。PYGEAR 的创造者Bogdan Vukobratovic表示：“PyGears 的诞生是为了捕捉我在职业生涯中发现的所有有用的良好实践，该工具可以显着加快复杂架构的硬件实现，尤其是当它们与 AI 范式相关时。这应该是创建下一代芯片设计的一个良好开端，但这个目标需要我们所有人为硬件开发做出贡献并确定其方向。否则，未来的人工智能世界将不可持续。”据报道，通过在 VLSI 信号处理课程中采用它， 加州大学洛杉矶分校 Samueli 工程学院 开始建立一个通过软件范式观察硬件的社区，目标是通过使用更灵活和可组合的模块来加速硬件设计和验证。“芯片设计变得越来越复杂，成本越来越高，开发周期越来越长，”加州大学洛杉矶分校电气和计算机工程教授 Dejan Markovic博士说。“PyGears 通过采用由志同道合的贡献者社区构建的可重用组件的模块化硬件构建来解决这些挑战。这对于小型和大型工程团队都非常有效。硬件设计和验证基于Python环境，减少了软硬件领域的壁垒。我们的愿景是让软件人员能够编写硬件代码。”“软件的最大限制是硬件发展速度相对较慢，” Lux Capital 的合伙人Shahin Farshchi说。“PyGears 站在巨人的肩膀上，将硬件设计加速到接近‘编码’的速度，这将带来神奇的新用例，为定义市场的产品和公司提供支持。”PyGears的创建者兼 Anari AI 研发负责人Bogdan Vukobratovic博士表示，当前的工具行业倾向于对硬件开发中的所有组件进行低级优化和低级控制。另一方面，PyGears 提供对所有方面直至最低层的控制，使流程效率提高数倍。他还强调，构建复杂的架构需要具有更高开发敏捷性的系统。根据斯坦福大学教授 Boris Murmann博士的说法。，“新硬件设计工具的开发可以极大地受益于开源解决方案。为了让硬件行业摆脱石器时代并使其更加敏捷，我们需要社区塑造的新概念。”除了 UCLA 学生和其他大学，PyGears 团队已经 向硬件团队和有兴趣改进 HDL 的个人开放社区，使硬件设计更加高效和以结果为导向。附部分说明截图
一个简单的8位处理器完整设计过程及verilog代码
来源： EETOP BBS 作者：weiboshe一个简单的8位处理器完整设计过程及verilog代码,适合入门学习参考，并含有作者个人写的指令执行过程（点击下方 阅读原文 到论坛可下载源码）CPU定义我们按照应用的需求来定义计算机，本文介绍一个非常简单的CPU的设计，它仅仅用来教学使用的。我们规定它可以存取的存储器为64byte，其中1byte=8bits。所以这个CPU就有6位的地址线A[5：0]，和8位的数据线D[7：0]。我们仅定义一个通用寄存器AC（8bits寄存器），它仅仅执行4条指令如下：除了寄存器AC外，我们还需要以下几个寄存器：地址寄存器 A[5：0]， 保存6位地址。程序计数器 PC[5：0]，保存下一条指令的地址。数据寄存器 D[7：0]，接受指令和存储器来的数据。指令寄存器 IR[1：0]，存储指令操作码。2. 取指设计 在处理器执行指令之前，必须从存储器取出指令。其中取指执行以下操作：1〉 通过地址端口A[5：0]从地址到存储器2〉 等待存储器准备好数据后，读入数据。由于地址端口数据A[5：0]是从地址寄存器中读出的，所以取指第一个执行的状态是Fetch1： AR<—PC接下来cpu发出read信号，并把数据从存储器M中读入数据寄存器DR中。同时pc加一。Fetch2： DR<—M，PC<—PC+1接下来把DR[7：6]送IR，把DR[5：0]送ARFetch3： IR<—DR[7：6]，AR<—DR[5：0] 3. 指令译码Cpu在取指后进行译码一边知道执行什么指令，对于本文中的CPU来说只有4条指令也就是只有4个执行例程，状态图如下：4. 指令执行对译码中调用的4个例程我们分别讨论：4.1 ADD指令ADD指令需要CPU做以下两件事情：1〉 从存储器取一个操作数2〉 把这个操作数加到AC上，并把结果存到AC所以需要以下操作：ADD1： DR<—MADD2： AC<—AC+DR4.2 AND指令AND指令执行过程和ADD相似，需要以下操作：AND1： DR<—MAND2： AC<—AC^DR4.3 JMP指令 JMP指令把CPU要跳转的指令地址送PC，执行以下操作JMP1： PC<—DR[5：0]4.4INC指令INC指令执行AC+1操作INC1： AC<—AC+1总的状态图如下：5 建立数据路径 这一步我们来实现状态图和相应的寄存器传输。首先看下面的状态及对应的寄存器传输： Fetch1： AR<—PCFetch2： DR<—M，PC<—PC+1Fetch3： IR<—DR[7：6]，AR<—DR[5：0]ADD1： DR<—MADD2： AC<—AC+DRAND1： DR<—MAND2： AC<—AC^DRJMP1： PC<—DR[5：0]INC1： AC<—AC+1为了设计数据路径，我们可以采用两种办法：1〉创造直接的两个要传输组件之间的直接路径2〉在CPU内部创造总线来传输不同组件之间的数据首先我们回顾一下可能发生的数据传输，以便确定各个组件的功能。特别的我们要注意把数据载入组件的各个操作。首先我们按照他们改变了那个寄存器的数据来重组这些操作。得到如下的结果：AR：AR<—PC；AR<—DR[5：0]PC：PC<—PC+1；PC<—DR[5：0]DR：DR<—MIR：IR<—DR[7：6]AC：AC<—AC+DR；AC<—AC^DR；AC<—AC+1现在我们来看每个操作来决定每个组件执行什么样的功能，AR，DR，IR三个组件经常从其他的组件载入数据（从总线），所以只需要执行一个并行输入的操作。PC和AC能够载入数据同时也能够自动加一操作。下一步我们把这些组件连接到总线上来，如图所示：如上图所示，各个组件与总线之间通过三态连接，防止出现总线竞争。AR寄存器送出存储器的地址，DR寄存器用于暂存存数起来的数据。到现在为止我们还没有讨论有关的控制信号，我们现在只是保证了所有的数据传输能够产生，我们将在后面章节来使这些数据传输正确的产生---控制逻辑。现在我们来看以下者写数据传输中有没有不必要的传输：1〉 AR仅仅提供数据给存储器，所以他不需要连接到总线上。2〉 IR不通过总线提供数据给任何组件，所以他可以直接输出到控制单元（后面章节）。3〉 AC不提供数据到任何的组件，可以不连接到总线上。4〉 总线是8bit宽度的，但是有些传输是6bit或者2bit的，我们必须制定寄存器的那几位送到总线的那几位。5〉 AC要可以载入AC和DR的和或者逻辑与的值，数据路径中还需要进行运算的ALU。由此我们做以下工作：1〉 去掉AR，IR， AC与总线的连接。2〉 我们约定寄存器连接是从总线的低位开始的。AR，PC连接到Bus[5：0]，由于IR是接受DR[7：6]的，所以可以连接到总线的Bus[7：6]。3〉 我们设定，AC作为ALU的一个输入，另一个输入来自总线Bus。下面我们检查是否有争用总线的情况，幸运的是这里没有。修改后的CPU内部组织图如下：ALU设计这个CPU的ALU执行的功能就是两个操作数相加、逻辑与。这里不作详细介绍。电路如如下： 控制单元 我们来考虑如何产生数据路径所需的控制信号，有两种方法：硬布线逻辑和为程序控制。这里我们用硬布线逻辑来实现。这个简单的CPU需要的控制逻辑由三个部件组成： 1〉计数器： 用于保存现在的状态 2〉译码器： 生成各个状态的控制信号 3〉其他的组合逻辑来产生控制信号一个通用的控制单元原理图如下： 对于这个CPU来说，一共有9个状态。所以需要一个4bit的计数器和一个4-16的译码器。接下来的工作就是按照前面的状态转换图来对状态进行赋值。 首先考虑如何的对译码输出状态进行赋值才能达到最佳状态。我们按照以下规则： 1〉给Fetch1赋计数器的0值，并用计数器的清零端来达到这个状态。由这个CPU的状态图可以看出，除了Fetch1状态外的状态都只能由一个状态转化而来，Fetch1需要从4个分支而来，这4个分支就可以发出清零信号（CLR）来转移到Fetch1。 2〉把连续的状态赋连续的计数器值，这样就可以用计数器的INC输入来达到状态的转移。 3〉给每个例程的开始状态赋值时，要基于指令的操作码和这个例程的最大状态数。这样就可以用操作码来生成计数器的LD信号达到正确的状态转移。首先，在Fetch3状态发出LD信号，然后要把正确的例程地址放到计数器的输入端。对这个CPU来说，我们考虑以地址1 [IR] 0作为计数器的预置输入。则得到状态编码如下：如上表所示，下面我们需要设计产生计数器的LD、INC、CLR等信号，总的控制单元的逻辑如下图：下面我们用这些译码信号来产生数据路径控制所必需的AR、PC、DR、IR、M和ALU的控制信号。首先考虑寄存器AR，他在Fetch1状态取PC的值，并在Fetch3状态取DR[5：0]的值，所以我们得到ARLOAD=Fetch1 or Fetch3。以此类推我们可以得到如下结果：PCLOAD=JMP1PCINC=Fetch2DRLOAD=Fetch1or ADD1 or AND1ACLOAD=ADD2 or AND2IRLOAD=Fetch3对于ALU的控制信号ALUSEL是用来控制ALU做逻辑或者算数运算的，所以有：ALUSEL=AND2对于片内总线的控制较为复杂，我们先来看DR，对于DR他只在Fetch3、AND2 、ADD2和JMP1状态占用总线进行相信的数据传输，所以有：DRBUS=Fetch3 or AND2 or ADD2 or JMP1其他类似有：MEMBUS=Fetch2or ADD1 or AND1PCBUS=Fetch1最后，控制单元需要产生存储器的读信号（READ），它发生在Fetch2、ADD1、AND1三个状态：READ=Fetch2or ADD1 or AND1这样我们得到了总的控制逻辑，完成了整个CPU的设计。8. 设计验证 我们执行如下指令进行设计验证，0：ADD41：AND52：INC3：JMP04：27H5：39H指令执行过程如下（初始化所有寄存器为全零态）：
原创 Hammond半导体行业观察2023年12月26日09：53安徽今年早些时候，我（指代本文作者）正在纽约大学从事博士后工作，其中之一是探索Verilog 大型语言模型的使用。我们对使用 ChatGPT 等 LLM 来设计硬件的各种不同应用程序进行了基准测试，包括规范解释、设计以及错误检测和修复。我们是这个领域的先行者之一，早在 2020 年就开始使用 GPT-2 和 Verilog。我立即对上述帖子产生了兴趣，但由于实际流片的成本过高，我们一直使用 FPGA 和模拟。但是，模拟与现实之间总是存在差距，因此表明LLM和人工智能确实可以生产芯片可能对我们的研究领域来说是一个福音。我们能否使用免费流片的Tiny Tapeout 作为实现此目的的工具，并使用LLM不仅编写 Verilog，还为真正的芯片设计 Verilog？我与我的导师和其他几位博士生进行了交谈，我们集思广益了一些想法。Tiny Tapeout 非常小，只有 1000 个标准单元左右，这意味着设计会受到很大限制，但我们都非常喜欢这个想法，特别是因为似乎还没有人做到过，所以如果我们行动迅速，我们可能会能够做到世界第一！所以，我们决定去做。但现在，还有很多其他事情需要考虑。鉴于设计空间如此之小，我们应该提交什么？还有其他问题。我们从我们自己之前的工作中知道，LLM可以编写像 Verilog 这样的硬件设计语言，但他们只是不太擅长，与 Python 等更流行的语言相比，语法或逻辑错误的发生率要高得多，这就是为什么我我的团队已经为 Verilog 制作了自己的LLM的原因。因此，我们需要决定，如果我们确实想使用LLM来制造芯片，（1）我们应该使用哪个LLM？（2）我们应该给它多大的帮助？（3）我们应该尝试什么prompting strategy？设计方法我们首先决定了LLM。我们不会使用到目前为止我们一直在使用的“自动完成”风格的LLM，主要是 OpenAI 的 Codex 和 Salesforce CodeGen，而是使用更新、更华丽的“对话”/“指导”风格的法学硕士。我们选择了 OpenAI 的 ChatGPT 3.5 和ChatGPT 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首先生成设计，然后生成测试平台，然后将它们一起模拟，并反馈任何错误。有时，谈话中需要考虑特殊情况。由于模型在一次响应中可以给出的输出量受到限制，文件或解释通常会被中断；在这些情况下，模型将提示“请继续”。continue 之后的代码通常从较早消息的最后一行之前开始，因此当代码被复制到文件中进行编译和模拟时，它会被编辑以形成一个内聚块。然而，这个过程没有添加额外的 HDL。同样，有时响应中会包含让用户添加自己的代码的注释。如果这些注释会阻止功能，例如留下不完整的值数组，则将重新生成响应，否则将保持原样。设计提示：我们在这个环节设计的提示词看起来像这样：在试过之后，我们发现返回的设计质量参差不齐，我们发现只有 ChatGPT-4 可以可靠地生成设计。以下是每个LLM的第一个设计（移位寄存器）的示例：1、首先我们看一下ChatGPT 4.0生成的反馈：这个代码是有用的。2.我们再试一下ChatGPT 3.5，生成的结果如下：同样有用。3.我们再试一下BARD，得出以下结果。这是行不通的！请注意输入定义中的错误。4.再看一下HuggingChat从以上代码看来，它似乎已经疯了。测试平台（Testbenches）一旦我们有了设计，我们就必须提示建立一个测试平台，在这里，我们将用以下提示词：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.以下是完整的对话事例：1.我们先看一下ChatGPT 4.0生成的回复。我们首先问:得到的回复如下：以下是代码的快速细分：1.Define the shift_register module with the specified inputs and outputs.2.Create an always block that responds to the rising edge of the clock (posedge clk) or the falling edge of the active-low reset (negedge reset_n).3.Within the always block, check if the reset signal is low (!reset_n). If so, clear the 8-bit output register (data_out <= 8'b0).4.If the reset signal is not low, check if the shift enable signal is high. If so, shift the data in the output register to the left and insert the new data bit at the least significant bit position (data_out <= {data_out[6:0], data_in}).该设计满足给定的规格，并提供具有所需输入和输出的 8 位移位寄存器。接下来我又问：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.然后得出下面的回答：该测试平台涵盖四个测试用例：简单移位（shift）：将 1 移入寄存器并检查输出。使用交替位进行移位：移位交替位模式并检查输出。没有shift_enable 的移位：验证移位寄存器在没有shift_enable 信号的情况下不会移位。移位操作期间复位：检查移位操作期间寄存器是否正确复位。如果任何测试用例失败，测试台会提供错误消息。如果所有测试用例都通过。接下来，我们又问了一个问题：When running the simulation it gives the following output. Please provide fixed code.Error: Test case 1 failed. Expected: 10000000, Received: 01111111Error: Test case 2 failed. Expected: 10101010, Received: 01010101Error: Test case 3 failed. Expected: 10101010, Received: 01010101All test cases passed!然后，我们得出以下回应：Apologies for the confusion. It appears that the test cases are failing due to incorrect output expectations. I made a mistake in the test case expectations. Let's correct the test cases and update the testbench code:我根据移位寄存器的正确行为更新了测试用例 1、2 和 3 的预期输出。现在，当您运行模拟时，它应该显示“所有测试用例已通过！” 没有任何错误。而事实上，它也确实通过了，没有任何错误！基本结果总体而言，只有 ChatGPT-3.5 和 ChatGPT-4 可以可靠地生成设计，因此我们最终只分析了这两个模型，并将 Bard 和 HuggingChat 从我们的结果中排除。使用两个 OpenAI 模型，我们完成了全套基准测试 3 次，得到了以下结果：命名法（ Nomenclature）：如果没有报告错误，则设计通过，无需反馈 (NFN：no feedback necessary)。相反，如果这些操作中的任何一个报告错误，它们就会反馈到模型中，并要求“请提供修复。”，称为工具反馈 (TF：tool feedback)。如果相同的错误或类型的错误出现三次，则用户会给出简单的人工反馈（SHF：simple human feedback），通常是通过说明 Verilog 中的哪种类型的问题会导致此错误（例如声明信号时的语法错误）。如果错误继续存在，则提供中等人类反馈 (MHF：moderate human feedback)，并向工具提供稍微更有针对性的信息以识别特定错误。如果错误仍然存在，则提供高级人类反馈 (AHF：advanced human feedback)，该反馈依赖于准确指出位置错误是什么以及修复它的方法。一旦设计经过编译和仿真且没有失败的测试用例，就被认为是成功的。然而，如果高级反馈无法修复错误，或者用户需要编写任何 Verilog 来解决错误，则测试将被视为失败。如果对话超过 25 条消息（符合 OpenAI 每 3 小时 ChatGPT-4 消息的速率限制），则测试也被视为失败。由此可见，ChatGPT-4表现良好。大多数基准测试都通过了，其中大多数只需要工具反馈。ChatGPT-4 在测试平台设计中最需要的人工反馈。几种故障模式是一致的，一个常见的错误是在设计或测试平台中添加了 SystemVerilog 特定的语法。例如，它经常尝试typedef为 FSM 模型创建状态，或实例化向量数组，而这两种情况在 Verilog-2001 中均不受支持。总的来说，ChatGPT-4 生成的测试平台并不是特别全面。尽管如此，通过随附测试平台的大多数设计也被认为是合规的。两个不合规的“passes”是Dice Rollers，它不产生伪随机输出。测试集 T1 中的Dice Rollers将在一次roll中输出 2，然后在所有后续roll中仅输出 1，无论选择何种die。同时，Dice Roller T3 会改变值，但仅限于快速重复的一小部分（取决于所选die）之间。为了闭合设计循环，我们从 Tiny Tapeout 3 的 ChatGPT-4 对话中合成了测试集 T1，添加了由 ChatGPT-4 设计但未经测试的包装器模块（wrapper module ）。整个设计需要 85 个组合逻辑单元、4 个二极管、44 个触发器、39 个缓冲器和 300 个抽头来实现。ChatGPT-3.5的表现明显比 ChatGPT-4 差，大多数对话都导致基准测试失败，并且大多数通过自己测试平台的对话都是不合规的。ChatGPT-3.5 的故障模式与 ChatGPT-4 相比不太一致，每次对话和基准测试之间都会引入各种各样的问题。与 ChatGPT-4 相比，它需要更频繁地修正设计和测试平台。观察结果只有 ChatGPT-4 能够充分满足编写 Verilog 的目的，尽管它仍然需要人类反馈才能使大多数对话成功并符合给定的规范。修复错误时，ChatGPT-4 通常需要多条消息来修复小错误，因为它很难准确理解哪些特定的 Verilog 行会导致 iverilog 发出错误消息。它所添加的错误也往往会在对话之间经常重复出现。ChatGPT-4 在创建功能测试平台方面也比功能设计付出了更多努力。大多数基准测试几乎不需要对设计本身进行修改，而是需要修复测试平台。对于 FSM 来说尤其如此，因为该模型似乎无法创建一个测试平台来正确检查输出，而无需有关状态转换和相应预期输出的重要反馈。另一方面，ChatGPT-3.5 在测试平台和功能设计方面都遇到了困难。更复杂的东西：QTcore-A1在基准测试期间，我是 ChatGPT-4 的学生，现在我已准备好接受更大的挑战，并着手让它为微控制器创建组件。我想知道非结构化对话是否可以提高模型的性能水平，使用一种共同的创造力来更快地编写设计。在这里我要指出的是，我是一位在小型玩具/学术处理器设计方面经验丰富的工程师，曾在奥克兰大学、纽约大学以及现在我所在的澳大利亚悉尼南威尔士大学教授该领域的学生多年。这就是我想要 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 所需的组件，最后将数据路径中的这些组件与控制单元组合起来进行管理，通过模拟和测试来发现错误并进行修复。构建对话对话线程（Conversation threading:）：鉴于 ChatGPT-4 与其他 LLM 一样具有固定大小的上下文窗口，我们假设提示模型的最佳方法是将较大的设计分解为子任务，每个子任务都有自己的“对话线程”界面。这使总长度保持在 16,000 个字符以下。当长度超过此值时，专有的后端方法会执行某种文本缩减，但其实现的细节很少。由于 ChatGPT-4 不在线程之间共享信息，人类工程师会将相关信息从前一个线程复制到新的第一条消息中，从而形成一个“基本规范”，慢慢地定义处理器。基本规范最终包括 ISA、寄存器列表（累加器ACC、程序计数器PC、指令寄存器IR）、存储体、ALU 和控制单元的定义，以及处理器在每个周期中应执行的操作的高级概述。本规范中的大部分信息由 ChatGPT-4 生成，并由人工复制/粘贴和轻微编辑。主题（Topics）：每个线程一个主题对于处理器的早期设计阶段效果很好（有一个例外，其中 ALU 是在与多周期处理器时钟周期时序计划相同的线程中设计的）。然而，一旦处理器进入模拟阶段并在其上运行程序，我们就发现了规范和实现中的错误和错误。设计工程师没有开始新的对话线程并重建先前的上下文，而是选择在适当的情况下继续先前的对话线程。我们在下面的流程图中对此进行了说明，其中“Cont. T. ID”列指示他们是否“Continued”前一个线程（如果是，则为哪个线程）。重新启动（Restarts）：有时 ChatGPT-4 会输出次优响应。如果是这样，工程师有两个选择：(1) 继续对话并推动它修复响应，或者 (2) 使用界面强制 ChatGPT-4“重新启动”响应，即通过假装先前的结果来重新生成结果答案从未出现。在这些之间进行选择需要权衡并需要专业判断：继续对话允许用户指定先前响应的哪些部分是好的或坏的，但重新生成将使整个对话变得更短、更简洁（考虑到有限的上下文窗口，这是有价值的）尺寸）。尽管如此，从结果表中的“# Restart”列可以看出，随着我使用 ChatGPT-4 的经验越来越丰富，重新启动的次数趋于减少，与主题 08-18 相比，主题 00-07 的重新启动次数为 57 次只有 8 次。在主题 04（控制信号规划）中，单条消息的最高个体重启次数为 10，其中包含以下消息：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，并演示了如何解决移位寄存器原语中的错误。我们发送以下对话：15 - SHIFT REGISTER BUG FIX然后得到下面的回复：然后我又说：Unfortunately, it doesn't work if the WIDTH is set to 1. Can you fix it?之后得到了下面的回复：现在，代码将正确处理 WIDTH 设置为 1 的情况。之后我继续说：Thanks! Can you also make it so scan_enable has a higher priority than the normal enable?然后得到了下面的回复：现在，“scan_enable”信号比“enable”信号具有更高的优先级。当两个信号都为高电平时，移位寄存器将工作在扫描模式而不是正常模式。同时我们也证明了，这个错误修复也有效！开发指令集架构（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（cutie core）。这是最终产生的数据路径（控制信号用虚线表示 - 使用摩尔型多周期（moore-type multicycle ） FSM 来控制它们）。在设计处理器时，我确保每个寄存器也通过扫描链连接（也是由 ChatGPT-4 设计的！）。这意味着我可以在实现后对设计进行编程，这也是我在模拟期间加载测试程序的方式。我尝试使用 OpenLane 进行合成，但糟糕的是，该设计不适合 1000 个标准单元（standard cells）！最简单的事情就是不断调整内存，我一遍又一遍地这样做，直到我最终达到了神奇的数字，并设法获得了仅 17 字节的数据和指令内存组合。经过 OpenLane 综合后，GDS 如下所示：我编写了一些测试程序，很快意识到我需要一些重复出现的常量值。玩了之后我还发现，内存映射中的常量值并没有寄存器占用那么多空间！因此，我设法将一些常量辅助值（包括“1”和“0”）放入内存映射中。这意味着我可以用该死的汇编语言为我下载到 FPGA (CMod-A7) 的处理器编写这个小程序。尽管我还必须实现一个编程器，我使用的是 STM32！在实际测试中，该设计是工作的。所以我很高兴，它在模拟和 FPGA 上都能工作，所以我很高兴地将它发送到 Tiny Tapeout进行流片。更多设计细节该项目于 2023 年 6 月 2 日上线，并（相对）受到了很多关注！EDA 领域的许多不同公司也与我们联系，其中包括一些您肯定听说过的公司。值得一提的是，我们还决定利用这个设计去参赛，因为该参赛对内核有一些规定。所以在QTcore-A1上，我们修改了微控制器，以便它能够占用 平台中更大的可用区域（仅使用一个可用空间的一部分）。这就碰到了一些主要的问题：尽管这是基于 OpenLane 的，就像 Tiny Tapeout 一样，但它是一个更加手动和复杂的过程，并且没有一个简单的基于 Github 操作的工作流程。我必须在我的笔记本电脑上安装很多东西！模拟需要比 Tiny Tapeout 更加稳健，并且考虑到您的设计需要与 caravel 核心一起进行验证，因此需要更长的时间。我最基本的模拟仍然需要超过 45 分钟，而 Tiny 的模拟大约需要 10 秒流片。这是一场竞赛，参赛作品的评判标准是它们的文档记录、可使用性、对开源的贡献等。所以我还必须确保这方面的一切都很好！然后，我决定让 ChatGPT-4 对 QTCore-A1 进行以下更改。首先，内存大小将升级为256字节共享指令/数据内存，分为16字节页面；其次，我会添加一些外设：一个 16 位定时器、一些 I/O 端口，并且考虑到我的日常工作是硬件安全研究员，我还决定添加 2 个八位“内存执行保护”控制寄存器为 16 个页面中的每个页面提供“执行”位，并更新原始的、被诅咒的分支逻辑。新的指令集架构：当我提出设计变更时，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 将内存段设置为可执行，然后跳转到不可执行的段以使处理器崩溃。如图所示：然后，我们终于拿到了这个芯片。基本测试和圣诞节 LED 显示屏！我需要测试的第一件事是我实际上可以与我的芯片对话，就像我在模拟中所做的那样。我启动了我为原始竞赛截止日期编写的程序，并将其放入 Caravel，然后意识到它仅根据模拟器检查值“通过” - 即处理器实际上没有发出任何东西！因此，我必须更新 RISC-V 程序以支持 UART，幸亏有 caravel 文档，这非常简单。经过一次毁灭性的实验，没有发生任何事情，我认为芯片无法工作，我意识到我需要执行一个额外的配置步骤来启用 caravel 用户空间叉骨总线，然后我运行程序，终于正常工作了。很难描述在我面前有一块我参与设计的工作硅片是多么令人惊奇，特别是因为我以前从未真正设计过任何流片。如果没有像 ChatGPT 这样的LLM来激励我去尝试，我也许也不会这么做。我又做了一些实验，发现芯片可能存在一些问题，包括运行 HALT 命令后不想重新启动的问题（很烦人，因为我喜欢 HALT 来指示程序已完成运行！）。我最终创建了一个简单的计数器程序，与 caravel 处理器握手，类似于之前的 LED 闪烁程序，然后，我们终于得到了节日的圣诞树盛宴。我们的 QTCore-C1 设计是一个基于 8 位累加器的架构，可以充当主 Caravel 核心的一种可预测协处理器。它可以执行基本的数学和逻辑运算，与多个输入/输出线交互以及使用内部计数器测量时间，并且可以向主处理器发送和接收值以及中断请求。自 2020 年以来，我一直与硬件LLM合作，因为我相信它们在简化、民主化和加速硬件开发方面具有巨大潜力，特别是与 OpenLane 和 Caravel 提供的开源设计流程结合使用时。我也不认为我是唯一持这种观点的人。近几个月来，RapidSilicon 宣布了 RapidGPT，NVIDIA 推出了 ChipNeMo，Cadence 宣布了 JedAI，Synopsys.AI 也已推出。所有这些都是现实世界的商业企业，旨在将LLM带入硬件领域。我对接下来发生的事情感到非常兴奋。原文链接https://01001000.xyz/2023-12-21-ChatGPT-AI-Silicon/来自微信
半导体行业观察2023年03月08日09：59安徽指数级的数据增长促使计算行业开始进行突破性的架构转变，以从根本上改变数据中心的性能、效率和成本。为了继续提高性能，服务器正越来越多地转向异构计算架构，使用专门构建的加速器从 CPU 卸载专门的工作负载。CXL 的内存缓存一致性允许在 CPU 和加速器之间共享内存资源。此外，CXL 支持部署新的内存层，可以弥合主内存和 SSD 存储之间的延迟差距。这些新的内存层将增加带宽、容量、提高效率并降低总体拥有成本 (TCO)。凭借这些诸多优势，业界果断地将 CXL 融合为处理器、内存和加速器的高速缓存一致性互连。CXL通过一个叫做CXL 联盟的开放行业标准组织开发技术规范，促进新兴使用模型的性能突破，同时支持数据中心加速器和其他高速增强功能的开放生态系统。CXL简介：什么是 Compute Express Link？CXL是一个开放标准的行业支持的缓存一致性互连，用于处理器、内存扩展和加速器。从本质上讲，CXL 技术在 CPU 内存空间和连接设备上的内存之间保持内存一致性。这支持资源共享（或池化）以获得更高的性能，降低软件堆栈的复杂性，并降低整体系统成本。CXL 联盟已经确定了将采用新互连的三类主要设备：类型1设备：智能 NIC 等加速器通常缺少本地内存。通过 CXL，这些设备可以与主机处理器的 DDR 内存进行通信。类型2设备：GPU、ASIC 和 FPGA 都配备了 DDR 或 HBM 内存，并且可以使用 CXL 使主机处理器的内存在本地可供加速器使用，并使加速器的内存在本地可供 CPU 使用。它们还共同位于同一个缓存一致域中，有助于提升异构工作负载。类型 3 设备：内存设备可以通过 CXL 连接，为主机处理器提供额外的带宽和容量。内存的类型独立于主机的主内存。CXL 协议和标准CXL 标准通过三种协议支持各种用例：CXL.io、CXL.cache 和 CXL.memory。CXL.io：该协议在功能上等同于 PCIe 协议，并利用了 PCIe 的广泛行业采用和熟悉度。作为基础通信协议，CXL.io 用途广泛，适用于广泛的用例。CXL.cache：该协议专为更具体的应用程序而设计，使加速器能够有效地访问和缓存主机内存以优化性能。CXL.memory：该协议使主机（例如处理器）能够使用加载/存储命令访问设备连接的内存。这三个协议共同促进了计算设备（例如 CPU 主机和 AI 加速器）之间内存资源的一致共享。从本质上讲，这通过共享内存实现通信简化了编程。用于设备和主机互连的协议如下：类型 1 设备：CXL.io + CXL.cache类型2设备：CXL.io + CXL.cache + CXL.memory类型 3 设备：CXL.io + CXL.memoryCompute Express Link 与 PCIe：这两者有什么关系？CXL 建立在PCIe的物理和电气接口之上，其协议建立了一致性、简化了软件堆栈并保持与现有标准的兼容性。具体来说，CXL 利用 PCIe 5 功能，允许备用协议使用物理 PCIe 层。当支持 CXL 的加速器插入 x16 插槽时，设备会以每秒 2.5 千兆传输 (GT/s) 的默认 PCI Express 1.0 传输速率与主机处理器的端口进行协商。只有双方都支持 CXL，CXL 交易协议才会被激活。否则，它们作为 PCIe 设备运行。CXL 1.1 和 2.0 使用 PCIe 5.0 物理层，允许通过 16 通道链路在每个方向上以 32 GT/s 或高达 64 GB/s 的速度传输数据。CXL 3.0 使用 PCIe 6.0 物理层将数据传输扩展到 64 GT/s，支持通过 x16 链路进行高达 128 GB/s 的双向通信。CXL 2.0 和 3.0 有什么新功能？首先在内存池方面，CXL 2.0 支持切换以启用内存池。使用 CXL 2.0 交换机，主机可以访问池中的一个或多个设备。尽管主机必须支持 CXL 2.0 才能利用此功能，但内存设备可以是支持 CXL 1.0、1.1 和 2.0 的硬件的组合。在 1.0/1.1 中，设备被限制为一次只能由一台主机访问的单个逻辑设备。然而，一个 2.0 级别的设备可以被划分为多个逻辑设备，允许多达 16 台主机同时访问内存的不同部分。例如，主机 1 (H1) 可以使用设备 1 (D1) 中一半的内存和设备 2 (D2) 中四分之一的内存，以将其工作负载的内存需求与内存池中的可用容量完美匹配. 设备 D1 和 D2 中的剩余容量可由一台或多台其他主机使用，最多可达 16 台。设备 D3 和 D4 分别启用了 CXL 1.0 和 1.1，一次只能由一台主机使用。CXL 3.0 引入了对等直接内存访问和对内存池的增强，其中多个主机可以一致地共享 CXL 3.0 设备上的内存空间。这些功能支持新的使用模型并提高数据中心架构的灵活性。其次来到交换方面；通过转向 CXL 2.0 直连架构，数据中心可以获得主内存扩展的性能优势，以及池内存的效率和总体拥有成本 (TCO) 优势。假设所有主机和设备都支持 CXL 2.0，则“切换”通过 CXL 内存池芯片中的交叉开关集成到内存设备中。这可以保持较低的延迟，但需要更强大的芯片，因为它现在负责交换机执行的控制平面功能。通过低延迟直接连接，连接的内存设备可以使用 DDR DRAM 来扩展主机主内存。这可以在非常灵活的基础上完成，因为主机能够访问处理特定工作负载所需的尽可能多的设备的全部或部分容量。CXL 3.0 引入了多层交换，支持交换结构的实施。CXL 2.0 支持单层交换。借助 CXL 3.0，启用了交换结构，其中交换机可以连接到其他交换机，从而大大增加了扩展的可能性。第三，“按需”内存范例；类似于拼车，CXL 2.0 和 3.0 在“按需”的基础上为主机分配内存，从而提供更高的内存利用率和效率。该架构提供了为标称工作负载（而不是最坏情况）配置服务器主内存的选项，能够在需要时访问池以处理高容量工作负载，并为 TCO 带来更多好处。最终，CXL 内存池模型可以支持向服务器分解和可组合性的根本转变。在此范例中，可以按需组合离散的计算、内存和存储单元，以有效地满足任何工作负载的需求。第四，完整性和数据加密 (IDE)；分解——或分离服务器架构的组件——增加了攻击面。这正是 CXL 包含安全设计方法的原因。具体来说，所有三个 CXL 协议都通过完整性和数据加密 (IDE) 来保护，IDE 提供机密性、完整性和重放保护。IDE 在 CXL 主机和设备芯片中实例化的硬件级安全协议引擎中实现，以满足 CXL 的高速数据速率要求，而不会引入额外的延迟。应该注意的是，CXL 芯片和系统本身需要防止篡改和网络攻击的保护措施。在 CXL 芯片中实现的硬件信任根可以为安全启动和安全固件下载的安全和支持要求提供此基础。第五，将信令扩展到 64 GT/s；CXL 3.0 带来了标准数据速率的阶跃函数增加。如前所述，CXL 1.1 和 2.0 在其物理层使用 PCIe 5.0 电气：32 GT/s 的 NRZ 信号。CXL 3.0 秉承了以广泛采用的 PCIe 技术为基础构建的相同理念，并将其扩展到 2022 年初发布的最新 6.0 版 PCIe 标准。使用 PAM4 信号将 CXL 3.0 数据速率提高到 64 GT/s。我们涵盖了 PCIe 6 中 PAM4 信令的详细信息——您需要知道的一切。得益于CXL的出现，开发者可以简化和改进低延迟连接和内存一致性，显著提高计算性能和效率，同时降低 TCO。此外，CXL 内存扩展功能可在当今服务器中的直接连接 DIMM 插槽之上实现额外的容量和带宽。CXL 使得通过 CXL 连接设备向 CPU 主机处理器添加更多内存成为可能。当与持久内存配对时，低延迟 CXL 链路允许 CPU 主机将此额外内存与 DRAM 内存结合使用。大容量工作负载的性能取决于大内存容量，例如 AI。考虑到这些是大多数企业和数据中心运营商正在投资的工作负载类型，CXL 的优势显而易见。来自微信
1P与S0C设计2022年10月24日12：00江苏在之前的博文中分享过一系列一文搞懂：SPI协议、I2C协议、PID算法、Modbus协议等文章，也考虑过是否可以出一篇介绍CAN总线协议的文章，但是在之后的学习研究中，发觉CAN总线协议比较庞大和复杂，做为刚刚进入汽车电子行业的开发小白，一篇文章难以讲解清晰，所以决定在汽车电子专栏中连载分享关于CAN总线协议的相关知识。由于本人也处于学习和研究阶段，如果对CAN总线协议有理解不到位的地方，还请各位大佬在文末留言指正一二。1CAN总线简介CAN总线协议（Controller Area Network），控制器局域网总线，是德国BOSCH（博世）公司研发的一种串行通讯协议总线，它可以使用双绞线来传输信号，是世界上应用最广泛的现场总线之一。CAN通讯协议标准（ISO-11898：2003）介绍了设备间信息是如何传递以及符合开放系统互联参考模型（OSI）的哪些分层项。实际CAN通讯是在连接设备的物理介质中进行，物理介质的特性由模型中的物理层定义。ISO11898体系结构定义七层，OSI模型中的最低两层作为数据链路层和物理层，如下图所示：LLC用于接收滤波、超载通告、回复管理；MAC用于数据封装/拆封、帧编码、媒体访问管理、错误检测与标定、应答、串转发/并转串；PLS用于位编码/解码、位定时、同步；PMA为收发器特性。CAN协议主要用于汽车中各种不同元件之间的通信，以此取代昂贵而笨重的配电线束，该协议的健壮性使其同样适用于自动化和工业环境中。CAN总线协议距今已经发展40多年，如今，CAN总线已成为汽车（汽车、卡车、公共汽车、拖拉机等）、轮船、飞机、电动汽车电池、机械等的标准配置。CAN之前的版本：汽车ECU是复杂的点对点布线1986年：BOSCH（博世）开发了CAN协议作为解决方案1991年：BOSCH（博世）发布了CAN 2.0（CAN 2.0A：11位，2.0B：29位）1993年：CAN被采用为国际标准（ISO 11898）2003年：ISO 11898成为标准系列2012年：博世发布了CAN FD 1.02015年：CAN FD协议标准化（ISO 11898-1）2016年：CAN物理层，数据速率高达5 Mbit/s，已通过ISO 11898-2标准化CAN总线具有以下特点：符合OSI开放式通信系统参考模型；两线式总线结构，电气信号为差分式；多主控制，在总线空闲时，所有的单元都可开始发送消息，最先访问总线的单元可获得发送权；多个单元同时开始发送时，发送高优先级ID消息的单元可获得发送权；点对点控制，一点对多点及全局广播几种传送方式接收数据，网络上的节点可分成不同的优先级，可以满足不同的实时要求；采用非破坏性位仲裁总线结构机制，当两个节点同时向网络上传送信息时，优先级低的节点主动停止数据发送，而优先级高的节点可不受影响地继续传送数据消息报文不包含源地址或者目标地址，仅通过标识符表明消息功能和优先级；基于固定消息格式的广播式总线系统，短帧结构；事件触发型，只有当有消息要发送时，节点才向总线上广播消息；可以通过发送远程帧请求其它节点发送数据；消息数据长度0~8Byte；节点数最多可达110个；错误检测功能。所有节点均可检测错误，检测错误的单元会立即通知其它所有单元；发送消息出错后，节点会自动重发；故障限制，具有自动关闭总线的功能，节点控制器可以判断错误是暂时的数据错误还是持续性错误，当总线上发生持续数据错误时，控制器可将节点从总线上隔离，以使总线上的其他操作不受影响；通信介质可采用双绞线、同轴电缆和光导纤维，一般使用最便宜的双绞线；理论上，CAN总线用单根信号线就可以通信，但还是配备了第二根导线，第二根导线与第一根导线信号为差分关系，可以有效抑制电磁干扰；直接通信距离最远可达10KM(速率4Kbps以下)，通信速率最高可达1MB/s(此时距离最长40M)；总线上可同时连接多个节点，可连接节点总数理论上是没有限制的，但实际可连接节点数受总线上时间延迟及电气负载的限制。每帧信息都有CRC校验及其他检错措施，数据错误率极低；废除了传统的站地址编码，取而代之的是对通信数据块进行编码。采用这种方法的优点是可使网络内的节点个数在理论上不受限制，数据块的标识码可由11位或29位二进制数组成，因此可以定义211或229个不同的数据块，这种数据块编码方式，还可使不同的节点同时接收到相同的数据，这一点在分步式控制中非常重要。CAN总线具体以下优势：2CAN节点组成CAN节点通常由三部分组成：CAN收发器、CAN控制器和MCU。CAN总线通过差分信号进行数据传输，CAN收发器将差分信号转换为TTL电平信号，或者将TTL电平信号转换为差分信号，CAN控制器将TTL电平信号接收并传输给MCU，如下图所示：目前，我们常用的STM32、华大、瑞萨等单片机内部就集成了CAN控制器外设，通过配置就可实现对CAN报文数据的读取和发送。3CAN总线结构CAN总线是一种广播类型的总线，可支持线形拓扑、星形拓扑、树形拓扑和环形拓扑等。CAN网络中至少需要两个节点设备才可进行通信，无法仅向某一个特定节点设备发送消息，发送数据时所有节点都不可避免地接收所有流量。但是，CAN总线硬件支持本地过滤，因此每个节点可以设置对有效的消息做出反应。线形拓扑是在一条主干总线分出各个节点支线，其优点在于布线施工简单，接线方便，阻抗匹配规则固定，缺点是拓扑不够灵活，在一定程度上影响通讯距离，如下图所示：星形拓扑是每个节点通过中央设备连到一起，其优点是容易扩展，缺点是一旦中央设备出故障会导致总线集体故障，而且分支线长不同，阻抗匹配复杂，可能需要通过一些中继器或集线器进行扩展，如下图所示：树形拓扑是节点分支比较多，且分支长度不同，其优点是布线方便，缺点是网络拓扑复杂，阻抗匹配困难，通讯中极易出现问题，必须加一些集线器设备，如下图所示：环形拓扑是将CAN总线头尾相连，形成环状，其优点是线缆任意位置断开，总线都不会出现问题，缺点是信号反射严重，无法用于高波特率和远距离传输，如下图所示：虽然CAN总线可以支持多种网络拓扑，但在实际应用中比较推荐使用线形拓扑，且在IOS 11898-2中高速CAN物理层规范推荐也是线形拓扑。在ISO 11898-2和ISO 11898-3中分别规定了两种CAN总线结构（在BOSCH CAN2.0规范中，并没有关于总线拓扑结构的说明）。ISO 11898-2中定义了通信速率为125Kbps～1Mbps的高速闭环CAN通信标准，当通信总线长度≤40米，最大通信速率可达到1Mbps，高速闭环CAN（高速CAN）通信如下图所示：ISO 11898-3中定义了通信速率为10～125Kbps的低速开环CAN通信标准，当传输速率为40Kbps时，总线距离可达到1000米。低速开环CAN（低速容错CAN）通信如下图所示：4CAN总线物理电气特性在CAN总线上，利用CAN_H和CAN_L两根线上的电位差来表示CAN信号。CAN 总线上的电位差分为显性电平（Dominant Voltage）和隐性电平（Recessive Voltage），其中显性电平为逻辑 0，隐性电平为逻辑 1。高速CAN总线（ISO 11898-2，通信速率为125Kbps～1Mbps）在传输显性（0）信号时，会将 CAN_H端抬向5V高电平，将CAN_L拉向0V低电平。当传输隐性（1）信号时，并不会驱动 CAN_H 或者 CAN_L 端。 显性信号 CAN_H 和 CAN_L 两端差分标称电压为 2V。 终端电阻在没有驱动时，将差分标称电压降回 0V。显性信号（0）的共模电压需要在 1.5V 到 3.5V 之间。隐性信号（1）的共模电压需要在+/-12V。低速/容错CAN（ISO 11898-3，通信速率为10～125Kbps）在传输显性信号（0）时，驱动CANH端抬向5V，将CANL端降向0V。在传输隐性信号（1）时并不驱动CAN 总线的任何一端。在电源电压VCC为5V时，显性信号差分电压需要大于2.3V，隐性信号的差分电压需要小于0.6V。CAN总线两端未被驱动时，终端电阻使CAN L端回归到RTH电压（当电源电压VCC为5V时，RTH电压至少为Vcc-0.3V=4.7V），同时使CAN H端回归至RTL电压（RTL电压最大为0.3V）。两根线需要能够承受-27V至40V的电压而不被损坏。在高速和低速CAN中从隐性信号向显性信号过渡的速度更快，因为此时CAN线缆被主动积极地驱动，显性向隐性的过渡速度主要取决于CAN网络的长度和导线的电容。来自微信
科普：Memory Compiler生成的Register file和SRAM有何区别？
IP与S0C设计2021年09月03日04：01前两期，我们分别对OTP和MTP，RAM和ROM进行了比较。这一次，我们来谈谈Memory Compiler，以及通过它生成的Register file和SRAM。什么是Memory Compiler ？Memory Compiler，内存编译器。顾名思义，是用来生成不同容量memory的工具，输入参数，我们就可以得到生成的文件。生成的文件包括：前端设计verilog模型、逻辑综合的时序库、后端需要的电路网表和LEF/GDS版图文件、其他DFT验证相关的、datasheet手册等等。Memory Compiler由供应商提供，往往是不通用的，界面也不尽相同。同一个厂商的不同工艺下，Memory Compiler不同。相同工艺，不同厂商，Memory Compiler也不同。内存编译器通常是供应商的知识产权，其功能是根据客户的需求生成各种类型的memory。一般的Memory Compiler提供五个ram脚本（rf_sp,sram_sp,rf_tp,sram_dp,rom）。这意味着可以生成1 Port Register file、Single Port SRAM、2 Port Register file、Dual Port SRAM以及ROM。不同的厂商或许还拥有特殊工艺。一般来说，MC只生成常用的memory，特殊的往往需要定制或者组合。考虑到面积和性能，又可以划分为High Speed和High Density等等。图源知乎：SMIC 的Memory Compiler，由Artisan公司提供Memory Compiler使用介绍在使用Memory Compiler时，请务必确保你的RAM从头到位的规格与设定都相同，否则会造成一些不可避免的错误。首先在RTL代码阶段，要用到RAM就要用到verilog代码，此时不需要着急产生其他后阶段的必要数据，因为RTL代码阶段只需要行为级模型即可。当进入门级代码后，RAM compiler就要产生其他的相关数据了，同时要考虑RAM版图的位置与方向。由于重大的设计不会一蹴而就，所以有两个重点，第一个是每次使用RAM compiler时都一定要让它产生特性设置文档，避免忘记自己做过的设定。第二件事是对应的文件名要定义好，否则RAM的方向不同但是又用到了相同的文件名，就会把原始数据覆盖掉。RTL阶段在RTL阶段主要只是产生verilog行为级和设置文件。因为在RTL阶段不需要考虑RAM的位置信息。Memory Compiler提供多种选择，在这个阶段，选择生成RF或是SRAM，以及确定端口数量。如果容量比较大的话，相同设置下，单端口比双端口面积要小，速度也要快，功耗要低。综合与布局布线阶段为了避免重新启用Memory Compiler与以前设置有出入，所以最好一次性将Memory Compiler能够产生的相关数据一并输出。在这里，Memory Compiler还需要产生3种数据。 .LIB 该数据是RAM的时序信息文件 .VCLEF 布局布线工具需要使用的物理信息文件 .SPEC RAM的注释文件在布局布线前，需要考虑RAM的长与宽，估计它的位置与方向，尽量让功能想关的模块靠近一些。将产生的.LIB文件转换成.DB文件，就可以把Memory Compiler生成的RAM加入到代码中进行综合了。在综合工具的脚本中的serch_path下加入RAM的DB文件地址即可。以上为Memory Compiler大致的使用流程，不同的工具在细节上或许有所区别，但大体流程如此。苏州腾芯微电子的Memory Compiler界面接下来，我们来聊一聊，生成的memory——Register file和SRAM。Register file与SRAM的比较首先，厘清一下概念上的问题，Register file和很多的registers不是同一个概念。我们在IC设计里谈到register时，常常是指D触发器，而Register file是一种memory。那么，同为Memory Compiler生成，RF和SRAM有什么区别呢？在比较中，不同规格相比较显然不够客观，也不能让我们更清晰地认识到它们的差异。在比较前，我们需要先把端口的概念搞清楚： 1 port / single port：单端口，读写同端口，需要WE控制输入输出 2 port：双端口，读写分开，输入输出端口固定，可以不用WE控制 dual port:同样是双端口，但读写端口不固定，且都可读可写 RF 的端口示意图SRAM 的端口示意图所以我们应当把1P RF和SP SRAM，2P RF和DP SRAM比较，才有意义。1 Port Register file 和 Single Port SRAM同为单端口，从外部端口看，难以区分1P RF和SP SRAM的区别，但是我们可以从以下几个方面，来进行区分。首先我们以Memory Size：512*32的1P RF和SP SRAM为例。此为1P RF此为SP SRAM从datasheet直观上来看，SRAM比Register file多了OEN（输出使能）。除此之外，Register file和SRAM两者相比，SRAM的最大容量比RF要大。相同配置下，RF的面积更大，功耗更低。在mem比较小的情况下用RF划算，并且同样的mem，RF的长宽比会更小，方便后端floorplan。大容量的时候，SRAM的速度是有优势的。并且SRAM速度快，面积小。同样大小的RF，面积就很大了，速度也慢下来了。所以简单来说，小容量选RF，大容量选SRAM。2P Register file 和 Dual Port SRAM比起1P RF与SP SRAM的比较，2P RF与DP SRAM的差异较为直观。2P RF有一个输入数据总线，一个输出的数据总线。DP SRAM有两个数据输入总线，两个数据输出总线。换句话说，2P RF是一组信号，读写端口固定；而DP SRAM则有两组信号，读写不分开。且两组信号，每组都有自己的地址，输入数据总线，输出数据总线，时钟，读/写控制。这两组可以分别往存储单元写，或从存储单元读出。读可以一直读，写时数据可能存储单元数据更新，数据也可能输出端口。DP SRAM就好像2个SP SRAM共用存储单元。具体的应用，需要结合设计人员和项目自身的需求来选用。小容量，地址少的用RF。有两个外设要同时读写SRAM的，就要用DP SRAM。涉及到具体的选取，则需要由设计人员自己做判断了。以下为读写时序图：图源：数字IC自修室来自微信
如何用云服务器搭建一个芯片SOC环境
ICbug猎人处芯积律2021年08月01日07：52今天这篇文章将介绍如何在云端服务器安装EDA软件并且搭建SOC环境。EDA是一个很大的概念，我们这里讲的是芯片设计中的EDA软件。芯片设计的EDA软件包括设计输入工具如composer，设计仿真工具如VCS/Verdi,综合工具如Design Compile，布局布线工具如Design Planner，物理验证工具Dracula，模拟电路仿真器SPICE等。举例的这些EDA工都是收费软件。目前也有一些开源的EDA工具可以用，如仿真用的Iverilog/ Verilator，看波形用的gtkwave，综合用的YoSys等。Efabless曾经用这些纯开源的EDA软件开发并流片过一款芯片。这款芯片结构如下该芯片的资料在这里：https://github.com/efabless/raven-picorv32。这个链接里面包含了该芯片的开源软件，代码，测试等资料，作为一款SOC开源项目大家有兴趣可以去看看。刚才提到的开源EDA Iverilog和Gtkwave的安装方法比较简单，直接敲下面的命令即可：sudo apt-get install iverilog sudo apt-get install gtkwave对于Verilator的安装我们等会在搭建SOC环境的时候介绍，其他开源EDA的安装方法这里不再介绍，有兴趣的可以在网上搜索。Verdi/VCS/simvision/irun等需要授权的EDA软件也可以在云服务器上安装，但是需要license支持才能用。虽然网上也有破解版本，但是个人不推荐使用。如果是企业用户且员工比较少的情况下可以向各个地方的集成电路设计服务机构（如苏州ICC）申请各家EDA的license，能够得到比较大的支持。下面我们介绍搭建一个SOC项目并用相关EDA工具进行仿真。Opentitan是一个开源项目，他是由RISCV搭建的一款简单芯片，其系统架构如下这颗芯片主要构成有1个riscv核，512kB的eflash，64kB的SRAM，16kB的ROM，安全加密模块，32个IO端口，一个UART，一个GPIO，一个SPI。目前I2C还没加进去，据说后面会加进去。从opentitan提供的资料来看，该项目包括了开源的软件，硬件代码，还提供了三套仿真测试环境，分别是verilator仿真环境，FPGA测试环境以及需要VCS的仿真环境。学习人员可以根据自己需要选择不同的运行环境。我们提供的SOC环境搭建步骤在opentitan 的开源网站都能找到，如果有不清楚的地方可以在下面这个链接处查找。https://docs.opentitan.org/doc/ug/getting_started/搭建环境的第一步是创建工具的路径。 sudo mkdir/tools sudo chown $(id -un) /tools第二步是克隆opentitan的库，这样就将SOC的源代码和相关资料拷贝到你的云服务器上。working-area 是你创建的工作路径。cd git clone https://github.com/lowRISC/opentitan.git代码资料会被存在 /opentitan 下面，我们后面介绍的$REPO_TOP 指的就是 /opentitan 这个路径。第三步安装相关软件sudo apt install autoconf bison build-essentialclang-format cmake curl \doxygenflex g++ git golang libelf1 libelf-dev libftdi1-2 libftdi1-dev \ibncurses5 libssl-dev libusb-1.0-0 lsb-release make ninja-build perl \pkgconfpython3 python3-pip python3-setuptools python3-wheel python3-yaml \srecordtree xsltproc zlib1g-dev xz-utils第四步 芯片环境中有用到python3相关的脚本，而云服务器没有安装python3的相关组件，因此需要我们自己安装。apt install python-pippip install --upgrade setuptoolspython -m pip install --upgrade pipsudo apt install djangopip3 install --upgrade pippip3 install django-haystackpip3 install setuptools-scmpip3 install django-haystack装完这些软件后再按照下面步骤安装python3相关的脚本软件。cd $REPO_TOPpip3 install --user -r python-requirements.txt第五步是安装riscv的编译工具链，官网提供了两种方法，一个直接下载，另外一个需要自己编译工具链，对于初学者来讲，建议选择第一种。cd $REPO_TOP./util/get-toolchain.py通过上面五步，我们已经将芯片的源代码和工具链软件都准备好了。在上述文中也讲到，opentatian可以用开源的EDA工具进行仿真，也可以用VCS等需要授权的软件进行仿真。在这里我们选择开源的verilator仿真工具进行仿真。为此需要按照以下步骤安装verilator仿真工具。export VERILATOR_VERSION=4.104git clonehttps://github.com/verilator/verilator.gitcd verilatorgit checkout v$VERILATOR_VERSIONautoconf./configure--prefix=/tools/verilator/$VERILATOR_VERSIONmakemake install做完这些我们就可以去跑仿真了。第六步build环境cd $REPO_TOPfusesoc --cores-root . run --flag=fileset_top--target=sim --setup --build lowrisc:systems:chip_earlgrey_verilator./meson_init.shninja -C build-out all第七步输入以下指令进行跑仿真。cd $REPO_TOPbuild/lowrisc_systems_chip_earlgrey_verilator_0.1/sim-verilator/Vchip_earlgrey_verilator\ --meminit=rom,build-bin/sw/device/boot_rom/boot_rom_sim_verilator.scr.39.vmem--meminit=flash,build-bin/sw/device/examples/hello_world/hello_world_sim_verilator.elf\--meminit=otp,build-bin/sw/device/otp_img/otp_img_sim_verilator.vmem 这个时候我们可以在工作界面上看到类似以下log 为了看运行的结果用screen /dev/pts/4进行查看。由于开源软件运行的效率会比较低，跑仿真的时间会比较久，所以需要耐心等待一下。 如果想看信号波形，在上面跑仿真的命令里面加—trace，即可生成波形。然后用gtkwave sim.fst 查看波形，其效果如下。写在最后，opentitan这个项目的开发流程还是比较全的，对于芯片从业者是一个很好的学习资源，特别是里面验证的介绍很多公司都可以借鉴。经常看到很多芯片初从业人员没有什么项目经验，如果能够吃透这个项目那你在找工作的时候是非常有竞争力的。通过这篇文章我希望能够将做芯片这件看起来门槛很高的事情简单化，让更多的大学生甚至中学生都能参与其中，让更多的人更早的去了解知道计算机的工作原理。来自微信