第3章Verilog基本语法硬件描述语言和数字系统设计23.1VerilogHDL基本模块说明3.2VerilogHDL中的词汇约定3.3VerilogHDL数据类型3.4VerilogHDL运算符主要内容:33.1VerilogHDL基本模块说明module能够表示:物理块,如IC或ASIC单元逻辑块,如一个CPU设计的ALU部分整个系统每一个模块的描述从关键词module开始,有一个名称(如SN74LS74,DFF,ALU等等),由关键词endmodule结束。module是层次化设计的基本构件逻辑描述放在module内部4Verilog模块(module)结构基本要素知识点:3.1.1端口信息3.1.2输入/输出说明3.1.3逻辑功能描述53.1.1端口信息1,端口在模块名字后的括号中列出3,端口可以说明为input,output及inout2,端口等价于硬件的引脚(pin)模块通过端口与外部通信6Verilog模块的结构由在module和endmodule关键词之间的四个主要部分组成:-1.端口信息:modulecombination(a,b,c,d);-2.输入/输出说明:inputa,b,c;outputd;-//输入/输出端口信号类型声明,缺省为wire型:-3.内部信号:wirex;-4.功能定义:assignd=a|x;assignx=(b&~c);endmodule3.1.2端口说明73.1.3逻辑功能描述modulemux2to1(out,a,b,sel);inputa,b,sel;outputout;wireout;assignout=(sel)?b:a;endmodule两路选择器的RTL级描述1:8两路选择器的RTL级描述2:modulemux2to1(out,a,b,sel);inputa,b,sel;outputout;regout;always@(seloraorb)if(!sel)out=a;elseout=b;endmodule91.端口信息2.输入/输出说明3.逻辑功能描述(实例化实现功能描述)实例化(moduleinstances):10modulemux2to1(out,a,b,sl);inputa,b,sl;outputout;notu1(nsl,sl);andu2(sela,a,nsl);andu3(selb,b,sl);oru4(out,sela,selb);endmodule两路选择器的门级描述-实例化:11请在下面的空格中填入适当的符号使其成为右图的Verilog模块:moduleblock1(a,b,—,—,—);input—,—,—;——d,—;assignd=a|(b&~c);assigne=(b&~c);_______练习:编写VerilogHDL模块abcde12moduleblock1(a,b,c,d,e);inputa,b,c;outputd,e;assignd=a|(b&~c);assigne=(b&~c);endmodule练习答案:编写VerilogHDL模块abcde133.2VerilogHDL中的词汇约定知识点:3.2.1术语及定义3.2.2空白符和注释3.2.3Verilog采用的四值逻辑系统3.2.4整数常量和实数常量3.2.5字符串3.2.6标识符3.2.7系统任务及函数3.2.8编译指导3.2.9文本包含3.2.10文本替换143.2.1术语及定义1.空白符:空格、tabs及换行2.标志符(Identifier):Verilog中对象(如模块或信号)的名字3.LSB:最低有效位(Leasesignificantbit)4.MSB:最高有效位(Mostsignificantbit)153.2.2空白符和注释moduleMUX2_1(out,a,b,sel);//Portdeclarationsoutputout;inputsel;//controlinputinputb,a;/*datainputs*/wiresel_,a1,b1;/*Thenetlistlogicselectsinput”a”whensel=0anditselects”b”whensel=1.*/notnot1(sel_,sel);andand1(a1,a,sel_);andand2(b1,b,sel);oror1(out,a1,b1);endmodule格式自由使用空白符提高可读性及代码组织。Verilog忽略空白符除非用于分开其它的语言标记。多行注释,在/**/内单行注释到行末结束163.2.3Verilog采用的四值逻辑系统’0’,Low,False,LogicLow,Ground,VSS,NegativeAssertion‘1’,High,True,LogicHigh,Power,VDD,VCC,PositiveAssertion’X’Unknown:OccursatLogicalWhichCannotbeResolvedConflict‘Z’,HighImpedance,Tri-Stated,DisabledDriver(Unknown)173.2.4整数常量和实数常量Verilog中,常量(literals)可是整数也可以是实数。1.整数的大小可以定义也可以不定义。整数表示为:size'basevalue其中size:位数大小,由十进制数表示的位数(bit)表示。缺省为32位base:数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为10进制value:是所选数基内任意有效数字,包括X、Z。2.实数常量可以用十进制或科学表示法表示。1812unsizeddecimal(zero-extendedto32bits)‘h83aunsizedhexadecimal(zero-extendedto32bits)8'b110000018-bitbinary16'hff0116-bithexadecimal32'bz01xZ-extendedto32bits3'b101011013-bitnumber,truncatedto3’b1016.3decimalnotation32e-4scientificnotationfor0.00324.1E3scientificnotationfor4100整数与实数常量例子19整数和实数常量小结整数的大小可以定义也可以不定义。整数表示为:数字中(_)忽略,便于查看没有定义大小(size)整数缺省为32位/*特别注意*/缺省数基为十进制数基(base)和数字(16进制)中的字母无大小写之分当数值value大于指定的大小时,截去高位。如2'b1101表示的是2'b01实数常量实数可用科学表示法或十进制表示科学表示法表示方式:尾数e或E指数,表示:尾数×10指数203.2.5字符串(string)(了解)字符串要在一行中用双引号括起来,也就是不能跨行。字符串中可以使用一些转义(escape)符,如\t\n可以使用一些格式符(如%b)在仿真时产生格式化输出:”Thisisanormalstring””Thisstringhasa\ttabandendswithanewline\n””Thisstringformatsavalue:val=%b”Verilog中,字符串大多用于显示信息的命令中。(只用在测试中!!!!)21格式符%h%o%d%b%c%s%thexoctdecbinACSIIstringtime转义符\t\n\\\”\1-3digitoctalnumbertab换行反斜杠双引号ASCIIrepresentationofabove格式符%0d表示没有前导0的十进制数223.2.6标识符(identifiers)(重点)标识符是用户在描述时给Verilog对象(电路模块、信号等)起的名字标识符必须以字母(a-z,A-Z)或(_)开头,后面可以是字母、数字、($)或(_)。最长可以是1023个字符标识符区分大小写,sel和SEL是不同的标识符例如:moduleMUX2_1(out,a,b,sel);outputout;inputa,b,sel;wiresel_,a1,b1;notnot1(sel_,sel);andand1(a1,a,sel_);andand2(b1,b,sel);oror1(out,a1,b1);endmoduleVerilog标识符23有效标识符举例:shift_reg_abusa_index_bus3无效标识符举例:34net//开头不是字母或“_”a*b_net//包含了非字母或数字,“$”“_”n@238//包含了非字母或数字,“$”“_”Verilog区分大小写,所有Verilog关键词如module、endmodule等都使用小写字母。243.2.7系统任务及函数(了解)使用方式:$identifier$符号指示这是系统任务和函数系统函数有很多,如:返回当前仿真时间$time显示/监视信号值($display,$monitor)停止仿真$stop结束仿真$finish如:$monitor($time,“a=%b,b=%h”,a,b);当信号a或b的值发生变化时,系统任务$monitor显示当前仿真时间,信号a值(二进制格式),信号b值(16进制格式)。253.2.8编译指导(了解)(`)符号说明一个编译指导这些编译指导使仿真编译器进行一些特殊的操作编译指导一直保持有效直到被覆盖或解除263.2.9文本包含`include(了解)编译指导`include在当前内容中插入一个文件格式:`include“file_name”如`includeglobal.v`includeparts/count.v`include../../library/mux.v”`include可用于:include保存在文件中的全局的或经常用到的一些定义,如文本宏在模块内部include一些任务(tasks),提高代码的可维护性。可以是相对路径或绝对路径273.2.10文本替换`define(了解)编译指导`define提供了一种简单的文本替换的功能`definemacro_namemacro_text在编译时macro_text替换macro_name。可提高描述的可读性。`definenot_delay#1`defineand_delay#2`defineor_delay#1moduleMUX2_1(out,a,b,sel);outputout;inputa,b,sel;wiresel_,a1,b1;not`not_delaynot1(sel_,sel);and`and_delayand1(a1,a,sel_);and`and_delayand2(b1,b,sel);or`or_delayor1(out,a1,b1);endmodule定义not_delay使用not_delay28文本替换(了解)解除定义的宏,使用`undefmacro_name使用编译指导`define,可以提高描述的可读性定义全局设计参数,如延时和矢量的位数。这些参数可以定义在同一位置。这样,当要修改设计配置时,只需要在一个地方修改。定义Verilog命令的简写形式`definevectors_file/usr1/chrisz/library/vectors`defineresults_file/usr1/chrisz/library/results可以将`define放在一个文件中,与其它文件一起编译。293.3VerilogHDL数据类型知识点:3.3.1线网类型3.3.2寄存器类型3.3.3参数3.3.4位选择3.3.5总结303.3VerilogHDL数据类型VerilogHDL有两大类数据类型。1.线网类型(nettype):表示Verilog结构化元件间