第3章Verilog设计初步第3章Verilog设计初步第3章Verilog设计初步主要内容3.1Verilog简介3.2Verilog设计举例3.3Verilog模块的结构3.4Verilog语言要素3.5常量3.6数据类型3.7参数3.8向量3.9运算符第3章Verilog设计初步3.1Verilog简介Verilog语言是1983年由GDA(GatewayDesignAutomation)公司的PhilMoorby首创的,之后Moorby又设计了Verilog-XL仿真器,Verilog-XL仿真器大获成功,也使得Verilog语言得到推广使用。1989年,Cadence收购了GDA1990年,Cadence公开发表了VerilogHDL,并成立了OVI组织(OpenVerilogInternational)专门负责VerilogHDL的发展。Verilog于1995年成为IEEE标准,称为IEEEStandard1364-1995(Verilog-1995)IEEE“1364-2001”标准(Verilog-2001)也获得了通过,多数综合器、仿真器都已经支持Verilog-2001标准第3章Verilog设计初步3.2Verilog设计举例【例1】4位全加器moduleadder4(cout,sum,ina,inb,cin);output[3:0]sum;outputcout;input[3:0]ina,inb;inputcin;assign{cout,sum}=ina+inb+cin;endmodule【例2】4位计数器modulecount4(out,reset,clk);output[3:0]out;inputreset,clk;reg[3:0]out;always@(posedgeclk)beginif(reset)out=0;//同步复位elseout=out+1;//计数endendmodule第3章Verilog设计初步Verilog程序的特点(1)Verilog程序是由模块构成的。每个模块的内容都嵌在module和endmodule两个关键字之间;每个模块实现特定的功能;模块是可以进行层次嵌套的。(2)每个模块首先要进行端口定义,并说明输入和输出口(input、output或inout),然后对模块的功能进行逻辑描述。(3)Verilog程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。(4)除了endmodule等少数语句外,每个语句的最后必须有分号。(5)可以用/*……*/和//……对Verilog程序作注释。好的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。第3章Verilog设计初步仿真4位全加器的功能仿真结果4位计数器的功能仿真部分波形第3章Verilog设计初步moduleAOI(A,B,C,D,F);//模块名为AOIinputA,B,C,D;//模块的输入端口为A,B,C,DoutputF;//模块的输出端口为FwireA,B,C,D,F;//定义信号的数据类型assignF=~((A&B)|(~(C&D)));//逻辑功能描述endmodule3.3Verilog模块的结构该程序的第1行为模块的名字、模块的端口列表;第2、3行为输入输出端口声明,第4行定义了端口的数据类型;在第5行中对输入、输出信号间的逻辑关系进行了描述。第3章Verilog设计初步Verilog模块的模板module顶层模块名(输入输出端口列表);output输出端口列表;//输出端口声明input输入端口列表;//输入端口声明/*定义数据,信号的类型,函数声明*/reg信号名;//逻辑功能定义assign结果信号名=表达式;//使用assign语句定义逻辑功能//用always块描述逻辑功能always@(敏感信号表达式)begin//过程赋值//if-else,case语句//while,repeat,for循环语句//task,function调用end//调用其他模块调用模块名module_name例化模块名(端口列表port_list);endmodule第3章Verilog设计初步模块调用例子moduleaaa(a,b,out);inputa,b;outputout;wireout;assignout=a&b;endmodule`includeaaa.vmodulebbb(c,d,e,out);inputc,d,e;outputout;wireout_a;wireout;aaaaaa(.a(c),.b(d),.out(out_a));assignout=e&out_a;endmodule第3章Verilog设计初步3.4Verilog语言要素Verilog程序由符号流构成,符号包括空白符(Whitespace)注释(Comments)操作符(Operators)数字(Numbers)字符串(Strings)标识符(Identifiers)关键字(Keywords)等第3章Verilog设计初步空白符和注释空白符(Whitespace)空白符包括:空格、tab、换行和换页。空白符使代码错落有致,阅读起来更方便。在综合时空白符被忽略。注释(Comment)◆单行注释:以“//”开始到本行结束,不允许续行◆多行注释:多行注释以“/*”开始,到“*/”结束第3章Verilog设计初步标识符(Identifiers)标识符(Identifiers)Verilog中的标识符可以是任意一组字母、数字以及符号“$”和“_”(下划线)的组合,但标识符的第一个字符必须是字母或者下划线。另外,标识符是区分大小写的。Examples:countCOUNT//COUNT与count是不同的_A1_d2//以下划线开头R56_68FIVE第3章Verilog设计初步关键字(Keywords)Verilog语言内部已经使用的词称为关键字或保留字,这些保留字用户不能作为变量或节点名字使用。关键字都是小写的。第3章Verilog设计初步◆整数◆实数◆字符串3.5常量程序运行中,值不能被改变的量称为常量(constants),Verilog中的常量主要有如下3种类型:第3章Verilog设计初步整数按如下方式书写:+/-size'basevalue即+/-位宽'进制数字size为对应二进制数的宽度;base为进制;value是基于进制的数字序列。进制有如下4种表示形式:◆二进制(b或B)◆十进制(d或D或缺省)◆十六进制(h或H)◆八进制(o或O)整数(integer)第3章Verilog设计初步Examples:8'b11000101//位宽为八位的二进制数110001018'hd5//位宽为八位的十六进制数d5;5'O27//5位八进制数4'D2//4位十进制数24'B1x_01//4位二进制数1x015'Hx//5位x(扩展的x),即xxxxx4'hZ//4位z,即zzzz8□'h□2A/*在位宽和'之间,以及进制和数值之间允许出现空格,但'和进制之间,数值间是不允许出现空格的,比如8'□h2A、8'h2□A等形式都是不合法的写法*/整数(integer)第3章Verilog设计初步实数(Real)有下面两种表示法。◆十进制表示法。例如:2.00.1//以上2例是合法的实数表示形式2.//非法:小数点两侧都必须有数字◆科学计数法。例如:43_5.1e2//其值为43510.09.6E2//960.0(e与E相同)5E-4//0.0005实数(Real)第3章Verilog设计初步字符串(Strings)字符串是双引号内的字符序列。字符串不能分成多行书写。例如:INTERNALERROR字符串的作用主要是用于仿真时,显示一些相关的信息,或者指定显示的格式。第3章Verilog设计初步3.6数据类型Verilog有下面四种基本的逻辑状态。◆0:低电平、逻辑0或逻辑非◆1:高电平、逻辑1或“真”◆x或X:不确定或未知的逻辑状态◆z或Z:高阻态Verilog中的所有数据类型都在上述4类逻辑状态中取值,其中x和z都不区分大小写,也就是说,值0x1z与值0X1Z是等同的。数据类型(DataType)是用来表示数字电路中的物理连线、数据存储和传输单元等物理量的。第3章Verilog设计初步数据类型(DataType)Verilog中的变量分为如下两种数据类型:◆net型◆variable型net型中常用的有wire、tri;variable型包括reg、integer等。注意:在Verilog-1995标准中,variable型变量称为register型;在Verilog-2001标准中将register一词改为了variable,以避免初学者将register和硬件中的寄存器概念混淆起来。第3章Verilog设计初步net型Net型数据相当于硬件电路中的各种物理连接,其特点是输出的值紧跟输入值的变化而变化。对连线型有两种驱动方式,一种方式是在结构描述中将其连接到一个门元件或模块的输出端;另一种方式是用持续赋值语句assign对其进行赋值。wire是最常用的Net型变量。wire型变量的定义格式如下:wire数据名1,数据名2,……数据名n;例如:wirea,b;//定义了两个wire型变量a和bExamples:wire[7:0]databus;//databus的宽度是8位wire[19:0]addrbus;//addrbus的宽度是20位第3章Verilog设计初步Variable型variable型变量必须放在过程语句(如initial、always)中,通过过程赋值语句赋值;在always、initial等过程块内被赋值的信号必须定义成variable型。注意:variable型变量并不意味着一定对应着硬件上的一个触发器或寄存器等存储元件,在综合器进行综合时,variable型变量会根据具体情况来确定是映射成连线还是映射为触发器或寄存器。reg型变量是最常用的一种variable型变量。定义格式如下:reg数据名1,数据名2,……数据名n;例如:rega,b;//定义了两个reg型变量a,bExamples:reg[7:0]qout;//定义qout为8位宽的reg型向量reg[8:1]qout;第3章Verilog设计初步3.7参数(parameter)在Verilog语言中,用参数parameter来定义符号常量,即用parameter来定义一个标志符代表一个常量。参数常用来定义时延和变量的宽度。其定义格式如下:parameter参数名1=表达式1,参数名2=表达式2,参数名3=表达式3,……;例如:parametersel=8,code=8'ha3;//分别定义参数sel代表常数8(10进制),参数code代表常量a3(16进制)第3章Verilog设计初步3.8向量1.标量与向量宽度为1位的变量称为标量,如果在变量声明中没有指定位宽,则默认为标量(1位)。举例如下:wirea;//a为标量regclk;//clk为标量reg型变量线宽大于1位的变量(包括net型和variable型)称为向量(vector)。向量的宽度用下面的形式定义:[msb:lsb]比如:wire[3:0]bus;//4位的总线第3章Verilog设计初步2.位选择和域选择在表达式中可任意选中向量中的一位或相邻几位,分别称为位选择和域选择,例如:A=mybyte[6];//位选择B=mybyte[5:2];//域选择再比如:reg[7:0]a,b;reg[3:0]c;regd;d=a[7]&b[7];//位选择c=a[7:4]+b[3:0];//域选择第3章Verilog设计初步3.9运算符1.算术运算符(Arithmeticoperators)常用的算术运算符包括:+加-减*乘/除%求模第3章Verilog设计初步2