欢迎来到半导体与芯片的世界 - 数字电路
type: channel
link: http://bennyhe.cn/index.php/category/%E6%95%B0%E5%AD%97%E7%94%B5%E8%B7%AF/
items: 计算机体系架构——一文读懂Cache（一）
items: GitHub上Star量最高的5个机器学习项目
items: CPU 的工作原理是什么？
items: CPU 系统级验证 —— 指令集验证 ——OpenHW core-v 验证环境及文件分析
items: 推荐一款好用的IC设计中生成register model的工具
items: IPYXACT：Python 中的 IEEE-1685 (IP-XACT) 处理工具
items: spi master接口的fpga实现
items: systemverilog interface
items: emmc和ufs的区别_ufs和emmc使用差别
items: Vscode自动生成verilog例化

计算机体系架构——一文读懂Cache（一）
type: item
date: 2026-01-12T10:31:16+08:00
description: 0 绪论最近需要开个新坑，讲讲计算机体系架构方面的东西。这方面应用最为广泛的是一个叫cache的东西。这方面内容图比较多，不想自己画了，所以图都来自《Computer Architecture : A Quantitative Approach》。这是一本体系架构方面的神书，推荐大家看一下。本文主要内容如下，基本涉及了cache的概念，工作原理，以及保持一致性的入门内容。1 为什么需要Cache1.1 为什么需要Cache我们首先从一张图来开始讲为什么需要cache.上图是CPU性能和Memory存储器访问性能的发展。我们可以看到，随着工艺和设计的演进，CPU计算性能其实发生了翻天覆地的变化，但是DRAM存储性能的发展没有那么快。所以造成了一个问题，存储限制了计算的发展。容量与速度不可兼得。如何解决这个问题呢？可以从计算访问数据的规律入手。我们随便贴段代码可以看到，由于大量循环的存在，我们访问的数据其实在内存中的位置是相近的。换句专业点的话说，我们访问的数据有局部性。我们只需要将这些数据放入一个小而快的存储中，这样就可以快速访问相关数据了。总结起来，Cache是为了给CPU提供高速存储访问，利用数据局部性而设计的小存储单元。1.2 实际系统中的Cache我们展示一下实际系统中的cache。如上图所示。整个系统的存储架构包括了CPU的寄存器，L1/L2/L3 CACHE，DRAM和硬盘。数据访问时先找寄存器，寄存器里没有找L1 Cache, L1 Cache里没有找L2 Cache依次类推，最后找到硬盘中。同时，我们可以看到，速度与存储容量的折衷关系。容量越小，访问速度越快！其中，一个概念需要搞清楚。CPU和Cache是word传输的，而Cache到主存是以块传输的。一块大约64Byte.现有SOC中的Cache一般组成如下。1.3 Cache的分类Cache按照不同标准分类可以分为若干类。按照数据类型划分：I-Cache与D-Cache。其中I-Cache负责放置指令，D-Cache负责方式数据。两者最大的不同是D-Cache里的数据可以写回，I-Cache是只读的。按照大小划分：分为small cache和large cache。没路组（后文组相连介绍）<4KB叫small cache, 多用于L1 Cache, 大于4KB叫large cache。多用于L2及其他cache.按照位置划分：Inner Cache和Outer Cache。一般独属于CPU微架构的叫Inner cache, 例如上图的L1 L2 CACHE。不属于CPU微架构的叫outer cache.按照数据关系划分：Inclusive/exclusive Cache: 下级Cache包含上级的数据叫inclusive cache。不包含叫exclusive cache。举个例子，L3 Cache里有L2 Cache的数据，则L2 Cache叫exclusive cache。2 Cache的工作原理要讲清楚Cache的工作原理，需要回答4个问题：数据如何放置数据如何查询数据如何被替换如果发生了写操作，cache如何处理2.1 数据如何放置这个问题也好解决。我们举个简单的栗子来说明问题。假设我们主存中有32个块，而我们的cache一共有8个cache行( 一个cache行放一行数据）。假设我们要把主存中的块12放到cache里。那么应该放到cache里什么位置呢？三种方法：全相连（Fully associative）。可以放在cache的任何位置。直接映射（Direct mapped）。只允许放在cache的某一行。比如12 mod 8组相连（set associative）。可以放在cache的某几行。例如2路组相连，一共有4组，所以可以放在0,1位置中的一个。可以看到，全相连和直接映射是Cache组相连的两种极端情况。不同的放置方式主要影响有两点：组相连组数越大，比较电路就越大，但Cache利用率更高，cache miss发生的概率小。组相连数目变小，cache经常发生替换，但是比较电路比较小。这也好理解，内存中的块在cache中可放置的位置多，自然找起来就麻烦。2.2 如何在Cache中找数据其实找数据就是一个比对过程。如下图所示。我们地址都以Byte为单位的。但主存于cache之间的数据交换单位都是块（block，现代cache一般一个block大约64Byte)。所以地址对最后几位是block offset。由于我们采用了组相连，则还有几个比特代表的是存储到了哪个组。组内放着若干数据。我们需要比较Tag, 如果组内有Tag出现，则说明我们访问的数据在缓存中，可以开心的使用了。比如举个2路组相连的例子。如下图所示。T表示Tag。直接比较Tag，就能得知…

GitHub上Star量最高的5个机器学习项目
type: item
date: 2026-01-12T10:24:29+08:00
description: 本文介绍了 GitHub 上 star 量最高的 5 个机器学习项目，涉及人脸识别、文本处理、机器学习框架等。选自towardsdatascience，作者：Rishi Sidhu，机器之心编译参与：Nurhachu Null、Geek AI。机器学习领域正在飞速发展。GitHub 是一张举世瞩目的白板，高质量的代码通常被发布在这张充满智慧的无限大白板上。显然，我们不可能追踪机器学习世界中的所有东西，但是 GitHub 上每个项目都具备自己的 star 量。即，如果你标星了一个仓库，这意味着你对这个项目表达了赞赏，同时也跟踪了你觉得有意思的仓库。星数排名可作为了解最受关注项目的重要指标。本文就介绍了机器学习领域星数排名最高的 5 个项目。Face Recognition：26073★GitHub 地址：https://github.com/ageitgey/face_recognition?source=post_page---------------------------这是世界上最简洁的人脸识别工具。它提供对 Python 和命令行的应用程序接口（API），其用途是识别以及操作图像中的人脸。它使用 Dlib 最先进的人脸识别算法构建，该深度学习模型在 LFW（Labeled Faces in the Wild）数据集上达到了 99.38% 的准确率。它还提供了 face_recognition 命令行工具，它可以让你在包含图像的文件夹中使用命令行来进行人脸识别！这个库还可以处理实时人脸识别。动图封面fastText：18931 ★GitHub 地址：https://github.com/facebookresearch/fastText?source=post_page---------------------------fastText 是由 Facebook 团队开发的免费开源库，用于高效词表征学习。它是轻量级的，允许用户学习文本表征和句子分类器。它可以在标准通用硬件上运行，模型甚至可以被压缩到适应移动设备的大小。文本分类是很多应用的核心问题，例如垃圾邮件检测、情感分析或智能回复。文本分类的目标是给文档（例如电子邮件、博客、短信、产品评论等）分配多个类别。词类示例（图源：Alterra.ai）对自然语言处理（NLP）爱好者而言，这是一款非常有用的工具。图源：https://fasttext.cc/?source=post_pag (https://fasttext.cc/?source=post_pag%EF%BC%89)Awesome TensorFlow：14501★GitHub 地址：https://github.com/jtoy/awesome-tensorflow这是一个帮你理解和使用 TensorFlow 的资源集合。该 repo 涵盖一系列资源列表，如很棒的 TensorFlow 实验、库和项目。TensorFlow 是 Google 开发的端到端开源机器学习平台。它有全面的生态系统，包括工具、库和社区资源，允许研究者创建最先进的机器学习算法。使用 TensorFlow，开发者可以很容易地构建并部署由机器学习驱动的应用。图源：https://www.tensorflow.org/tutorials/keras/basic_classification?source=post_pageApache predictionio 11866 ★GitHub 地址：https://github.com/apache/predictionioApache PredictionIO 是供开发者、数据科学家和终端用户使用的开源机器学习框架。用户可使用该框架构建真实的机器学习应用，并进行部署和测试。它甚至支持事件收集、评估，以及查询预测结果。它基于可扩展的开源服务，如 Hadoop、HBase 等。就机器学习而言，该工具减轻了开发人员的思维负担。图源：http://predictionio.apache.org/appintegration/?source=post_pageStyle2Paints：9860 ★GitHub 地址：https://github.com/lllyasviel/style2paints该 repo 与前面 4 个有点不一样，因为缺乏资金，它已经被关闭了！它确实是一个有趣的设想，使用 AI 给图像上色。创建者称 Style2paints V4 是当前最好的 AI 线稿上色工具。他们称这个项目与之前的端到端图像转换方法不同，因为它是第一个用真实的人类作业流程为线稿上色的系统。很多艺术家熟悉这个流程。素描-->彩色填充/扁平化-->渐变/细节添加-->阴影处理Style2Paints就是根据这个流…

CPU 的工作原理是什么？
type: item
date: 2026-01-12T10:08:00+08:00
description: 想了解CPU的工作原理莫过于从头开始用最基础的元素打造一个简单CPU。接下来我会从最简单的晶体管开始一步步讲解CPU是如何构造出来的，明白了这个过程理解 CPU 的工作原理不在话下，在此之后我会从最基础的二进制机器指令一步步讲解高级语言的基本原理，通读本文后你将彻底明白CPU与高级语言的工作原理。以下内容出自我的两篇文章《你管这破玩意叫CPU？》《你管这破玩意叫编程语言？》。次回家开灯时你有没有想过，用你按的简单开关实际上能打造出复杂的 CPU 来，只不过需要的数量会比较多，也就几十亿个吧。伟大的发明过去200年人类最重要的发明是什么？蒸汽机？电灯？火箭？这些可能都不是，最重要的也许是这个小东西：这个小东西就叫晶体管，你可能会问，晶体管有什么用呢？实际上晶体管的功能简单到不能再简单，给一端通上电，那么电流可以从另外两端通过，否则不能通过，其本质就是一个开关。就是这个小东西的发明让三个人获得了诺贝尔物理学奖，可见其举足轻重的地位。无论程序员编写的程序多么复杂，软件承载的功能最终都是通过这个小东西简单的开闭完成的，除了神奇二字，我想不出其它词来。AND、OR、NOT现在有了晶体管，也就是开关，在此基础之上就可以搭积木了，你随手搭建出来这样三种组合：两个开关只有同时打开电流才会通过，灯才会亮两个开关中只要有一个打开电流就能通过，灯就会亮当开关关闭时电流通过灯会亮，打开开关灯反而电流不能通过灯会灭天赋异禀的你搭建的上述组合分别就是：与门，AND Gate、或门，OR gate、非门，NOT gate，用符号表示就是这样：道生一、一生二、二生三、三生万物最神奇的是，你随手搭建的三种电路竟然有一种很amazing的特性，那就是：任何一个逻辑函数最终都可以通过AND、OR以及NOT表达出来，这就是所谓的逻辑完备性，就是这么神奇。也就是说给定足够的AND、OR以及NOT门，就可以实现任何一个逻辑函数，除此之外我们不需要任何其它类型的逻辑门电路，这时我们认为{AND、OR、NOT}就是逻辑完备的。这一结论的得出吹响了计算机革命的号角，这个结论告诉我们计算机最终可以通过简单的{AND、OR、NOT}门构造出来，就好比基因。计算能力是怎么来的现在能生成万物的基础元素与或非门出现了，接下来我们着手设计CPU 最重要的能力：计算，以加法为例。由于CPU只认知 0 和 1，也就是二进制，那么二进制的加法有哪些组合呢：0 + 0，结果为0，进位为00 + 1，结果为1，进位为01 + 0，结果为1，进位为01 + 1，结果为0，进位为1，二进制嘛！注意进位一列，只有当两路输入的值都是 1 时，进位才是 1 ，看一下你设计的三种组合电路，这就是与门啊，有没有！再看下结果一列，当两路输入的值不同时结果为1，输入结果相同时结果为0，这就是异或啊，有没有！我们说过与或非门是逻辑完备可以生万物，异或逻辑当然不在话下，用一个与门和一个异或门就可以实现二进制加法：上述电路就是一个简单的加法器，就问你神奇不神奇，加法可以用与或非门实现，其它的也一样能实现，逻辑完备嘛。除了加法，我们也可以根据需要将不同的算数运算设计出来，负责计算的电路有一个统称，这就是所谓的arithmetic/logic unit，ALU，CPU 中专门负责运算的模块，本质上和上面的简单电路没什么区别，就是更加复杂而已。现在，通过与或非门的组合我们获得了计算能力，计算能力就是这么来的。但，只有计算能力是不够的，电路需要能记得住信息。神奇的记忆能力到目前为止，你设计的组合电路比如加法器天生是没有办法存储信息的，它们只是简单的根据输入得出输出，但输入输出总的有个地方能够保存起来，这就是需要电路能保存信息。电路怎么能保存信息呢？你不知道该怎么设计，这个问题解决不了你寝食难安，吃饭时在思考、走路时在思考，蹲坑时在思考，直到有一天你在梦中遇一位英国物理学家，他给了你这样一个简单但极其神奇的电路：这是两个NAND门的组合，不要紧张，NAND也是有你设计的与或非门组合而成的，所谓NAND门就是与非门，先与然后取非，比如给定输入1和0，那么与运算后为0，非运算后为1，这就是与非门，这些不重要。比较独特的是该电路的组合方式，一个NAND门的输出是两一个NAND门的输入，该电路的组合方式会自带一种很有趣的特性，只要给S和R段输入1，那么这个电路只会有两种状态:要么a端为1，此时B=0、A=1、b=0；要么a端为0，此时B=1、A=0、b=1;不会再有其他可能了，我们把a端的值作为电路的输出。此后，你把S端置为0的话(R保持为1)，那么电路的输出也就是a端永远为1，这时就可以说我们把1存到电路中了；而如果你把R段置为0的话(S保持为1)，那么此时电路的输出也就是a端永远为0，此时我们可以说把0存到电路中了。就问你神奇不神奇，…

CPU 系统级验证 —— 指令集验证 ——OpenHW core-v 验证环境及文件分析
type: item
date: 2026-01-08T11:07:05+08:00
description: 本文记录的相关源工程和文件为：core-v RISCV 核功能验证工程：https://github.com/openhwgroup/core-v-verifcore-v 验证策略：https://core-v-docs-verif-strat.readthedocs.io/en/latest/#core-v 系列核 cva6 工程：https://github.com/openhwgroup/cva6core-v 系列核 cv32e40p 工程：https://github.com/openhwgroup/cv32e40pLowRISCV Ibex 核工程：https://github.com/lowRISC/ibexcore-v RISCV 核相关说明文档：https://github.com/openhwgroup/core-v-docsRISCV ISA 指令流（instruction stream）生成器：https://github.com/openhwgroup/force-riscvcore-v 系列指令流（instruction stream）生成器：https://github.com/openhwgroup/core-v-isgsail 语言介绍：https://www.cl.cam.ac.uk/~pes20/sail/REMS 的 sail RISCV 开源项目：https://github.com/rems-project/sail-riscvopenHW 全称为 open-source hardware，是一个支持开源软件和硬件的非盈利组织。该组织开源的内容包括开源 CPU 核、相关 IP、工具和软件等。指令集验证指令集验证的需求能够使用操作数产生合法的基本整数运算指令在指令执行完成后能够检查通用寄存器的状态指令执行完成后能检查副效应，例如溢出等。指令集验证内容指令集的验证需要验证工程师思考该指令需要测试的特征是什么，为了确保指令的正确执行需要检查的内容是什么，为了确保该特征被测试需要进行哪些激励和配置等。验证的充不充分取决于验证人员对 CPU 微架构的理解和风险应对能力。（1）RISCV 基本指令定向测试设计出来的 CPU 首先需要兼容 RISCV 基本指令，即需要满足 RISCV 基本整数指令及相关标准指令集。主要测试的内容有：溢出检测及相关标志位下溢检测及相关标志位无指令执行的副效应，比如异常的通用处理寄存器变化，异常的条件代码使用 x0-x31 作为 rs1/rs2使用 x0-x31 作为 rdx0 寄存器的值始终为 0set/clear 所有立即数的比特位set/clear 源寄存器 rs1/rs2 的比特位根据 7/8 两条 set/clear 目的寄存器 rd 的比特位（2）自定义扩展指令定向测试对于自定义扩展指令集的验证，该验证需要修改相关的工具链并通过相关测试验证工具链的修改成功，再进行（1）中的测试。（3）随机约束测试对进行大量的随机指令测试指令集验证激励的种类指令集测试激励分为自检（self-checking）和预存（pre-existing）两种。自检测试激励运行时按照源文件中指令顺序依次，并同时将指令执行结果和参考值作检查，若出错则程序跳转到 fail，打断正常执行顺序，立即执行完成。类似的测试集有 riscv-tests、riscv-compilance-tests 等预存测试激励运行时不会打断执行顺序，执行的结果会和指令集模拟器（ISS）的结果作对比，最终统计对比的结果。类似的测试集有 riscv-dv 等指令集验证 pass/fail 的标志测试的 pass/fail 与上述激励的种类有关self checking：自检性质的测试激励在每条指令执行时就会同时将结果和参考值作对比，若失败则跳转到 failsignature check：特征检查，相对自检来说更加复杂深入。测试的结果将被用来计算该指令的某个特征，这将会和预先确定好的较标准特征作对比。采用该检查的为 riscv-complience-tests。check against ISS：与指令集模拟器对比检查。该情况下，testcase 并不知道测试的参考值，仅仅给 DUT 提供激励，testbench 会对比 DUT 和 ISS 的输出结果确定测试的 pass/fail。该检查较被经常使用，因为它是的 testcase 更加简单。采用该检查的如 riscv-dvcheck against RM：与参考模型对比检查，该检查方式与第三点类似，但相对 ISS 更加通用。通常用作 ISS 检测的补充。assertion check：通过断言判断是否执行出错。相关 CPU 核的验证工程cv32e40pCV32E40P (…

推荐一款好用的IC设计中生成register model的工具
type: item
date: 2026-01-07T14:07:00+08:00
description: 无意中发现一个开源的工具，使用systemRDL文件作为输入，可以生成寄存器相关的RTL module，UVM中使用的regmodel，C和verilog的头文件(包含寄存器某个字段的偏移以及mask bits)，以及html的文档。资源如下：https://github.com/zhajio1988/Open_RegModel生成的html文档示例如下：https://systemrdl.github.io/RALBot-html————————————————版权声明：本文为CSDN博主「XtremeDV」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。原文链接：https://blog.csdn.net/zhajio/article/details/102620859开源uvm reg model (UVM 寄存器模型)生成工具open-register-design-toolOrdt is a tool for automation of IC register definition and documentation. It currently supports 2 input formats:SystemRDL - a stardard register description format released by Accellera.orgJSpec - a register description format used within Juniper NetworksThe tool can generate several outputs from SystemRDL or JSpec, including:SystemVerilog/Verilog RTL code description of registersUVM model of the registersC++ models of the registersXML and text file register descriptionsSystemRDL and JSpec (conversion)Easiest way to get started with ordt is to download a runnable jar from the release area.Ordt documentation can be found here.注：nvdla中使用SystemRDL格式描述寄存器模型，并使用jar xxx ordt.jar ......生成uvm reg model————————————————版权声明：本文为CSDN博主「XtremeDV」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。原文链接：https://blog.csdn.net/zhajio/article/details/82870523

IPYXACT：Python 中的 IEEE-1685 (IP-XACT) 处理工具
type: item
date: 2026-01-07T14:06:36+08:00
description: IPYXACT：Python 中的 IEEE-1685 (IP-XACT) 处理工具项目介绍IPYXACT 是一个基于 Python 的库，旨在简化对 IEEE-1685 标准（通常称为 IP-XACT）的支持。这一标准定义了用于描述集成电路知识产权（IP核）元数据的 XML 方式。IPYXACT 提供了解析、操作及生成 IP-XACT 描述文件的能力，对于那些需要处理或创建 SoC 设计中IP组件描述的软件开发人员和硬件工程师来说非常有用。项目快速启动要快速开始使用 IPYXACT，首先确保你的环境中已经安装了 Python 3.6 或更高版本。然后，通过以下命令将项目添加到你的环境：pip install ipyxactbash接下来，尝试简单的示例来体验其基本功能： from ipyxact.ipyxact import Component # 创建一个新的组件实例 comp = Component() compvendor = comp.component_vendor compvendor.name = "Example Vendor" compvendor.description = "A demonstration component" # 保存这个组件到XML文件 with open("example.xml", "wb") as f: comp.write_xml(f) code here...这段代码创建了一个最简化的 IP-XACT 元数据结构并保存到了一个 XML 文件中。应用案例和最佳实践在设计复杂的SoC时，IPYXACT可以极大地帮助管理IP核的元数据。例如，当你需要自动化生成IP核的配置界面时，可以通过解析已有IP-XACT描述文件，自动生成对应的配置UI，或者在进行IP复用过程中，验证IP的合规性和一致性。示例：自动构建IP配置界面假设已有一个IP-XACT描述文件，你可以读取该文件来获取IP的信息，然后利用这些信息动态地创建GUI元素。 component = Component.from_file("your_ip.xact") for memory_map in component.memory_maps: for register in memory_map.register_list: # 假设这里会根据register的信息生成GUI控件 print(f"Register: {register.name} at {register.address_offset}") code here...典型生态项目虽然直接相关的“典型生态项目”特定于 IPYXACT 的提及不多，但在嵌入式系统和SoC设计领域，结合使用 IPYXACT 的项目通常与硬件描述语言（如Verilog、SystemVerilog）、EDA工具（如Vivado、Quartus）以及芯片自动化流片流程紧密相关。开发者可能会集成IPYXACT到他们的工作流程中，以自动化生成或验证与IP核相关的文档、配置界面或是用于构建系统的脚本，从而提高整个设计周期的效率和准确性。对于进一步的集成案例和技术堆栈的探索，建议参考 FPGA 开发、ASIC设计社区以及电子设计自动化领域的其他开源和商业解决方案。开发者可以在设计流程的不同阶段利用IPYXACT的标准化信息，促进IP核的重用和管理————————————————版权声明：本文为CSDN博主「申梦珏Efrain」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。原文链接：https://blog.csdn.net/gitblog_00259/article/details/141456709

spi master接口的fpga实现
type: item
date: 2026-01-06T10:24:40+08:00
description: https://www.cnblogs.com/kingstacker/p/7490002.html前言当你器件的引脚贼少的时候，需要主机和从机通信，spi就派上了用场，它可以一对多，但只是片选到的从机能和主机通信，其他的挂机。spi：serial peripheral interface 串行外围接口大致了解：spi是个同步协议，数据在master和slaver间交换通过时钟sck，由于它是同步协议，时钟速率就可以各种变换。sck：主机提供，从机不能操控，从器件由主机产生的时钟控制。数据只有在sck来了的上升沿或者下降沿才传输。高级一点的spi芯片有配置寄存器，高级一点的工作有四种模式，采样相位和sck空闲电平可配置。当然在这里我们主要实现简单的spi协议：sck是系统时钟的四分频，wr请求信号有效时，主机开始工作，数据位8bit，sck空闲时低电平，工作时第一个沿数据传输。只有一个从机，cs低电平片选。看下结构：接口定义：编码实现：（版权所有，请勿用于商业用途，仅供学习使用）//************************************************ // Filename : spi_ms_test1.v // Author : Kingstacker // Company : School // Email : kingstacker_work@163.com // Device : Altera cyclone4 ep4ce6f17c8 // Description : spi master module;data 8bit;sck is 4 div of the clk; //************************************************ module spi_ms #(parameter WIDTH = 8)( //input; input wire clk, input wire rst_n, input wire wr, //send request; input wire [WIDTH-1:0] master_din, //the data you want send; input wire miso, //the data form slave; //output; output reg cs, //slave select; output reg sck, //data exchange clock; output reg mosi, //master out; output reg [WIDTH-1:0] master_dout //the data you received; ); localparam CLK_HZ = 50_000_000; //clk frequency; localparam SCK_HZ = 12_500_000; //sck frequency; localparam DIV_NUMBER = CLK_HZ / SCK_HZ; localparam CNT_MAX = (DIV_NUMBER >>1) - 1'b1; localparam DATA_CNT_MAX = 5'd31; localparam MOSI_CNT_MAX = 3'd7; localparam IDEL = 2'b00; localparam SEND = 2'b01; localparam FINISH = 2'b10; reg cnt; //sck cnt; reg sck_en; //enable sck; reg data_cnt_en; reg sck_reg1; reg sck_reg2; wire sck_p; //posedge sck; wire sck_n; //negedge sck; wire send_over; reg [1:0] cstate; reg [4:0] data_cnt; //cnt the send data; reg [2:0] mosi_cnt; reg [WIDTH-1:0] master_din_reg; reg [WIDTH-1:0] master_dout_reg; //produce sck; always @(posedge clk or negedge rst_n) begin if (~rst_n) begin cnt <= 0; sck <= 1'b0; end //if else begin if (sck_en == 1'b1) begin if (cnt == CNT_MAX) begin cnt <= 0; sck <= ~sck; end else begin cnt…

systemverilog interface
type: item
date: 2026-01-04T16:53:00+08:00
description: systemverilog interface普通的模块使用法：注意我们这里只实现了部分功能。。。。不是完全的读写模块。。。。module mem_core( input logic wen, input logic ren, output logic mrdy=1, input logic [7:0] addr, input logic [7:0] mem_din, //写进mem output logic [7:0] mem_dout, //从mem读出 output logic status, input logic clk);logic[7:0] mem [7:0]; //初始化一个meminitial $readmemh("d:/init.txt",mem); //d:/init.txt 文件中是 @01 10 。//或者 assign mem [2'h01]=8'b00000111; 注意这里一定要用 initial 或者assign等语句，不能直接=task reply_read(input logic [7:0] data, integer delay); #delay; @(negedge clk) mrdy=1'b0; mem_dout=data; //从图中可看出这两句话几乎同时执行。 @(negedge clk) mrdy=1'b1;endtaskalways@(negedge ren) reply_read(mem[addr],10);endmodulemodule cpu_core( output logic wen=1, output logic ren=1, input logic mrdy, output logic [7:0] addr=0, input logic [7:0] cpu_din, output logic [7:0] cpu_dout, output logic status=0, input logic clk);task read_memory(input logic [7:0] raddr, output logic [7:0] data); @(posedge clk); ren=1'b0; addr=raddr; @(negedge mrdy); @(posedge clk); data=cpu_din; ren=1'b1; endtaskinitial beginlogic[7:0] read_data; read_memory(2'h01, read_data); $display("Read Result", $time,read_data);endendmodulemodule top; logic mrdy,wen,ren; logic[7:0] addr,d1,d2; wor status; logic clk=0;mem_core mem(., .mem_din(d1), .mem_dout(d2)); //采用对同名的信号做默认连接 cpu_core cpu(.*, .cpu_din(d2), .cpu_dout(d1));initial for(int i=0;i<=255;i++) #1 clk=!clk;endmoduleSystemverilog interface另外，ＳｙｓｔｅｍＶｅｒｉｌｏｇ引入一个重要的数据类型：ｉｎｔｅｒｆａｃｅ。其主要作用有两个：一是简化模块之间的连接；二是实现类和模块之间的通信；随着复杂度的提高，模块间互联变得复杂，SV引入接口，代表一捆连线的结构，具有智能同步和连接功能的代码；接口（ｉｎｔｅｒｆａｃｅ）为硬件模块的端口提供了一个标准化的封装方式。用ｉｎｔｅｒｆａｃｅ来封装接口的信号和功能。ｉｎｔｅｒｆａｃｅ的定义是独立于模块的，通过关键字ｉｎｔｅｒｆａｃｅ和ｅｎｄｉｎｔｅｒｆａｃｅ包起来。此外，ｉｎｔｅｒｆａｃｅ里面还可以带时钟、断言、方法等定义。 一个interface 也可以有input,output或是inout端口。当interface例化时，只有当变量或是线网声明在一个interface的端口列表中才能通过名字或是位置来互连.一种新加的和interface有关系的构造体是Modport 。它提供了module的interface端口和在特定的module中控制task和function使用的方向性信息。这些端口的方向可以在module中可以看到。接口使用无信号的连接方式。Modport将接口中信号分组并指定方向。就像下图中的黑色矩形块里面一样，黑盒，我们从外面看并不关心Modport的定义，只需要考虑clk。Systemverilog interfaceinterface membus(input l…

emmc和ufs的区别_ufs和emmc使用差别
type: item
date: 2025-12-31T14:04:36+08:00
description: 什么是eMMC和UFS？ 日常选机大家往往关注64GB、128GB等存储空间，却很少像选笔记本关注SSD一样关注手机闪存规格。首先手机储存容量、固态硬盘（SSD）、U盘和SD卡等使用的都是一种叫做NAND的储存介质，NAND闪存是一种非易失性存储技术，即断电后仍能保存数据。它的发展目标就是降低每比特存储成本、提高存储容量。 无论是eMMC还是UFS都是在NAND存储芯片的基础上，再加上了控制芯片，接入标准接口，进行标准封装，形成一个高度集成的储存模块。 手机闪存的设计概念，就是为了简化手机内存储器的使用，将NAND Flash芯片和控制芯片设计成1颗MCP芯片，手机客户只需要采购芯片，不需要处理其它繁琐的NAND Flash兼容性和管理问题。 eMMC和UFS都是面向移动端闪存的标准，其中eMMC全称为“embedded Multi Media Card”，即嵌入式的多媒体存储卡，eMMC从eMMC4.3一路发展到4.4、4.5直到现在的5.0、5.1，传输速度也从50MB/s一路狂飙到200MB/s直到现在eMMC5.1的600MB/s，不过实际使用中读取速率都会低于低于理论值，比如搭载eMMC5.1的手机一般读取速度在250MB/s。 不过对于eMMC来说600MB/s已经是极限，通过并行接口提升接口速率越发困难，接口串行提供了更高速率的可能，这就是后来的UFS标准。UFS使用高速串行接口替代了并行接口，改用了全双工方式，收发数据可以同时进行。 相比eMMC，JEDEC发布了全新的USF 2.0标准在接口速率上提升不少，全新的USF 2.0有两个版本，其中UFS 2.0 HS-G2的理论带宽为5.8Gbps，大约740MB/s，更快速的UFS 2.1 HS-G3的理论带宽更是达到了11.6Gbps，约1.5GB/s。 emmc和ufs的区别_ufs和emmc使用差别 上面这张图很好的反映出了eMMC和UFS两种规格之间的速率差异，而关于手机闪存带宽的提升并没有停止，根据路线图，明年我们有望在手机上UFS3.0的身影，其带宽峰值将超过2.4GB/s。 截至目前，大多数手机会采用eMMC存储接口，但是我们看到eMMC本身存在速率瓶颈，比如不能同时读写，也就是我们在连接电脑导图片的时候，并没有办法同时往手机拷贝数据，另外在传一些大体积的数据时，往往带宽的限制会很慢。 emmc和ufs的区别_ufs和emmc使用差别 而UFS2.X接口无论在性能和速率上都更胜一筹，并真正在改善移动设备的操作体验。如果用一个词来UFS接口带来改善，那就是更快的响应能力。 最新的Android系统已经根据UFS2.0的多线程读取能力进行了优化，一个最直观的变化是我们的手机在读取文件上花费的时间会更少，另外打开应用程序的时间也变短，一旦软件开发人员优化各自的App，充分利用UFS，这种移动体验就会持续得到改善。总而言之UFS2.0的存在让我们的手机看起来反应更快。 实测体验ufs和emmc哪个好？ 前面我们提到UFS比eMMC可以提升文件读写速度，应用到实际使用中主要表现为手机解压大型游戏和加载大型游戏的时间会变短。除了这些，使用会更快的UFS接口的手机要比eMMC在实际表现的差异还是比较明显的，下面这段视频可以很清晰的表现出两种规格的差异。 多任务执行响应速度更快 拥有UFS2.0接口手机，LVDS（低压差分信号）有专门串行接口，读写操作同时进行； CQ（命令）队列动态调配任务，无需等待上一进程结束。相反eMMC接口的手机读写必须分开执行，指令也是打包的，在速度上就已经是略逊一筹，在执行多任务时eMMC自然要慢一步。 低延迟，UFS响应速度快3倍 在读取大型游戏以及大体积文件时，UFS2.0所需时间更短，载入一款游戏所需要的时间为eMMC5.0的1/3，相应在体验游戏时UFS2.0的手机延迟更低，画面更流畅。 连续快拍的照片写入更快 UFS和eMMC体验上的区别还在连续拍照上，连续拍照时UFS让照片写入更快，从下面的对比可以看出，不同接口标准的手机在连续拍照时，因为写入速度的限制eMMC拍摄时从按下快门到存储一张照片花费的时间更长，而UFS缩短了存储时间从而可以让我们可以在同一时间内抓拍到更多照片。 相册图片缩略图载入时间更短 这一点相信大家深有体会，很多人的手机装满了几百张甚至上千张照片，当你打开相册的图片缩略图很明显的看到加载的过程，这就是手机在读取闪存中的照片时更不上刷新的速度造成的。优秀的手机屏幕时画面会随着滑动流畅载入，而差一点的手机就会明显体会到加载时的卡顿。 UFS缩略图载入速度更快 速度快了 功耗也更低 UFS接口在提升了速率之后，也就意味着在相同的任务面前它所花费的时间更短，更高的效率意味着更低的功耗。在同时工作的时候UFS的功耗要…

Vscode自动生成verilog例化
type: item
date: 2025-12-31T11:40:08+08:00
description: 前言veirlog模块例化的时候，辣么多的信号端子，手动例化又慢又容易出错，葵花妈妈开课啦，孩子手残老犯错怎么办？当然是脚本一劳永逸，妈妈再也不担心手残党。流程（1）在vscode中安装如下插件。（2）在电脑中安装python3以上的环境。下载地址：https://www.python.org/downloads/release/python-373/安装记得一定要勾选添加路径，记得管理员安装。重启你的电脑。在cmd窗口输入python即可验证是否安装成功！（3）安装chardet。为确保插件可用，这个需要安装。参考链接：https://blog.csdn.net/sinat_28631741/article/details/80483064方式一 源码按照：第一步：下载压缩文件，例如： 'chardet-3.0.4.tar.gz'； 第二步：解压文件到python安装位置下的‘site-packages’目录下，例如：‘D:\python2.7\Lib\site-packages’； 第三步：打开终端命令窗口，进入解压的‘chardet’目录下，执行命令：python setup.py install （4）修改插件的原始py文件，觉得开发者的py有瑕疵，让帅气的同事重新整了个，把以下代码替换进原始py文件即可。在打开v文件的vscode下按ctrl+p，输入instance可出现下述界面。替换此py文件的代码即可。 #! /usr/bin/env python ''' vTbgenerator.py -- generate verilog module Testbench generated bench file like this: fifo_sc #( .DATA_WIDTH ( 8 ), .ADDR_WIDTH ( 8 ) ) u_fifo_sc ( .CLK ( CLK ), .RST_N ( RST_N ), .RD_EN ( RD_EN ), .WR_EN ( WR_EN ), .DIN ( DIN [DATA_WIDTH-1 :0] ), .DOUT ( DOUT [DATA_WIDTH-1 :0] ), .EMPTY ( EMPTY ), .FULL ( FULL ) ); Usage: python vTbgenerator.py ModuleFileName.v ''' import random import re import sys from queue import Queue import chardet def delComment(Text): """ removed comment """ single_line_comment = re.compile(r"//(.*)$", re.MULTILINE) multi_line_comment = re.compile(r"/\*(.*?)\*/", re.DOTALL) Text = multi_line_comment.sub('\n', Text) Text = single_line_comment.sub('\n', Text) return Text def delBlock(Text): """ removed task and function block """ Text = re.sub(r'\Wtask\W[\W\w]*?\Wendtask\W', '\n', Text) Text = re.sub(r'\Wfunction\W[\W\w]*?\Wendfunction\W', '\n', Text) return Text def findName(inText): """ find module name and port list""" p = re.search(r'([a-zA-Z_][a-zA-Z_0-9]*)\s*', inText) mo_Name = p.group(0).strip() return mo_Name def paraDeclare(inText, portArr): """ find parameter declare """ pat = r'\s' + portArr + r'\s[\w\W]*?[;,)]' ParaList = re.findall(pat, inText) return ParaList def portDeclare(inText, portArr): """find port declare, Syntax: input [ net_type ] [ signed ] [ range ] list_of_port_identifiers return l…