按键消抖
按键消抖
奇偶分频
偶分频和奇分频
阻塞赋值与非阻塞赋值
阻塞赋值与非阻塞赋值阻塞赋值:
首先中间变量 in_reg 一定要等待复位被释放后且第一个时钟上升沿来到时才会被赋值为输入信号 in 的值,所以会比输入信号 in 延迟一拍,而中间变量 in_reg 和输出信号 out 却没有延迟一拍的关系了,而是在同一时刻同时变化的,因为我们使用的是阻塞赋值,也就是说只要赋值号右边的表达式的值有变化,赋值号左边的表达式的值也将立刻变化,所以我们最终看到的结果是中间变量 in_reg 和输出信号 out 是同时变化的。
非阻塞赋值:
首先中间变量 in_reg 一定要等待复位被释放后且第一个时钟上升沿来到时才会被赋值为输入信号 in 的值,所以会比输入信号 in 延迟一拍,这是和阻塞赋值过程相同的,但是接下来就不一样了,因为我们使用的是非阻塞赋值,也就是说只要赋值号右边的表达式的值有变化,赋值号左边的表达式的值也不会立刻变化,需要等待下一次时钟沿到来时一起变化,所以我们最终看到的结果是输出信号 out 相对于输入信号是打了两拍的关系。
fpga开发流程层次思想Latch
FPGA Verilog 开发流程
使用工具 vivado、 notepad++、 viso
流程:
绘制框图、真值表、波形图
创建vivado项目,创建.v文件
创建tb.v仿真文件
模拟仿真
仿真验证通过后,绑定管脚,上板验证
层次化设计思想:
自底向上和自顶向下:
避免Latch产生
latch危害
NVMe端到端数据保护与NS
NVMe端到端数据保护功能Host与SSD之间数据传输的最小单位是逻辑块(Logcal Block LB),每个逻辑块的大小可以是512/1024/2048/4096字节等,Host在格式化SSD时便确定了逻辑块的大小。数据从Host到NVM 闪存,首先要经过PCIe传输到SSD的控制器,然后控制器把数据写入闪存。反过来,Host想从闪存读取数据,首先SSD控制器从闪存上获得数据,然后经过PCIe将数据传给Host。
Host与SSD之间传输数据的时候由于信道噪声的存在,数据可能出错。SSD内部控制器与闪存之间的数据传输也可能出错,为了保证Host端到闪存端数据传输安全,NVMe提供了一个端到端数据保护。除了逻辑块数据本身,NVMe还允许每个逻辑块带个助理,叫做元数据(Meta Data)。这个助理的职责,NVMe虽然没有明确的要求,但如果数据需要保护,NVMe要求这个助理必须能充当保镖的角色。我们只关心元数据是如何保护逻辑块数据的。NVMe要求每个逻辑块数据的元数据带有以下信息:
其中的”Guard”是16比特的CRC (Cyclic Redundancy Check),它是逻辑 ...
NVMe指令执行详解
NVMe PCIe 指令执行流程详解蛋蛋读NVMe之四 (ssdfans.com)
在上图协议栈中,PCIe定义了下三层,NVMe定义了最上遍的应用层,NVMe+PCIe构成了一个完整的Host与SSD通讯的协议。PCIe与NVMe最直接接触的是传输层。在NVMe层,我们能看到的是64字节的命令,16字节的命令返回状态,以及跟命令相关的数据。而在PCIe的传输层,我们能看到的是TLP (Transaction Layer Packet)。PCIe传输层作为NVMe最直接的服务者,不管你NVMe发给我的是命令,还是命令状态,还是用户数据,我统统帮你放进包裹,打包后交给下一层,让数据链路层继续处理。
我们只关注PCIe传输层,其和NVMe接触最密切,PCIe传输层传输的是TLP包,由包头和数据组成,NVMe传下来的数据都是放在TLP数据部分。为实现不同的目的,TLP可分为以下几种类型:
Configuration Read/Write
I/O Read/Write
Memory Read/write(PCIe传输层基本只用该类型TLP为NVMe服务)
Mes ...
NVMe数据读写
NVMe 数据读写
Host往SSD写数据:
Host如果想往SSD上写入用户数据,需要告诉SSD写入什么数据,写入多少数据,以及数据源在内存中的什么位置,这些信息包含在Host向SSD发送的Write命令中。每笔用户数据对应着一个叫做LBA(Logical Block Address)的东西,Write命令通过指定LBA来告诉SSD写入的是什么数据。对NVMe/PCIe来说,SSD收到Write命令后,通过PCIe去Host的内存数据所在位置读取数据,然后把这些数据写入到闪存中,同时得到LBA与闪存位置的映射关系。
Host从SSD读数据:
Host如果想读取SSD上的用户数据,同样需要告诉SSD需要什么数据,需要多少数据,以及数据最后需要放到Host内存的哪个位置上去,这些信息包含在Host向SSD发送的Read命令中。SSD根据LBA,查找映射表,找到对应闪存物理位置,然后读取闪存获得数据。数据从闪存读上来以后,对NVMe/PCIe来说,SSD会通过PCIe把数据写入到Host指定的内存中。这样就完成了Host对SSD的读访问。
Host也有两种方式来告诉SSD数据所在内 ...
NVMe总体介绍以及SQ、CQ、DB
NVMe系列的笔记主要参考博客:http://www.ssdfans.com/?p=8137,蛋蛋是一个很酷的人
NVMe总体介绍为了充分发挥SSD的性能,取代为HDD设计的AHCI和SATA协议,Intel等厂商联合设计了NVMe协议。NVMe协议制定了Host与SSD的通信命令以及命令的执行方式。NVMe命令包括Host用来管理和控制SSD的Admin Command以及用来在Host与SSD之间传输数据的I/O Command。
NVMe有三个重要部分,Submission Queue(SQ),Completion Queue(CQ)和Doorbell Register(DB)。SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。如下图所示,NVMe Subsystem一般就是SSD,其作为一个PCIe Endpoint通过PCIe连接Root Complex(RC),然后RC连接着CPU。SQ位于Host内存中,Host要发送命令时,先把准备好的命令放在SQ中,然后通知SSD来取;CQ也是位于Host内存中,一个命令执行完成,成功或失败,SSD总会往CQ中写入命令完成 ...
DAOS故障模型
DAOS分布式异步对象存储故障模型DAOS 依靠大规模分布式单端口存储。因此,每个 Target 实际上都是一个单独的失败点。
DAOS 通过在不同的容错域中提供 Target 间的冗余来实现数据和元数据的可用性和持久性。DAOS 内部的 Pool 和 Container 的元数据通过强一致性算法进行复制。然后,通过在内部透明地利用 DAOS 分布式事务机制,DAOS 对象被安全地复制或纠删码编码。本节的目的是提供有关 DAOS 如何实现容错和保证对象弹性的详细信息。
分层容错域容错域是一组共享同一故障点的服务器,因此很可能同时发生故障。DAOS 假设容错域是分层且不重叠的。实际的层次结构和容错域成员身份必须由 DAOS 用于生成 Pool 映射的外部数据库提供。
Pool 元数据从不同的高级容错域复制到多个节点上,以获得高可用性,而对象数据则根据选定的 Object 类在不同数量的容错域上进行复制或纠删码编码。
故障检测DAOS 服务器通过基于 gossip 的协议 SWIM 在 DAOS 系统中进行监控,该协议提供了准确、高效和可扩展的服务故障检测。系统通过定期的本地健康评估监控附 ...
In storage Processing of IO Intensive Applications on Computational Storage Drives
论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9806270
此工作由加州大学欧文分校的Ali HeydariGorji和NGD的Mahdi Torabzadehkashi等人发表在ISQED(2022)。常见的可计算存储驱动器(CSD)例如带有通用处理器的SSD,其上的通用处理器可以用来执行存内计算。通过将计算从主机端移动到数据存储端从而减少数据搬运成本,CSD可以提高大数据分析的性能以及优化能耗。本文介绍了作者团队实现的Solana,首个E1.s形态的12-TB CSD。三个不同NLP应用场景下相较于常规商用SSDs,Solana可以提速3.1x,减少67%能耗以及68%数据搬运。
1 Background文本、图像、音乐、视频等海量数据的产生以及深度学习的发展使得人们对于高性能存储和高性能计算的需求不断增加。存储方面,硬盘驱动器( HDD )的容量呈指数增长,可靠性高,成本极具竞争力。然而,HDD在性能上已趋于平稳,其功耗最终受到机械运动的限制。固态硬盘( Solid State Drives, ...