第2章Verilog语法的基本概念概述VerilogHDL是一种用于数字系统设计的语言。用VerilogHDL描述的电路设计就是该电路的VerilogHDL模型,也称为模块。VerilogHDL既是一种行为描述的语言也是一种结构描述的语言。这就是说,无论描述电路功能行为的模块成描述元器件或较大部件互联的模块都可以用Verilog语言来建立电路模型。如果按照一定的规则和风格编写,功能行为模块可以通过工具自动地转换为门级互联的结构模块。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们所对应的模型类型共有以下5种,现分别给以简述。(1)系统级(system-level):用语言提供的离级结构能够实现待设计模块的外部性能的模型。(2)算法级(algorithm-level):用语言提供的高级结构能够实现算法运行的模型。(3)RTL级(registertransferlevel):描述数据在寄存器之间的流动和如何处理、控制这些数据流动的模型。以上三种都风于行为描述,只有RTL级才与翌辑电路有明确的对应关系。(4)门级(gate-level):描述逻辑门以及逻辑门之间连接的模型。与逻辑电路有确定的连接关系,以上4种数字系统设计工程师必须掌握。(5)开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。这与具体的物理电路有对应关系,工艺库元件和宏部件设计人员必须掌握,将在高级教程中介绍。一个复杂电路系统的完整VerilogHDL模型是由若干个VerilogHDL模块构成的,每一个模块又可以由若千个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块有交互联系的现存电路或激励信号源。利用VerilogHDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构,以此来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。VerilogHDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下功能:可描述顾序执行或并行执行的程序结构;。用延迟表达式或事件表达式来明确地控制过程的启动时间:。通过命名的事件来触发其他过程里的激活行为或停止行为;提供了条件如if-else,case等循环程序结构;,提供了可带参数且非零延续时间的任务(task)程序结构提供了可定义新的操作符的函数结构(function);。提供了用于建立表达式的算术运算符、逻辑运算符、位运算符·VerilogHDL语言作为一种结构化的语盲非常适用于门级和开关级的模型设计。因
20Yerilog数字东晚银计教程(常2版)其结构化的特点又使它具有以下功能:提供了一套完整的表示组合逻辑的基本元件的原语(primitive);提供了双向通路(总线)和电阻器件的原语;可建立MOS器件的电荷分享和电荷衰减动态模型。VerilogHDL的构造性语句可以精确地建立信号的模型。这是因为在VerilogHDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。VerilogHDL作为一种高级的硬件措述编程语言,与C语言的风格有许多类似之处。其中有许多语句,如if语句、case语句和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习VerilogHDL并不困难,只要对VerilogHDL某些语句的特殊方面着重加以理解,并加强上机练习就能很好地掌握它,就能利用它的强大功能来设计复杂的数字逻辑电路系统。下面将对VerilogHDL中的基本语法通过实例逐一加以初步的介绍。2.1Verilog模块的基本概念下面先介绍几个简单的VerilogHDL程序,从中了解Verilog模块的特性。【例2.1I图2.1所示的二选一多路选择器的VerilogHDL程序如下:module muxtwo (out, a, b, sl),inputa,b,sl,output out:reg out;always @ (sl or a or b)if (! sl)out=a;else out - b:endmodule从[例2.1]中很容易理解模块muxtwo的作用。它是一个如图2.1所示的二选一多路器,输出out与输入a一致,还悬与输30人b一致,由sl的电平决定。当控制信号sl为非(低电平0)时,输出out与输入a相同,否则与b相同。always@(sl oraorb)表示只要sl或a或b,其中若有一个变化时就执行下面的语句。人们并不关心它的电路结构,关心的是如何从逻辑功能上来描述图2.1二选一多路器(一)它。Verilog的语法支持这种逻辑行为的描述。为了实现这个电路的逻辑功能,也能用布尔表达式来描述,Verilog语言中,可以用“~”、“&”、“|"操作符分别表示:求反、相与和相或运算操作。所以[例2.1]的muxtwo模块实现的逻辑功能也能用[例2.2]形式的Verilog代码来表示。【例2.2】图2.2所示的带有与非门的二选一多路选择器的VerilogHDL程序如下:module muxtwo (out, a, b, sl);1/输入信号名input a,b,sl;//输出信号名output out;
21第 2 章 Verilog 倍液的基率机会wirensl,sela,selb:1/定义内部连接线assign nsl- -sl;:1/求反assign sela=a&nsl;//按位与运算assign selb=b&.sl;&assignout一selalseilb/按位或运算endmodule上面例子中实现的逻辑功能是非常容易理解的,它sl从本质上就是一个逻辑表达式,表达的是一个二选一多图2.2带有与非门的二选一多路器路选择器,如[例2.3]所示。【例2.3】图2.3所示多路选择器的Verilog12HDL程序如下:modulemuxtwo (out,a,b,sl);Oninput a,b,sl:s1output out,nselbnotul(nsl,sl) ;and:#1 u2(sela,8,nsl);and#1 u3(selb,b,sl);图2.3多路选择器(二)or#1 u4(out,sela,selb);endmodule从[例2.3]中很容易理解模块muxtwo的作用。它也是一个二选一多路器,输出out与输入a一致,还是与输人b一致,由sl的电平决定。当控制信号sl为非(!)(低电平),输出out与输入a相同,否则与b相同。模块的描述用基本的与门、或门和非门的互联来描述。在程序模块中出现的and、or和not都是Verilog语言的保留字,由Verilog语言的原语(prirnitive)规定了它们的接口顺序和用法,分别表示与门、或门和非门,其中元件的输出口都规定在第一个端口,#1和#2分别表示门输入到输出的延迟为1和2个单位时间;模块程序中的ul、u2、u3、u4与逻辑图中的逻辑元件对应,表示逻辑元件的实例名称。模块表示的是电路结构,跟程序右面的电路逻辑图表示完全一致的。Verilog的语法也支持这种基于逻辑单元互联结构的描述。如果在编写Verilog模块时,不但符合语法,还符合一些基本规则,就可以通过计算机上运行的工具把[例2.1]通过[例2.2]的中间形式自动转换为[例2.3]形式的模块,这个过程叫做综合(synthesis)。我们知道[例2.3]模块很容易与某种工艺的基本元件逐一对应起来,再通过布局布线工具自动地转变为某种具体工艺的电路布线结构。在第一部分里除了讲解基本语法外,主要讲解符合何种风格的Verilog模块是可以综合的;何种风格的模块是不可以综合的;不可综合的Verilog模块有些什么作用等。下面再看几个简单的模块,目的是初步了解Verilog语法最重要的几个基本概念:并行性、层次结构性、可综合性,并了解测试平台(testbench)。【例2.4】通过连续赋值语句描述一个3位加法器的VerilogHDL程序如下:moduleadder(count,sum,a,b,cin);input [20]a,b;inputcin;
22Verilog 数字最统议计激数程(第 2 版)output countoutput[210]sum;assign(count,sum)=a+b+cin;endmodule这个例子通过连续赋值语句描述了一个名为adder的3位加法器。它可以根据两个3比特数a、b和进位(cin)计算出和(sum)及向上进位(count)。从例子中可以看出整个VerilogHDL程序是位于module和endmodule声明语句之间的。【例2.5】通过连续赋值语句描述一个比较器的VezilogHDL程序如下:module compare ( equal,a,b ),output equal;//声明输出信号equalinput [1:o] a,b;1/声明输人信号a,bassign equal=(a==b)? 1 : 0;/*如果a、b两个输人信号相等,输出为1;否则为0*/endtnodule此程序通过连续赋值语句描述了一个名为compare的比较器。对2比特数a、b进行比较,如a与b相等,则输出equal为高电平,否则为低电平。在这个程序中,/*...,*/和//…表示注释部分。注释只是为了方便程序员理解程序,对编译是不起作用的。【例2.6】图2.4所示的三态门选择器,其verilogHDL程序如下:moduletrist2(out,in,enable);outputout,inputin,enable,bufif mybuf(out,in,enable);endmodule该程序描述了一个名为trist2的三态驱动器。程序通过调用一个在Verilog语言提供的原语tristl(primitive)库中现存的三态驱动器元件bufif1来sin!古tri_inst实现其逻辑功能。在trist2模块中所用到的三态iinoutsout驱动器元件bufifi的具体名字叫做mybuf.这种引用现成元件或模块的方法叫做实例化或实例引用,ienableena这表示电路构造的一种常用的语法现象。1【例2.7】采用二个模块的三态门选择器,其VerilogHDL程序如下:图2.4三衣门选择疆module tristi(sout,sin,ena),output sout,input sin, enasmytritri_inst(.out(sout),.in(sin),,enable(ena)),//引用由mytri模块定义的实例元件triLinstendmoduie
第 章 Verllog 谱注的基本合23fmodule mytri(out,in,enable);output out;inputin,enable;assignout - enable? in : ‘bz;endmodule该程序通过另一种方法描述了一个三态门。在这个例子中存在着两个模块:模块trist1引用由模块mytri定义的实例部件tri_inst,模块tristl是上层模块,模块mytri则被称为子模块。在实例部件tri_inst中,带“”表示被引用模块的端口,名称必须与被引用模块mytri的端口定义一致,小括号中表示在本模块中与之连接的线路。上面这些例子都是可以综合的,通过综合工具可以自动转换为由与门、或门和非门组成的加法器、比较器和三态门等组合逻辑。在数字电路基础中已经学习过怎样用组合逻辑来实现1位或2位整数的加法和比较,而带超前进位链的多位整数加法器和多位比较器的逻辑图相当复杂,很难即时辨明。但这些也是已经成熟的电路结构,对于计算机支持的EDA工具来说,这只是一个映射的过程,系统设计人员就不必过于关心它们逻辑构成的细节,而把主要精力集中在系统结构的考虑上,从而大大提高了设计效率。2.2Verilog用于模块的测试Verilog还可以用来描述变化的测试信号,描述测试信号的变化和测试过程的模块也叫做测试平台(testbench或testfixture),它可以对上面介绍的电路模块(无论是行为的或结构的进行动态的全面测试。通过观测被测试模块的输出信号是否符合要求,可以调试和验证逻辑系统的设计和结构正确与否,并发现问题及时修改。图2.5为Verilog时用于模块测试的原理图。2节图2.5Verilog用于模块测试下面来看一个Verilog的测试模块,它可以对[例2.1]和[例2.2]和[例2.3]的多路器模块进行逐步深人的全面测试。【例2.8】对L例2.1]~[例2.3]多路器模块进行VerilogHDL程序如下:include"tnuxtwo,v"module t;regain, bin, select,clock;reg