- 博客(252)
- 资源 (63)
- 收藏
- 关注
原创 IC开发——数字电路设计简介
我们说的数字电路,一般是指逻辑数字电路,即通过逻辑门组合成的电路,也即我们常说的逻辑IC。IC除了逻辑IC之外,还有模拟IC,存储IC等。IC设计,需要学习数字电路,需要学习Verilog/VHDL等设计语言,需要学习使用相关EDA,看起来非常难。IC设计是很难,但是简单的入门并没有那么难。
2024-10-11 15:12:45 850
原创 Chisel开发Diplomacy框架
Diplomacy是一个参数协商框架,用于生成参数化的协议实现。在传统的IC设计中,如何更好地复用已有模块呢?如在Verilog中,在复用一个模块时,如果线宽不一致,需要手动修改模块的线宽,如果模块中内嵌多个模块时,每个关联模块的线宽都需要修改。如果修改不完全时,编译时就会出错。Chisel作为一个更灵活的HDL,如何更好地解决这个问题呢?这就是Diplomacy提出的初衷。Diplomacy将模块的Port抽象为节点(Node),然后来进行协商,自动找到最优的线宽,以减少复用模块时需要修改的线宽代码。
2024-09-16 12:00:00 787
原创 Chisel Style Guide
Chisel Style Guide是一份简单的代码编写指南,统一编码风格以及遵循一些Chisel的最佳实践统升团队对代码的可读性,提升代码质量。因为输入的Verilog的命名与Chisel命名有关,所以Chisel中的一些命名参考了Verilog编码规范。因为Chisel编译器在生成Verilog时,会在变量中添加下划线,所以Chisel强烈不建议用户以全小写下划线的风格命名变量。可以将长组合逻辑分解为时序逻辑电路。枚举、派生、参数化、函数式编程等高级特性的运用,可以提升代码的表达能力,提升编码效率。
2024-09-15 21:00:00 909
原创 IC开发——Verilog简明教程
Verilog 是一种用于数字电路设计和建模的硬件描述语言(HDL),广泛应用于电子工程领域。它提供了一种方便的方法来描述电子系统的结构和行为,使得设计、仿真和验证过程更加高效
2024-09-14 12:45:00 1174
原创 Chisel简明教程
Chisel(Scala嵌入式硬件构造语言)是一种嵌入在高级编程语言Scala中的硬件构造语言。Chisel是一个特殊类定义、预定义对象和Scala内部使用约定的库,因此当你编写Chisel代码时,实际上是在编写一个构建硬件图的Scala程序。随着经验的积累并希望使代码更简洁或更可重用,利用Scala语言的潜在强大功能变得很重要。它是由加州大学伯克利分校的 ADEPT 实验室开发的。Chisel结合敏捷开发,非常适合编写RTL。
2024-09-13 15:23:54 1132
翻译 本周小贴士#229:模板元编程的分级重载
既然你已经学会了这种令人很棒的能力,请记住要谨慎使用它。正如我们在absl::string_view重载中看到的那样,泛型编程很微妙,可能导致意想不到的结果。
2024-08-30 19:54:24 89
原创 IC开发——RTL综合
Verilog 是硬件描述语言,就是用代码的形式描述硬件的功能,最终在硬件电路上实 现该功能。在Verilog描述出硬件功能后需要使用综合器对Verilog代码进行解释并将代码转化成实际的电路来表示,最终产生实际的电路,也被称为网表。这种将Verilog代码转成网表的工具就是综合器。verilog的代码是否能够综合成实际的电路,综合成的实际电路是否符合要求。都需要通过综合来验证。
2024-07-31 22:21:25 855
原创 IC开发——Verilator
Verilator 是一个开源的 Verilog 和 SystemVerilog 硬件描述语言 (HDL) 仿真器。它是一个高性能的仿真器,可以将 Verilog 和 SystemVerilog 代码转换为 C++/SystemC 代码,并生成可执行的仿真模型。高性能:Verilator 生成的仿真模型具有非常高的性能,可以与商业级仿真器媲美。开源:Verilator 是一个开源项目,可以免费使用和修改。
2024-05-28 11:48:33 1533
原创 IC开发——verdi基本用法
VCS和Verdi这两个工具,这两个工具目前都属于synopsys公司。VCS主要负责编译运行Testbench和RTL,并负责生成相应的波形文件。而verdi主要负责加载波形文件,查看信号的波形及其对应的代码来进行调试验证。Verdi最开始是由novas公司设计的,在2008年,被台湾的EDA厂家springsoft(源笙)收购了。在2012年,synopsys收购了spring soft公司,所以此时Verdi才正式属于synopsys。
2024-05-28 10:46:39 5140
原创 IC开发——VCS基本用法
VCS是编译型verilog仿真器,处理verilog的源码过程如下:VCS先将verilog/systemverilog文件转化为C文件,在linux下编译链接生成可执行文件,在linux下运行simv即可得到仿真结果。VCS使用步骤,先编译verilog源码,再运行可执行文件:编译命令的格式:vcs sourcefile [compile_time_option] (编译选项用来控制编译过程)执行仿真命令格式:./simv [run_time_option]
2024-05-28 10:43:53 4124
原创 IC开发——Ubuntu安装VCS2018
VCS是一种常用的Verilog仿真和综合工具,由Synopsys公司开发。它提供了一个完整的设计验证环境,用于验证硬件设计的正确性和性能。仿真功能:VCS支持基于事件驱动的数字电路级仿真,能够准确地模拟设计中的信号传输和电路行为。它可以处理大型设计,并提供高效的仿真方式和快速的仿真速度。综合功能:VCS还提供了综合功能,允许将Verilog描述的设计转换成门级电路,在后端流程中进行布局和布线以及时序优化。
2024-05-28 10:42:06 2003 1
翻译 本周小贴士#227:小心空容器和无符号算术
正如风格指南所说,在C++中对无符号类型进行算术运算时要小心。记住,容器.size()产生一个无符号类型。偏好可以尽可能在局部验证正确性的代码。尽量使代码直接对应于底层意图。
2024-04-18 18:13:22 58
原创 Visual Studio调试C/C++指南
前言Visual Studio(VS)是微软开发的一款集成开发环境(IDE)软件,支持C/C++、C#、VB、Python等开发语言,开发桌面、Web等应用程序。VS功能极其强大,使用极其便利,用户数量最多,被誉为"宇宙第一IDE"。熟悉地掌握基于VS的C/C++调试技术,可以大幅提升调试性能。随着VS版本的更新,其功能越来越强大,本文的内容是基于VS2019进行验证测试的,之前版本VS可能有少量特性不支持。基础。
2024-04-18 13:24:13 4671
原创 人工智能——大语言模型
一千行代码实现一个完整的可训练和推理的60亿参数的大语言模型,去魅人工智能,去魅大语言模型。本文重在介绍机器学习和大语言模型的基本原理。在科学研究上,机器学习和大语言模型的每一个环节都可以优化研究。如何提升训练的效率,降低训练过程中的过拟合是大语言模型的关键,Transformer的出现为大语言模型的可行性提供了技术支持,OpenAI的chatgpt的出现,证明了加大模型参数可以让模型的能力出现质的提升。大语言模型未来将会继承发展,会让人工智能走进世界每一个角落。几百行代码实现大语言模型。
2024-04-09 19:01:01 5218
原创 人工智能——深度学习
深度学习是一种基于人工神经网络的机器学习方法,其核心思想是通过多层次的神经网络来模拟人脑的神经元之间的连接。深度学习的特点是可以通过大规模的数据来训练模型,并且可以自动学习到数据的特征表示。上图就是一个神经网络的基本结构图,X1到Xn是输入,O1到Oj是输出,圆圈是神经元(也称感知机),连线带权重参与计算生成下一个神经元。隐层在实际的神经网络中可能会多层,并且都是全连接,所以计算量巨大,所以需要AI CPU、AI GPT等。
2024-04-09 18:58:18 2500 1
原创 人工智能——机器学习概述
上面的列举也不全,生物的结构蛋白、化学的合成材料,早期的这些都是靠烧钱不停地实验来进行。我们可以看到这个函数是关于a和b的一个三维曲面,这里我们可以分别对a和b求偏导,再设置偏导为0即可以得出两个a和b的方程,然后即可求出最小误差平方和对应的a和b,即得到这线性拟合方程的完整表达式。人工智能(Artificial Intelligence,AI),是新一轮科技革命和产业变革的重要驱动力量, [26]是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。
2024-04-09 18:56:08 3212
翻译 本周小贴士#224:避免使用vector.at()
在索引容器时,请注意我们处于哪种情况:索引是否是"按构造确定的",还是代码需要检测和处理无效的索引?在这两种情况下,我们都可以比使用基于异常的std::vector::at() API更好。类似的思考也适用于其他基于异常的API,如std::optional::value()和absl::StatusOr::value()(参见Tip#181)。对于非并发的C++代码中的错误处理,请优先进行"查看后跳转" - 然后,在检查了一切都正常之后,避免使用包含自身检查的API。
2024-03-28 18:10:32 139
原创 嵌入式开发——基础电路知识
驱动能力、负载能力、逻辑电平、三态输出、推挽输出、开漏输出、上拉电阻、下拉电阻、高通波滤、低通波滤、电源去耦电路、阻抗匹配、差分信号、MOS管与继电器、RS232和RS485、译码器、UART/IIC/SPI、模拟信号和数字信号眼图、真实U盘电路讲解。
2024-03-27 16:09:57 3633
原创 嵌入式开发——基础元器件
差分线的好处是,如果传输的信号受干扰,那么两个差分线就同时受干扰,两个信号会同时变化,那么两个信号的幅值差就会近似不变的,利用幅值差来表示信号就可降低干扰。电流表是串联接入电路的,电流表的内阻很小,一般为几mΩ,这样电流表接入电路对电源的外部负载影响很小,所以测量的电流近似于真实值。Vdd,IC的设备电压,在NAND Flash中,与Vccq等同,用于数据传输存储,为了降低功耗,其电压从早期的5V到后来的3.3V, 1.8V甚至1.2V。Vcc,IC的工作电压,主要用于控制IC内部的各种逻辑。
2024-03-27 15:45:36 1325
原创 NVMe开发——NAND Flash的基本原理
当栅极(Gate)和P型衬底接通电源时,因为电场的缘故,P型半导体中的电子都往氧化绝缘层靠近,当绝缘层附近的电子足够多时,两个N型半导体之间的电子通道(N沟道)就形成了,两个N型半导体和中间的电子通道相当于一整个N型半导体。读0和读1会有两个阈值电压,先在栅极施加读0的阈值电压,检测是否导通,如果导通,输出1,结束。擦除之后读,因为浮栅层的电子全部释放回了P型半导体中,这时在控制栅加10V电压,P型半导体中的电子会聚集到N型半导体之间形成电子通道,源极和漏极之间接上电源,会导通,此时表示读到‘1’。
2024-03-22 17:47:11 2085
原创 C/C++代码性能优化——编程实践
主要针对嵌入式C/C++,性能优化编程技巧,参数传递、函数返回、循环展开、查表、位域、尾递归、位运算、0数组、分支预测、异步计算、事件驱动架构、AI。其他性能负优化的示例。
2024-03-22 17:43:28 1269
原创 C/C++代码性能优化——数据结构和算法
数据结构,数组、链表、块状链表、栈、堆、队列、二叉树、红黑树、B树、B+树、跳表、索引、哈希表、图的应用场景和性能比较。 常用排序算法、查找的应用场景和性能比较,其他通用算法应用场景介绍。
2024-03-22 17:40:14 1354
原创 C/C++代码性能优化——编译器和CPU
在现代软件开发中,性能优化至关重要,尤其是在资源受限的系统和处理大量数据的应用程序中。C/C++ 作为低级编程语言,提供了对底层硬件的直接访问,使其成为性能关键应用程序的理想选择。然而,编写高效的 C/C++ 代码是一项具有挑战性的任务,需要对语言特性、编译器优化、硬件架构、数据结构和算法有深入的理解。本文旨在为 C/C++ 程序员提供一个全面的指南,涵盖各种优化技术,以提高代码性能,重在指南引导,不讲细节。
2024-03-22 17:35:48 2400
原创 NVMe开发——PCIe配置空间和地址空间
PCIe支持不同功能的设备,不同的设备其需要操作的内存大小也不同,为了更方便地实现这一种,BAR(Base Address Registers)产生了。为此,提出了一个新的增强配置访问机制,即将每个功能的配置空间映射到设备的256MB空间中,按4K对齐来分配访问。PCI的256字节信息不够PCIe使用,所以PCIe在此基础上将配置空间扩展到4K字节,如下图中列出了一些主要的扩展寄存器。Capabilities是一组描述PCIe设备功能相关的结构,它是一个链式的结构,一个指向下一个,直到最后。
2024-03-04 18:04:27 3465 1
原创 NVMe开发——PCIe复位
简介PCIe中有4种复位机制,早期的3种被称为传统复位(Conventional Reset)。传统复位中的前2种又称为基本复位(Fundamental Resets),分别为冷复位(Cold Reset),暖复位(Warm Reset)。第3种复位为热复位(Hot Reset)。第4种复位被称为功能级复位(Function Level Reset),出现在PCIe 2.0规范中。传统复位。
2024-03-01 19:39:01 3199
原创 NVMe开发——PCIe电源管理
PCIe电源管理详细描述了与PCI总线PM接口规范和高级配置和电源接口(ACPI)兼容的PCIe功耗管理。PCIe定义了对PCI-PM规范的扩展,主要关注链路电源和事件管理。还概述了OnNow计划、ACPI以及Windows操作系统的相关性。
2024-03-01 19:35:49 2962
原创 NVMe开发——PCIe基础
PCI(Peripheral Component Interconnect),外设组件互连。PCI是一种并口总线标准,对比其之前的其他总线,PCI因其速度快、支持即插即用,中断共享等特性,占领计算机总线标准近20年。随着CPU以及外设的速度要求越来越高,PCI总线愈发显得有心无力。PCI因为是并口,在高速信号传输中,因为信号质量问题,以及信号同步问题,并口解决这些问题的成本高,难以为继。在这个时候,PCI的替代者PCIe出现了。
2024-03-01 19:28:37 2062
原创 NVMe开发——MTBF介绍
NVM存储器的失效率是如何评估的呢?阿伦尼乌斯公式如何得来的?半导体加速因子又是如何计算的?MTFS计算公式又是如何推导出来的?
2024-02-26 18:12:58 2047
原创 GCC工具链简介
想编译各种嵌入式裸机的,想编译Linux Kernel,又或者想编译u-boot的,或者想编译运行在KylinOS上,甚至想编译运行在Android上的C代码,该选择哪个gcc版本呢?MinGW和gcc什么关系?ARM下几种gcc有什么区别?RISC-V内核又该如何选择GCC工具链呢?gcc不同版本的头文件、动态库等兼容性如何呢?选择了正确的gcc版本,又是如何编译安装呢?下载arm gcc时,经常会遇到Linaro,那么Linaro与arm、gcc是什么关系呢?gdb-multiarch?
2024-02-26 17:49:55 1864
原创 QEMU开发入门
QEMU开发,对于分析Linux内核帮助非常多。目前电脑上的手机模拟器、还有各种虚拟机技术也基本都是基于qemu进行扩展开发的。文章得比较详细,并提供包括固件和qemu的完整测试代码:1. Windows、Linux下的编译、安装qemu。2. 基于qemu,用VSCode单步调试单片机系统的Cortex-m、RISC-V固件代码。3. 基于qemu,用VSCode单步调试Linux Kernel代码。4. 扩展qemu,给RISC-V添加了一个自定义的uart设备,并演示如何在固件中使用这个uart来输出
2024-02-23 18:55:33 2858
原创 适用于嵌入式单片机的压缩算法
不同的压缩算法,有不同的应用场景。1. 高压缩率,压缩速度慢,但是解压速度快的算法,适用于Bootloader。高压缩率,可以节省ROM空间,高解压速度对Boot速度影响小。因为是外部工具压缩,压缩速度不影响Bootloader的功能。适用于此场景的压缩算法有lzo、lz4hc。2. 追求压缩率,且算力和内存资源充足,并且压缩和解压均不错的算法,选择DEFLATE。3. 有一定的压缩率(50%),追求压缩和解压速度,且算法相对简单,优先LZ4,再选择LZ77,再先LZO.
2024-02-03 17:49:40 7425
原创 ext4文件系统解析
写文件操作时,除了更新Data区处,还会相应更新GDT、Inode Bitmap、Block Bitmap、目录区、Inode Table区。● 针对小于480MB的文件,GDT、目录区、Inode Bitmap,更新较少。Block Bitmap会不停记录使用了的Block,更新较多,Inode Table会不停记录已经使用了的Block数,也更新较多。● 针对超过480MB的文件,尤其是更大的文件,其会启用extent子节点表。
2024-02-01 17:33:40 5576
原创 NTFS文件系统解析
MFT表项记录着文件的相关属性,有常驻属性(比较小),有非常驻属性(数据较大,此属性只记录真实数据的索引)。Bitmap和LogFile一般都超过1K,都是记录在MFT的非常驻DATA属性中。MFT表项由MFT_HEADER+多个属性项构成。NTFS文件写操作过程中,最常修改的文件系统内容分别为:MFT、Bitmap、LogFile,其次是DBR区的一些其他元文件如MFTMirror和MFTMirror和MFTMirror和AttrDef等。
2024-02-01 16:51:01 2122
原创 MSVC++远程调试
MSVC++的调试功能非常强大,可以下断点,单步调试,查看堆栈变量信息等。实际用于生产的电脑环境复杂,更容易发生Bug。生产电脑,由于各种原因有些可能无法安装MSVC用来现场调试。基于打印日志,查看日志的方式来分析,一些简单的问题可以解决,但是一些复杂的问题,尤其是语法问题,还是在线调试更方便。针对上述情形,跨电脑的远程调试就出现了,完美解决上述问题。远程调试,一台生产电脑,一台开发电脑,共同接入一个局域网。开发电脑远程连接生产电脑,然后就像调试本地程序一样调试运行于生产电脑上的程序。
2024-02-01 16:03:04 938 1
原创 C++20新语法
在C++20标准中,允许Lambda表达式使用 [=, this] 这样的语法进行捕获。这种语法称为“复合捕获”(compound capture),表示同时对this指针和所有父作用域的自动变量进行值捕获。具体来说,当我们使用 [=, this] 进行复合捕获时,Lambda表达式会自动捕获当前对象的this指针,并以值的方式复制到Lambda表达式的闭包中。与此同时,Lambda表达式还将自动捕获所有父作用域中的自动变量,并以值的方式复制到闭包中。
2024-01-31 19:10:37 1686
翻译 本周小贴士#218:用FTADLE设计扩展点
这篇翻译讲述了在C++中关于扩展点机制的设计问题以及引入FTADLE(Friend Template with ADL Extension)模式来解决这些问题。文章首先提到了一些常见的扩展点机制,如虚函数、成员函数检查和模板特化,并指出它们各自存在的问题和局限性。接下来,文章详细介绍了FTADLE模式的设计原理和优势。通过使用友元函数模板和ADL(Argument-Dependent Lookup)机制,FTADLE模式可以实现可扩展性、灵活性和低耦合度。它能够避免类层次结构的僵硬性和对用户的依赖,同时
2023-12-01 22:00:00 152
翻译 本周小贴士 #215:使用AbslStringify()将自定义类型转换为字符串
Abseil现在包含一个新的轻量级机制,AbslStringify(),允许用户将用户定义的类型格式化为字符串。使用AbslStringify()扩展的用户定义类型可以与absl::StrFormat、absl::StrCat和absl::Substitute无缝配合使用。与大多数类型扩展一样,您应该拥有要扩展的类型。
2023-11-16 19:11:45 266
原创 Python编程——模块、包和__init__.py
Python中的一个文件即为一个模块(Module),一个模块引用另外一个模块的变量、函数或类时,使用import来导入。模块名即文件名。如fibo.py那么在main.py文件中如下使用fibo模块。或者直接导出指定函数,此方法可能导致同名函数被覆盖导致代码异常。
2023-11-10 18:50:32 773
翻译 本周小贴士#198:标签类型
作为TotW#198最初发表于2021年8月12日由Alex Konradi创作Foo既不可移动也不可复制,但它是可构造的,例如Foo f(1, 2);。这很棒,但是如果std::optional被声明为const,那么我们无法调用emplace()怎么办?等等,std::in_place是什么意思?如果我们查看std::optional的文档,可以看到其中一个重载函数接受std::in_place_t作为第一个参数,以及其他参数的列表。
2023-10-05 17:34:24 145
原创 pytest简明教程
pytest是一款基于Python的测试框架。与Python自带的unittest相比,pytes语法更加简洁,断言更加强大,并且在自动测试以及插件生态上比unittest都要更加强大。
2023-09-22 19:35:02 981
System Verilog.zip
2021-12-21
protobuf-3.0.0-alpha-2.zip
2021-12-15
TestProperyGrid.zip
2021-12-15
TinyCC的VS2010编译工程
2021-04-28
基于 Visual studio 和虚拟机的驱动调试.pdf
2020-08-07
A Beginner's Guide to SSD Firmware
2024-01-17
JEDEC JESD22-A117E:2018 电可擦除可编程 ROM (EEPROM)
2022-12-13
UNH-IOL-NVMe-MI-Conformance-Test-Suite-v15.0
2022-12-05
VS2010单元测试的coverage文件转换为xml文件源代码
2022-05-19
apt-get安装包f
2022-05-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人