tag 标签: verilog

相关帖子
相关博文
  • 2025-6-18 15:40
    108 次阅读|
    0 个评论
    它分为两部分,这里是第一部分。 NVM Express(NVMe)是一种高性能、可扩展的接口协议,用于通过PCI express(PCIe)总线,实现主机软件与NVM设备之间的通信。目前,由于NVMe SSD相比于SATA SSD具有更高的吞吐量、更快的访问速度和更低的功耗,已经被广泛应用于各种计算领域和存储系统。 # NVMe队列 NVMe协议采用成对的提交队列(Submission Queue,SQ)和完成队列(Completion Queue,CQ)机制。SQ用于存放提交命令,而CQ则用于存放完成信息。队列状态信息通过门铃寄存器(Door Bell,DB)来检测。这两个队列采用了环形队列结构,队列可以映射到任何PCIe可访问的内存中,通常放在主机侧内存。对于提交队列,主机端是生产者,NVMe SSD是消费者。完成队列的情况刚好相反。因此SQ Tail指针和CQ Head指针由主机更新,而其他两个指针由NVMe控制器更新。NVMe的队列结构如图1所示。 图1 队列示意图 NVMe队列的深度是固定的,通过Tail和Head来分别指向队列的首尾位置,队列实际可用的大小是队列大小减1,当Head条目指针等于Tail条目指针时,队列为空。当Head条目指针比Tail条目指针多一个时,队列为满。 NVMe协议中根据命令类型将队列分为了Admin队列和I/O队列,Admin队列用来缓存管理Admin命令,如获取SSD属性、创建I/O队列等。而I/O队列用来缓存管理I/O命令,如读、写、识别等。在一个系统中只能有一对Admin SQ/CQ,但可以存在多对IO SQ/CQ。Admin SQ/CQ仅用来进行Admin命令的交互,I/O SQ/CQ仅用来进行I/O命令的交互。对于多核系统来说,每个核内虽然只有1个I/O CQ,但是可以存在多个I/O SQ,如图2所示。 图2 NVME 多队列示意图 由于Host端可能存在多个流水线,多队列的设计可以让系统的性能最大化。同时,可以通过对不同的队列设置不同的优先级,来保证高优先级队列的命令更快完成。NVMe协议中规定Admin SQ/CQ的队列深度最大可以支持4096(4K),I/O SQ/CQ的队列深度最大可以支持65536(64K)。在一个实际设计中,SQ的个数和深度的设置可以根据项目需求和硬件资源进行配置。队列深度的设置主要和系统中队列消费者和生产者之间的速率有关。 # NVMe分层结构 NVMe协议栈结构分为应用层和传输层两个层次。在应用层中实现NVMe命令生成、队列管理和流程控制,而传输层则借助PCIe协议进行实现。PCIe协议分为三层,即事务层、数据链路层和物理层。事务层负责将数据传输请求和响应打包成事务进行传输,数据链路层则负责数据传输的可靠性和流控制,通过链路层控制器(Link Layer Controller, LLC)实现。物理层则负责物理传输,包括电信号的发射和接收、时序控制和线路管理等。其分层结构图如图3所示。首先,在应用层生成NVMe命令传输至事务层。其次,在事务层会对上层传输的数据添加首部和校验,封装成TLP(Transaction Level Packet)传输至数据链路层。然后,在数据链路层会对TLP添加序列号和校验,封装成DLLP。最后,在物理层对数据包进行编码和并转串处理后,通过SerDes(Serializer/Deserializer)将数据发送至PCIe链路中。 图3 NVMe 分层结构示意图 由于NVMe协议是基于PCIe协议实现的,下面通过在PCIe拓扑结构中介绍NVMe协议中的SQ、CQ和DB的位置,以及数据在Host和NVMe SSD之间的传输流程。NVMe SSD在PCIe拓扑结构中的位置如图4所示。 图4 PCIe拓扑结构图 PCIe的拓扑结构由三部分组成,根联合体(Root Complex, RC)、PCIe交换器(PCIe Switch)和端点(Endpoint, EP)。根联合体位于拓扑结构的根部,最靠近CPU。端点设备位于PCIe的端末。交换机位于根联合体和端点设备之间。PCIe使用串行链路连接,一个链路的两端只能有两个设备。因此PCIe需要通过PCIe Switch扩展PCIe链路后,才能连接多个EP设备。在NVMe存储结构中,NVMe SSD也作为PCIe的一个EP端挂载在RC上。 NVMe协议中的SQ和CQ位于Host内存中,主机在初始化时根据队列的个数和深度在主机内存开辟出相应的内存空间,来存放SQ、CQ命令。DB寄存器位于NVMe SSD中,且被映射到BAR(Base Address Register)空间中,Host可以通过访问BAR空间来更新DB寄存器的值。 当Host需要向NVMe SSD发送命令时,首先将命令存放在主机内存开辟的SQ区域中,其次通过访问BAR空间的DB寄存器来告诉NVMe SSD到主机端内存区域取走待执行的命令。待命令执行完成后,NVMe SSD向主机内存的CQ区域写入完成命令。 想进一步了解相关视频,请搜索B站用户:专注与守望 或者链接:https://space.bilibili.com/585132944/dynamic?spm_id_from=333.1365.list.card_title.click
  • 热度 14
    2022-7-5 16:23
    2820 次阅读|
    0 个评论
    1.生成器结构 2.验证器结构 PRBS Error :高电平有效,代表出错
  • 热度 3
    2022-6-18 17:00
    3244 次阅读|
    1 个评论
    《Verilog HDL与FPGA数字系统设计》+浅读
    一、开箱 Verilog HDL是硬件描述语言,用文本形式来描述数字硬件的结构语言和我们常见的C语言有所不同。 硬件架构上,常常使用FPGA+ARM的形式。用Verilog HDL语言搭建逻辑电路,就像磊积木一样用逻辑门电路去搭建你想要实现的硬件, 比如RS触发器、T触发器等逻辑功能电路;再用C语言去控制处理这些逻辑功能形成的结果。 二、浅读体会 本来拿到书数会以为是直接讲解 Verilog HDL语言。翻开书 第一章 再讲数字电路的基础内容,包括二进制及数码转换、 逻辑门电路、组合逻辑电路。这都是要完成FPGA功能所需要的基础内容。很细节。 第二章 没有过多赘述,讲解了硬件描述语言。 Verilog HDL语言基本结构、仿真软件介绍、语法。 第三章 则讲述接下来的实际应用。常用组合逻辑电路原理讲解,并且用 Verilog HDL语言搭建逻辑电路。实际中的一些运算 和运算优先级的讲解。很有意思的是,我居然在这本书上找到了课后题。这也说明这本书是教学用书,而且是在实际教学中检验过 的教材。 第四章 对于基本用到的锁存器和触发器功能原理做了详细的介绍。通过触发器搭建计数电路,用 Verilog HDL语言阐述做实 例。还有寄存器、带有时序的逻辑电路的实现。 第五章 生活 实际 例子, 交通信号灯的,实现 Verilog HDL 描述控制电路。 第六章 对于可编程逻辑器件的介绍,也就是FPGA内部架构以及IO做了介绍。 第七章 对 于开发软件安装以及使用的介绍,包括实际仿真信号。不过我买了Xilinx的ZYNQ7020开发板,我个人在这块 就开始要是用官方提供的开发软件 Vivado。 第八章 上升到系统功能的讲解,以一个个实例从怎么开始分析到最后怎么实现过程。相当于开发一个项目需要流程去规 范细化实现。 第九章 标准的接口,显示屏的驱动等实现。以整体的项目试验去新建完成。 第十章 前九章讲如何实现,这章讲到实现后的仿真及分析时序。主要讲信号的建立等分析方法。 三、以后计划 其实在拿到书之前有计划去学习FPGA,我也有买了FPGA的开发板。此书无疑让更有学习的途径去加强学习。
  • 热度 4
    2021-3-16 11:57
    4859 次阅读|
    2 个评论
    Verilog基础--亚稳态简介
    在FPGA的系统中,如果数据传输不满足触发器的Tsu(建立时间)和Th(保持时间),或者复位过程中复位信号的释放不满足有效时钟沿的恢复时间(recovery time),就有可能产生亚稳态,此时触发器的输出端Q长时间处于震荡状态,且不等于输入端D,并且这种无用的输出可以沿信号通道上的各个触发器级联式传播下去。 下图为数字电路的高低电平和亚稳态区域: 亚稳态通常发生在 跨时钟域信号传输以及异步信号采集 上,其根本原因是: 时序上不满足触发器的建立与保持时间 。 1.跨时钟域信号传输,由于源寄存器时钟和目的寄存器的 时钟相移未知,所以源寄存器数据发出,可能在任何时间到达异步时钟域的目的寄存器,因此无法保证这些数据满足目的寄存器的建立时间Tsu和保持时间Th的要求。 2.异步信号采集上,异步信号可以在任何时间点到达目的寄存器,也无法保证满足目的寄存器的建立时间Tsu和保持时间Th的要求。 当数据在目的寄存器的Tsu-Th窗口发生变化时,即当数据的Tsu或Th不满足时,就有可能发生亚稳态的现象: 由图可知,当产生亚稳态后,Tco(时钟输出延迟)时间后会有个 Tmet(决断时间)的振荡时间段 ,当振荡结束回到稳定状态时为“0”或“1”,这个是随机的。因此会对后续电路的判断造成影响。 常用对亚稳态消除的三种方式: 1.对异步信号进行同步处理; 2.采用FIFO对跨时钟域数据通信进行缓冲设计; 3.对复位电路采用异步复位、同步释放方式处理; 下载视频
  • 热度 29
    2013-4-25 13:14
    4824 次阅读|
    2 个评论
    之前因为项目中FPGA开发的需要,学习了夏宇闻教授的《Verilog数字系统设计教程》,大约在2011年底初略学习完第一遍,到现在已经一年多了。温故而知新,于我来说不一定知新,但温故肯定会更牢固。   首先,给大家说说什么是FPGA,什么是Verilog.   FPGA(现场可编程门阵列)就是可灵活的、几乎可全配置的数字芯片,能实现定制的数字体系功能。   而Verilog是是一种硬件描述语言(HDL). 通过Verilog语言和综合工具,人们可以从底层的门级电路设计彻底解放出来,目前解放到了寄存器级,以后肯定会实现在更高级的解放。   Verilog是目前最流行的数字体系设计语言。形象的比喻:Verilog相当于一门“外语”,而FPGA编译器是能听懂Verilog这门外语的“老外农民”,FPGA相当于一块有限资源,有限面积的“试验田地”。这个“老外农民”在FPGA这个田地里,能把Verilog的描述生成相应的农作物--“电路”,并能开花结果,收成可观。   1、以绪论为引,整书主体分为4部分 :Verilog数字设计基础、设计和验证部分、设计示范和实验练习题、语法篇。一本书的结构是否齐全,是否条理清晰,结构是否有机关联,是否经典实用,作者的水平及用心,往往从目录就能看出许多。夏老师的这本书的确是学习Verilog的经典教材。看目录建议从大处着手,对整个书的全局有一个初步印象。书中每一章最后都有小结,小结都是每一章的精华知识点。   2、整书的回顾。 第一部分主要是Verilog常用到的语法及结构。Verilog的特点是风格与C相似,学过C的人很快能上手。不同是:C语言是顺序执行,更加抽象,花样很多,这是因为C语言后面有一个强大的操作系统和运行环境。Verilog则不同,可以把Verilog的程序内容分为两部分:一部分是于运行软件和环境相关,如“系统任务和编译预处理”这部分对硬件出身的初学者比较复杂,可以于C接口,往往不可综合;另一部分是所要的设计对象,通过综合后有实际硬件相对应的可综合部分,这部分主要是组合逻辑和时序逻辑以及各模块及其形成的顶层结构,这部分 与硬件直接相关,是对硬件实体的描叙。   第1章:《Verilog的基本知识》,讲述了Verilog HDL的历史,与VHDL的比较,其设计的优点,设计流程。Verilog因为形成了标准化而兼容各个厂商,使用上能够与工艺具体参数等无关,加上广泛的C语言基础人群(泛C联盟),所以Verilog在数字设计中比重越来越重。System Verilog的出现更是集成了设计、验证等诸多功能,更适合于可重用的IP设计及验证。具体的知识点是要理解Top_Down的设计概念。在顶层设计中,自己的体会是有两层:1、整个顶层的行为及功能需求。2、对应的顶层硬件架构和子模块来支撑这个功能需求。Top-Down的系统难点在于Top层的规划,Down的难点在于细节的把握和算法的实现。Top层的规划,特别是大型的数字系统设计,这需要系统设计方法论的熟悉和有关系统的知识。其中一个典型的系统设计方法论的例子是:控制,输入,输出要分开来进行划分。应用系统方法的设计在扩展升级性,问题定位及维护性,设计重用性等方面上会有更好的性能。 实际设计中,自己体会到的细节工具有:流程图设计、电路结构图设计、波形时序图设计。   第2章:《Verilog语法的基本概念》,将实际电路抽象影射为5个级别2类型:行为描述类型:(1)系统级、(2)算法级、(3)RTL级;结构描述类型:(4)门级 (5)开关级。描述了模块的基本结构。基本概念如:并行性,层次结构性,可综合性及测试模块。   第3章:《模块的结构、数据类型、变量和基本运算符号》,模块分为端口I/O说明,内部信号声明和逻辑功能定义。逻辑产生的三种方式:用连续赋值assign语句、用实例元件、用always块。三种方式产生的所有逻辑均通过变量名来进行相互连接。共有19种数据类型: reg, wire, integer, parameter ; large, medium, scalared,time,small,tri,tio,tirl,triand,trior,trireg,vectored,wand,wor,memory型。最常用的是前面4种。后面15种大多与基本逻辑单元建库相关。而所有数据又可以分为常量(主要为数字和parameter)和变量(wire,reg,memory型等)。Assign或门驱动的变量主要wire型。而always模块内赋值的必须定义为reg型。Memory型用于存储器建模,如reg mema 。运算符的含义及优先顺序,运算符分算术运算、位运算、逻辑/关系运算等等。运算符分单目,双目,三目运算符。注意“=”是否是“非阻赛赋值”还是“小于等于”是取决于所在语句的位置,所以应用上不会混乱。   第4章:《运算符、赋值语句和结构说明语句》,学习的要点是赋值语句和块语句。   第5章:《条件语句、循环语句、块语句与生成语句》,这章是设计应用中最重要的语法。if_else语句,这种语句综合出来为条件判断控制的多路器Mux. else总是和上面最近的if配对。当只有if无else时,组合逻辑会综合成锁存器。Case语句是多分支选择语句,类似于C语言中的switch(表达式)-case常量N:语句N;语法上更简洁,为case(表达式)-常量N:语句N; default: 语句; endcase。不同的是Verilog中是硬件跳转。case相当于If_else语句的并行扩展。不同的是else-if是1bit控制位,2选1的选择器;而case是多bit位,多选择的多路器。同样,组合逻辑中case缺乏default项容易生成锁存器。Verilog中的循环语句有四种:forever,repeat, while, for语句。因为自己对其生成对应的硬件结构不甚清楚,往往在可综合语言中,循环语句用得很少,一般都用if-else语句来代替。顺序块begin-end和并行块fork-join、生成块generate-endgenerate。   第6章:《结构语句、系统任务、函数语句和显示系统任务》。有4种结构说明语句:initial,always,task,function.其中可综合设计中always是最常用,task及function通过封装功能和调用,能够增强程序的可读性和提高编程效率,initial在testbench中能实现初始化。注意关键词“or”“,”只能用于always@()中,而条件逻辑判断需要用”||”,有一次弄混了,编译不通过。系统任务主要用于测试模块及验证。   第7章:《调试用系统任务和常用编译预处理语句》。主要用于测试模块的编写。其中感觉用的比较多的有$random,`define,`timescale,$readmemb,`include等。   第8章:《语法概念总复习练习》。有28道练习题。   第9章:《Verilog HDL模型的不同抽象级别》,叙述了门级结构描述,行为描述建模。   第10章:《如何编写和验证简单的纯组合逻辑模块》,讲述了加法器、乘法器,比较器、多路器等的设计。介绍了总线操作和流水线。   第11章:《复杂数字系统的构成》,初步介绍数字系统的概念,如组合逻辑,时序逻辑,数据保存及流动,同步时序体系。要点在于理解同步时序逻辑的意义。同步方法有:1,建立同步机制,如采用RAM和FIFO缓存.2,同步码或同步信号线。3、异步时钟域间数据传输需要注意同步。   第12章:《同步状态机的原理、结构和设计》,这一章开始讲述状态机。简单模块往往两段或一段写完;复杂模块推荐状态机的三段式写法:“初始状态和current_state=next_state”模块,“输入及状态转移”模块,“状态及输入控制输出”模块。独热码的使用。例12.4应该好好学习,三段式的好处在于解耦了各个要素,便于查错,优化与修改。也就是:第一部分说明初始状态,current_state=next_state,第二部分是状态机的状态转化的描述,第三部分是每一步状态的组合逻辑的描述。这样写调理更加清晰,也更加利于综合器综合。   第13章:《设计可综合的状态机的指导原则》,描述能更好地可综合的实际设计要求:状态机应该由唯一时钟触发;不要使用综合工具来设计异步状态机。Always块中应该避免组合反馈回路,曾经设计遇到综合后告警combinational loop问题,就是形成了组合反馈回路。状态机的置位和复位。   第14章:《深入理解阻塞和非阻塞赋值的不同》,在可综合中,非阻塞赋值事实上是寄存器在时钟跳变沿赋值,但它本身的原值未变,可以作为其他寄存器的输入。就是寄存器的值从时钟沿到来到其值的改变需要一定的时间,而时钟沿的沿及skew肯定需要少于这个时间。而阻塞赋值是我们通常意义上的赋值,这个值变化之后,后面的句子引用它得到的也是变化后的值。往往时序逻辑采用非阻塞赋值,而组合逻辑采用阻塞赋值。   第15章:《较复杂时序逻辑电路设计实践》,开始讲叙实际设计例子。如序列检测,I2C总线接口设计,I2C例子学习对工作中深入理解I2C总线的工作原理很有帮助。   第16章:《复杂时序逻辑电路设计实践 》,是15章的继续深入和扩展。继续深入I2C总线的Verilog设计,介绍了EEprom 读写所用的I2C接口的Verilog程序。讲解了EEprom的行为模型,EEprom_WR读写器的可综合Verilog模型,内部读写总线的信号源模块,最终用顶层将这三者连接起来,形成一个可仿真的小系统。真正需要的部分为EEprom_WR读写器的可综合Verilog模型,但为了得到正确的读写器的可综合模型,需要一个环境来验证这个模型的正确性,所以有信号源和EEprom的行为模型。认真学习能有很多收获,自己在这章中收获不少,使用设计技巧自觉有两点:1、采用FF来进行标志一段程序(如任务)的完成与否。2、可以判断自己,之后的语句中又可以改变掉自己。这在后续在项目中设计SPI接口程序时得以应用。   第17章:《简化的RISC_CPU设计》,这一章更为系统,使得原来很神秘的CPU清晰地展示它的原理和基本组成,涉及的知识有计算机结构和相关体系控制。当然实际的CPU或者软核,比这个要复杂的多,但基本原理相通。系统学是一门很深的学问,涉及系统的划分和配合。划分相当于复杂问题的解耦,而配合需要可靠稳定的接口。这都需要很深的理解。一句话:系统需要模块化设计,而模块化需要稳定可靠的标准化的接口。   第18章:《虚拟仪器/接口、IP和基于平台的设计方法及其在大型数字系统设计中的应用》,介绍了复杂系统设计的手段和工具:软/硬IP核,宏单元,虚拟仪器和接口。IP分为设计IP和验证IP. 介绍了虚拟接口联盟(VSIA)的组织。主要的IP供应商。   第三部分是《设计示范与实验练习》,像练习12,利用SRAM设计一个FIFO,有一年华为海思招聘数电的一道笔试题就是考FIFO的设计,这个在对外部高速接口的同步设计中几乎是必须的。第四部分是语法篇,讲述了Verilog HDL IEEE 1364标准,Verilog语言的参考手册。其中在408页有一个有趣的算法相关的例子 Pythagoras(x,y,z)。计算平方和的开方根,采用了迭代的计算方法,让我看了好半天才看懂其原理,但这个应该是不能综合的模块没,迭代的方法是不是属于数值计算?可惜没有正式学过这方面系统的知识。   本文的最后强烈推荐一下夏教授夏老师主持的论坛:http://bbs.eeworld.com.cn/thread-222470-1-1.html,有志于学习Verilog和FPGA的同学可以上去浏览和咨询问题。夏教授是中国推广Verilog的第一人。也是一个很热心和乐于助人和做实事的老教授,现已退休,一直在为强大中国的数字系统设计事业做出无私、持续、开创性的贡献。希望大家一起来支持发展这个事业。我当初是因为项目开发的需求,买了夏老师的教材,学习了他的书的过程中,又因为一些不懂的问题,斗胆发邮件请教老师,没想到老师能抽出宝贵的时间给我作答和解惑,因为那时还不知道他的论坛(如果有技术问题,希望大家去论坛问而不是邮件,这样可以节约老师的时间,统一作答;同时论坛里有许多案例可供学习),这样我也算是老师的弟子。后来又知道夏老师在“北京至芯科技”做培训事业,有志于此而有条件的,强烈推荐可以去参加老师的培训(约三个月),当当夏老师的 最后几批关门弟子。  
相关资源