第二章Verilog硬件描述语言2.1基本概念2.2VerilogHDL基本结构2.3模块与声明2.4数据类型与运算符号2.5行为建模2.6Verilog-2001设计规则Verilog基本模块怎样设计复杂的数字系统?现代的设计方法:选用合适的EDA仿真工具;选用合适电路图输入和HDL编辑工具;逐个编写可综合HDL模块;逐个编写HDL测试模块;逐个做VerilogHDL电路逻辑访真;编写VerilogHDL总测试模块;做系统电路逻辑总仿真;2.1基本概念现代的设计方法(续):选用合适的基本逻辑元件库和宏库租用或购买必要的IP核;选用合适的综合器;进行综合得到门级电路结构;布局布线,得到时延文件;后仿真;定型,FPGA编码或ASIC投片为什么要用硬件描述语言来设计?电路的逻辑功能容易理解;便于计算机对逻辑进行分析处理;把逻辑设计与具体电路的实现分成两个独立的阶段来操作;逻辑设计与实现的工艺无关;逻辑设计的资源积累可以重复利用;可以由多人共同更好更快地设计非常复杂的逻辑电路(几十万门以上的逻辑系统)。学习内容术语定义硬件描述语言特点Verilog历史如何从抽象级(levelsofabstraction)理解电路设计Verilog描述术语定义硬件描述语言HDL:描述电路硬件结构及电路时序的一种编程语言。仿真器:读入HDL并进行解释及执行的一种软件。抽象级:描述风格的详细程度,如行为级结、构级、门级。自下而上的设计流程:一种先构建底层单元,然后由底层单元构造更大的系统的设计方法。自顶向下的设计流程:一种设计方法,先用高抽象级构造系统,然后再设计下层单元。RTL级:寄存器传输级(RegisterTransferLevel),用于设计的可综合的一种抽象级。逻辑综合:在标准单元库和特定的设计约束的基础上,把设计的高层次描述转换成优化的门级网表的过程。Verilog的用途Verilog的主要应用包括:ASIC和FPGA工程师编写可综合的RTL代码在高抽象级进行系统仿真,完成系统结构开发编写系统仿真的测试代码硬件描述语言特点VerilogHDL较多的第三方工具的支持语法结构比VHDL简单学习起来比VHDL容易仿真工具比较好使测试激励模块容易编写VerilogHDL的发展历史VerilogHDL公开发表CADENCE公司购买Verilog版权199019891980’sVerilog-XL诞生模拟和数字都适用的Verilog标准公开发表1998?VerilogHDLIEEE1364标准公开发表有关VerilogHDL的全部权利都移交给OVI(OpenVerilogInternational)19951990有哪几种HDL语言?各有什么特点?VHDL-比VerilogHDL早几年成为IEEE标准;-语法/结构比较严格,因而编写出的模块风格比较清晰;-比较适合由较多的设计人员合作完成的特大型项目(一百万门以上)。两者建模能力的比较VHDLVITAL系统级算法级寄存器传输级逻辑门级开关电路级行为级的抽象VerilogHDL与VHDL建模能力的比较Verilog抽象级Verilog既是一种行为描述的语言也是一种结构描述语言。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别包括:系统说明-设计文档/算法描述RTL/功能级-Verilog门级/结构级-Verilog版图/物理级-几何图形行为综合综合前仿真逻辑综合综合后仿真版图在抽象级上需要进行折衷系统说明-设计文档/算术描述RTL/功能级-Verilog门级/结构级-Verilog版图/物理级-几何图形详细程度低高输入/仿真速度高低Verilog可以在三种抽象级上进行描述行为级用功能块之间的数据流对系统进行描述在需要时在函数块之间进行调度赋值。RTL级/功能级用功能块内部或功能块之间的数据流和控制信号描述系统基于一个已定义的时钟的周期来定义系统模型结构级/门级用基本单元(primitive)或低层元件(component)的连接来描述系统以得到更高的精确性,特别是时序方面。在综合时用特定工艺和低层元件将RTL描述映射到门级网表设计工程师在不同的设计阶段采用不同的抽象级首先在行为级描述各功能块,以降低描述难度,提高仿真速度。在综合前将各功能模块进行RTL级描述。用于综合的库中的大多数单元采用结构级描述。Verilog还有一定的晶体管级描述能力及算法级描述能力有关VerilogHDL的几个重要基本概念1)综合:通过工具把用VerilogHDL描述的模块自动转换为用门级电路网表表示的模块的过程。2)寄存器传输级VerilogHDL模块:也可称为RTL(Verilog)HDL模块。它是符合特定标准和风格的描述状态转移和变化的VerilogHDL模块。能用综合器把它转换为门级逻辑。3)VerilogHDL测试模块:用VerilogHDL描述的模块,可以用来产生测试信号序列并可以接收被测试模块的信号,用于验证所设计的模块是否能正常运行,往往不可综合成具体门级电路。4)VerilogHDL顶层(测试)模块:同上。5)布局布线:把用综合器自动生成的门级网表(EDIF)通过运行一个自动操作的布局布线工具,使其与具体的某种FPGA或某种ASIC工艺库器件对应起来,并加以连接的过程。6)VerilogHDL后仿真测试模块:同3)、4),但被测试的模块至少是一个门级描述的或用具体FPGA(ASIC)库器件(带时间延迟信息)描述的结构型VerilogHDL模块。2.2VerilogHDL基本结构语言本身提供了各种层次抽象的表述,可以用详细程度有很大差别的的多层次模块组合来描述一个电路系统。行为级:技术指标和算法的Verilog描述RTL级:逻辑功能的Verilog描述门级:逻辑结构的Verilog描述开关级:具体的晶体管物理器件的描述VerilogHDL的抽象级别行为级:有关行为和技术指标模块,容易理解RTL级:有关逻辑执行步骤的模块,较难理解门级:有关逻辑部件互相连接的模块,很难理解开关级:有关物理形状和布局参数的模块,非常难理解抽象级别和综合与仿真的关系行为仿真:行为的验证和验证模块分割的合理性前仿真:即RTL级仿真,检查有关模块逻辑执行步骤是否正确。逻辑综合:把RTL级模块转换成门级。后仿真:用门级模型做验证,检查门的互连逻辑其功能是否正确。布局布线:在门级模型的基础上加上了布线延时布局布线后仿真:与真实的电路最接近的验证。行为级和RTL级modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;regout;always@(sloraorb)if(!sl)out=a;elseout=b;endmoduleabsloutabslout这个行为的描述并没有说明如果输入a或b是三态的(高阻时)输出应该是什么,但有具体结构的真实电路是有一定的输出的。RTL模块的数据流动必须基于时钟。RTL模块在每个时钟的沿时刻,其变量的值必定是精确的。RTL模块是可综合的,它是行为模块的一个子集合。结构级modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;notu1(ns1,sl);and#1u2(sela,a,nsl);and#1u3(selb,b,sl);or#2u4(out,sela,selb);endmoduleoutabslselbselansl模块基本结构modulemodule_name//模块名(port_list);//端口声明列表input;//输入声明output;//输出声明reg;//寄存器类型声明wire;//线网类型声明parameter;//参数声明//主程序代码gatelevelassignlevelinitialalways@(posedgeclkornegedgereset)UDPstructuresub_moduleu(out,input1,input1)//被调用子模块functiontaskendmodule2.3模块与声明模块命名模块的命名规则模块端口连接规则模块划分信号命名端口声明参数声明变量声明2.3.1模块命名1、模块的命名规则将模块的英文名称的各个单词首字母组合起来,形成3-5个字符缩写。例:Built-inSelfTest模块命名为BISTArithmaticLogicalUnit模块命名为ALU若模块的英文名称只有一个单词,可取该单词中的前三个字母。例:Transceivers模块命名为TRS模块之间的接口信号的命名所有变量命名分为两个部分,第一部分表明数据方向,其中数据发出方在前,数据接收方在后,第二部分为数据名称。第一部分全部大写,第二部分所有具有明确意义的英文名全部拼写或缩写的第一个字母大写,其余部分小写。举例:CPUMMU_WrReq,下划线左边是第一部分,代表数据方向是从CPU模块发向存储器管理单元模块(MMU)。下划线右边Wr为Write的缩写Req是Request的缩写。两个缩写的第一个字母都大写便于理解。整个变量连起来的意思就是CPU发送给MMU的写请求信号。模块上下层次间信号的命名也遵循本规定模块内部信号模块内部的信号由几个单词连接而成,缩写要求能基本表明本单词的含义;单词除常用的缩写方法外,如:Clock-Clk,Write-Wr,Read-Rd等),一律取该单词的前几个字母(如:Frequency-Freq,Variable-Var等);每个缩写单词的第一个字母大写;若遇两个大写字母相邻,中间添加一个下划线(如DivN_Cntr);举例:SdramWrEn_n;FlashAddrLatchEn;2、模块端口连接规则模块调用另一模块时有两种连接方式:1)按端口顺序连接:底层模块定义时声明的端口顺序与上层模块相应的连接端口顺序保持一致。2)按端口名称连接,被调用的底层模块和上层模块是通过端口名称进行连接。3、模块划分系统级设计模块A模块A1模块A3模块A2模块C1模块C2模块C模块B模块B1模块B22.3.2信号命名系统级信号的命名。系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n;经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。2.3.3端口声明输入端口:input端口名;模块从外界读取数据的接口,是连线类型输出端口:output端口名;模块向外界传输数据的接口,是连线或寄存器型输入输出端口:inout端口名;可读取数据也可接收数据的端口,数据是双向的,是连线型2.3.4变量声明声明变量的数据类型后,不能再进行更改在VerilogHDL中只要在使用前声明即可声明后的变量、参数不能再次重新声明声明后的数据使用时的配对数据必须和声明的数据类型一致2.4.5“`include”和“`define”“`include”是调用某个目录下的文件添加到这个程序中“`define”是编译指令中用作全局变量声明2.3.6代码编写风格1、分节编写2、注释单行注释以“//”多行注释以“/*”开始,以“*/”结束。3、程序编写说明Verilog模块由两部分组成:端口信息和内部功能。moduleblock1(a,b,c,d,e);inputa,b,c;outputd,e;assignd=