第1节VerilogHDL语言简介VerilogHDL语言简介VerilogHDL和VHDL是目前世界上最流行的两种硬件描述语言(HDL:HardwareDescriptionLanguage),均为IEEE标准,被广泛地应用于基于可编程逻辑器件的项目开发。二者都是在20世纪80年代中期开发出来的,前者由GatewayDesignAutomation公司(该公司于1989年被Cadence公司收购)开发,后者由美国军方研发。HDL语言以文本形式来描述数字系统硬件结构和行为,是一种用形式化方法来描述数字电路和系统的语言,可以从上层到下层来逐层描述自己的设计思想。即用一系列分层次的模块来表示复杂的数字系统,并逐层进行验证仿真,再把具体的模块组合由综合工具转化成门级网表,接下去再利用布局布线工具把网表转化为具体电路结构的实现。目前,这种自顶向下的方法已被广泛使用。概括地讲,HDL语言包含以下主要特征:•HDL语言既包含一些高级程序设计语言的结构形式,同时也兼顾描述硬件线路连接的具体结构。•通过使用结构级行为描述,可以在不同的抽象层次描述设计。HDL语言采用自顶向下的数字电路设计方法,主要包括3个领域5个抽象层次。•HDL语言是并行处理的,具有同一时刻执行多任务的能力。这和一般高级设计语言(例如C语言等)串行执行的特征是不同的。•HDL语言具有时序的概念。一般的高级编程语言是没有时序概念的,但在硬件电路中从输入到输出总是有延时存在的,为了描述这一特征,需要引入时延的概念。HDL语言不仅可以描述硬件电路的功能,还可以描述电路的时序。2.1.1VerilogHDL语言的历史1983年,GatewayDesignAutomation(GDA)硬件描述语言公司的PhilipMoorby首创了VerilogHDL。后来Moorby成为VerilogHDL-XL的主要设计者和Cadence公司的第一合伙人。1984至1986年,Moorby设计出第一个关于VerilogHDL的仿真器,并提出了用于快速门级仿真的XL算法,使VerilogHDL语言得到迅速发展。1987年Synonsys公司开始使用VerilogHDL行为语言作为综合工具的输入。1989年Cadence公司收购了Gateway公司,VerilogHDL成为Cadence公司的私有财产。1990年初,Cadence公司把VerilogHDL和VerilogHDL-XL分开,并公开发布了VerilogHDL。随后成立的OVI(OpenVerilogHDLInternational)组织负责VerilogHDL的发展并制定有关标准,OVI由VerilogHDL的使用者和CAE供应商组成。1993年,几乎所有ASIC厂商都开始支持VerilogHDL,并且认为VerilogHDL-XL是最好的仿真器。同时,OVI推出2.0版本的VerilongHDL规范,IEEE则将OVI的VerilogHDL2.0作为IEEE标准的提案。1995年12月,IEEE制定了VerilogHDL的标准IEEE1364-1995。目前,最新的Verilog语言版本是2000年IEEE公布的Verilog2001标准,其大幅度地提高了系统级和可综合性能。2.1.2VerilogHDL的主要能力VerilogHDL既是一种行为描述语言,也是一种结构描述语言。如果按照一定的规则和风格编写代码,就可以将功能行为模块通过工具自动转化为门级互连的结构模块。这意味着利用Verilog语言所提供的功能,就可以构造一个模块间的清晰结构来描述复杂的大型设计,并对所需的逻辑电路进行严格的设计。下面列出的是Verilog语言的主要功能:•可描述顺序执行或并行执行的程序结构;•用延迟表示式或事件表达式来明确地控制过程的启动时间;•通过命名的事件来触发其他过程里的激活行为或停止行为;•提供了条件和循环等程序结构;•提供了可带参数且非零延续时间的任务程序结构;•提供了可定义新的操作符的函数结构;•提供了用于建立表达式的算术运算符、逻辑运算符和位运算符;•提供了一套完整的表示组合逻辑基本元件的原语;•提供了双向通路和电阻器件的描述;•可建立MOS器件的电荷分享和衰减模型;•可以通过构造性语句精确地建立信号模型;表2-1给出VerilogHDL的表述能力。表2-1VerilogHDL语言能力总结此外,VerilogHDL语言还有一个重要特征就是:和C语言风格有很多的相似之处,学习起来比较容易。2.1.3VerilogHDL和VHDL的区别VerilogHDL和VHDL都是用于逻辑设计的硬件描述语言。VHDL在1987年成为IEEE标准,VerilogHDL则在1995年才成为IEEE标准,这是因为前者是美国军方组织开发的,而后者则是从民间公司转化而来,要成为国际标准就必须放弃专利。相比而言,VerilogHDL具有更强的生命力。VerilogHDL和VHDL的相同点在于:都能形式化地抽象表示电路的行为和结构;支持逻辑设计中层次与范围的描述;可以简化电路行为的描述;具有电路仿真和验证机制;支持电路描述由高层到低层的综合转换;与实现工艺无关;便于管理和设计重用。但VerilogHDL和VHDL又有各自的特点,由于VerilogHDL推出较早,因而拥有更广泛的客户群体、更丰富的资源。VerilogHDL还有一个优点就是容易掌握,如果具有C语言学习的基础,很快就能够掌握。而VHDL需要Ada编程语言基础,一般需要半年以上的专业培训才能够掌握。传统观点认为VerilogHDL在系统级抽象方面较弱,不太适合特大型的系统。但经过Verilog2001标准的补充之后,系统级表述性能和可综合性能有了大幅度提高。当然,这两种语言也仍处于不断完善的过程中,都在朝着更高级描述语言的方向前进。2.1.4VerilogHDL设计方法1.自下而上的设计方法自下而上的设计是传统的设计方法,是从基本单元出发,对设计进行逐层划分的过程。这种设计方法与用电子元件在模拟实现板上建立一个系统的步骤有密切的关系。优、缺点分别如下:•优点设计人员对这种设计方法比较熟悉;实现各个子模块所需的时间较短。•缺点对系统的整体功能把握不足;由于必须先对多个子模块进行设计,因此实现整个系统的功能所需的时间长;另外,对设计人员之间相互协作也有较高的要求。2.自上而下的设计方法自上而下的设计是从系统级开始,把系统划分为基本单元,然后再把基本单元划分为下一层次的基本单元,直到可用EDA元件实现为止。这种方法的优、缺点如下。•优点在设计周期开始就做好了系统分析;由于设计的主要仿真和调试过程是在高层完成的,所以能够早期发现结构设计上的错误,避免了设计工作的浪费,方便了系统的划分和整个项目的管理,可减少设计人员劳动,避免了重复设计。•缺点得到的最小单元不标准,且制造成本高。3.混合的设计方法复杂数字逻辑电路和系统设计过程,通常是以上两种设计方法的结合。设计时需要考虑多个目标的综合平衡。在高层系统用自上而下的设计方法实现,而使用自下而上的方法从库元件或以往设计库中调用已有的设计单元。混合设计方法兼有以上两种方法的优点,并且可使用先进的矢量测试方法。第2节VerilogHDL基本程序结构第2节VerilogHDL基本程序结构VerilogHDL基本程序结构用VerilogHDL描述的电路设计就是该电路的VerilogHDL模型,也称为模块,是Verilog的基本描述单位。模块描述某个设计的功能或结构以及与其他模块通信的外部接口,一般来说一个文件就是一个模块,但并不绝对如此。模块是并行运行的,通常需要一个高层模块通过调用其他模块的实例来定义一个封闭的系统,包括测试数据和硬件描述。一个模块的基本架构如下:modulemodule_name(port_list)//声明各种变量、信号reg//寄存器wire//线网parameter//参数input//输入信号output/输出信号inout//输入输出信号function//函数task//任务……//程序代码initialassignmentalwaysassignmentmoduleassignmentgateassignmentUDPassignmentcontinousassignmentendmodule说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句用于定义设计的功能和结构。说明部分可以分散于模块的任何地方,但是变量、寄存器、线网和参数等的说明必须在使用前出现。一般的模块结构如下:module模块名(端口列表)定义模块条目endmodule其中,定义用来指定数据对象为寄存器型、存储器型、线型以及过程块。模块条目可以是initial结构、always结构、连续赋值或模块实例。下面给出一个简单的Verilog模块,实现了一个二选一选择器。例2-1二选一选择器(见图2-1)的Verilog实现图2-1例2-1所示的二选一电路modulemuxtwo(out,a,b,s1);inputa,b,s1;outputout;regout;always@(s1oraorb)if(!s1)out=a;elseout=b;endmodule模块的名字是muxtwo,模块有4个端口:三个输入端口a、b和s1,一个输出端口out。由于没有定义端口的位数,所有端口大小都默认为1位;由于没有定义端口a,b,s1的数据类型,这3个端口都默认为线网型数据类型。输出端口out定义为reg类型。如果没有明确的说明,则端口都是线网型的,且输入端口只能是线网型的。第3节VerilogHDL语言的数据类型和运算符第3节VerilogHDL语言的数据类型和运算符2.3.1标志符标志符可以是一组字母、数字、_下划线和$符号的组合,且标志符的第一个字符必须是字母或者下划线。另外,标志符是区别大小写的。下面给出标志符的几个例子:Clk_100MHzdiag_state_ceP_o1_02需要注意的是,VerilogHDL定义了一系列保留字,叫作关键字,具体资料可查阅相关标准。只有小写的关键字才是保留字,因此在实际开发中,建议将不确定是否是保留字的标志符首字母大写。例如:标志符if(关键字)与标志符IF是不同的。2.3.2数据类型数据类型用来表示数字电路硬件中的数据存储和传送元素。VerilogHDL中总共有19种数据类型,本书只介绍4个常用的数据类型:wire型、reg型、memory型和parameter型,其他类型将在后续章节中逐步介绍。1.wire型wire型数据常用来表示以assign关键字指定的组合逻辑信号。Verilog程序模块中输入、输出信号类型默认为wire型。wire型信号可以用做方程式的输入,也可以用做“assign”语句或者实例元件的输出。wire型信号的定义格式如下:wire[n-1:0]数据名1,数据名2,……数据名N;这里,总共定义了N条线,每条线的位宽为n。下面给出几个例子:wire[9:0]a,b,c;//a,b,c都是位宽为10的wire型信号wired;2.reg型reg是寄存器数据类型的关键字。寄存器是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,其作用相当于改变触发器存储器的值。reg型数据常用来表示always模块内的指定信号,代表触发器。通常在设计中要由always模块通过使用行为描述语句来表达逻辑关系。在always块内被赋值的每一个信号都必须定义为reg型,即赋值操作符的右端变量必须是reg型。reg型信号的定义格式如下:reg[n-1:0]数据名1,数据名2,……数据名N;这里,总共定义了N个寄存器变量,每条线的位宽为n。下面给出几个例子:reg[9:0]a,b,c;//a,b,c都是位宽为10的寄存器regd;reg型数据的缺省值是未知的。reg型数据可以为正值或负值。但当一个reg型数据是一个表达式中的操作数时,它的值被当作无符号值,即正值。如果一个4位的reg型数据被写入-1,在表达式