欢迎来到半导体与芯片的世界 - 数字电路
type: channel
link: http://bennyhe.cn/index.php/category/%E6%95%B0%E5%AD%97%E7%94%B5%E8%B7%AF/
items: 轮毂电机光电增量编码器的ABZ信号详解
items: RISC-V CPU侧信道攻击原理与实践
items: 用Python设计芯片？开源设计语言PyGears亮相！
items: 一个简单的8位处理器完整设计过程及verilog代码
items: 我用ChatGPT设计了一颗芯片
items: 关于CXL，你想知道的都在这里
items: MRAM, RRAM和PRAM非易失性存储器基础
items: 详解CAN总线：什么是CAN总线？
items: 科普：Memory Compiler生成的Register file和SRAM有何区别？
items: 如何用云服务器搭建一个芯片SOC环境

轮毂电机光电增量编码器的ABZ信号详解
type: item
date: 2026-02-26T17:21:26+08:00
description: 轮毂电机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信号相当于是每转一圈给一个脉冲。

RISC-V CPU侧信道攻击原理与实践
type: item
date: 2026-02-26T17:18:33+08:00
description: 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）"，即通过远距离检测电脑屏幕放电的电信号，在电脑屏幕上重建图像。计算机领域的侧信道攻击，目前使用最为广泛的攻击手段就是基于时序的攻…

用Python设计芯片？开源设计语言PyGears亮相！
type: item
date: 2025-09-21T18:25:00+08:00
description: 近日，加州大学洛杉矶分校引入了一种新的硬件描述语言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代码
type: item
date: 2025-09-17T14:03:00+08:00
description: 来源： 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〉 我们设…

我用ChatGPT设计了一颗芯片
type: item
date: 2025-09-09T10:01:15+08:00
description: 原创 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的第一个设计（移位寄…

关于CXL，你想知道的都在这里
type: item
date: 2025-09-03T17:10:03+08:00
description: 半导体行业观察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 引入了对等直接内存访问和对内存池的增强，其…

MRAM, RRAM和PRAM非易失性存储器基础
type: item
date: 2025-09-03T14:51:00+08:00
description: semisilicon半导体之芯2022年10月26日22：14广东来自微信

详解CAN总线：什么是CAN总线？
type: item
date: 2025-09-02T10:29:44+08:00
description: 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，如下图所示：目…

科普：Memory Compiler生成的Register file和SRAM有何区别？
type: item
date: 2025-08-16T20:59:02+08:00
description: 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同为单端口…

如何用云服务器搭建一个芯片SOC环境
type: item
date: 2025-08-16T18:18:21+08:00
description: 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-h…