您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > verilog-3、4、5
第三章Verilog的基本语言要素1.理解Verilog中使用的基本词汇约定,标识符、转义标识符、字符串等2.学习Verilog中的常量表示法3.学习Verilog中的系统函数和系统任务4.学习Verilog中的编译指令学习内容:Verilog的程序格式•程序由模块构成,每个模块要进行端口定义和端口说明•程序中可以:一行写多条;一条写多行,每条以“;”结束,endmodule后可不加分号•每个文件中可包含多个模块,但顶层模块只有一个•每个Verilog程序源文件都以.v作为文件扩展名注释moduleMUX2_1(out,a,b,sel);//Portdeclarationsoutputout;inputsel,//controlinputb,/*datainputs*/a;/*Thenetlistlogicselectsinput”a”whensel=0anditselects”b”whensel=1.*/not(sel_,sel);and(a1,a,sel_),(b1,b,sel);//Whatdoesthislinedo?or(out,a1,b1);endmodule多行注释,在/**/内单行注释到行末结束语言要素中的术语及定义1.间隔符:空格(\b)、tabs(\t)及换行(\n)2.Identifier:标识符,Verilog中对象(如模块或端口)的名字3.LSB:最低有效位(Leasesignificantbit)4.MSB:最高有效位(Mostsignificantbit)格式自由提高可读性及代码组织。Verilog忽略空白符除非用于分开其它的语言标记。标识符(identifiers)•标识符是用户在描述时给Verilog对象起的名字•标识符必须以字母(a-z,A-Z)或(_)开头,后面可以是字母、数字、($)或(_)。•最长可以是1023个字符•标识符区分大小写,sel和SEL是不同的标识符•模块、端口和实例的名字都是标识符moduleMUX2_1(out,a,b,sel);outputout;inputa,b,sel;notnot1(sel_,sel);andand1(a1,a,sel_);andand2(b1,b,sel);oror1(out,a1,b1);endmoduleVerilog标识符标识符(identifiers)•有效标识符举例:shift_reg_abusa_index_bus3•无效标识符举例:34net//开头不是字母或“_”a*b_net//包含了非字母或数字,“*”n@238//包含了非字母或数字,“@”•Verilog区分大小写,所有Verilog关键词使用小写字母。转义标识符(Escapedidentifiers)•可以包含任何可打印字符•反斜杠及空白符不是标识符的一部分module\2:1MUX(out,a,b,sel);outputout;inputa,b,sel;notnot1(\~sel,sel);andand1(a1,a,\~sel);andand2(b1,b,sel);oror1(out,a1,b1);endmodule•使用转义符可能会产生一些问题,并且不是所有工具都支持。有时用转义符完成一些转换,如产生逻辑图的Verilog网表。综合工具输出综合网表时也使用转义符。不建议使用转义符。转义标识符由反斜杠“\”开始,空白符结束EscapedIdentifiers字符串(string)•字符串要在一行中用双引号括起来,也就是不能跨行。•在仿真时可以使用字符串结合格式符(如%b),产生指定的格式化输出:$display(”Thisisanormalstring”)$monitor(”Thisstringformatsavalue:val=%b”,val)Verilog中,字符串大多用于显示信息的命令中。Verilog没有字符串数据类型格式符%h%o%d%b%c%s%v%m%thexoctdecbinACSIIstringstrengthmoduletime转义符\t\n\\\”\ddd(1-3digitoctalnumber)tab换行反斜杠双引号ASCIIrepresentationofaboveVerilog的常量•简单的十进制数值前面加‘+’和‘-’表示数的正负Verilog中,常量(literals)可是整数也可以是实数整数的表示方法有两种:•指定位宽的基数格式size’basevalue其中size:指定数的二进制位宽的大小。由十进制数表示。缺省为32位。’base:数基,可为2(b)、8(o)、10(d)、16(h)进制。缺省为10进制’b’o’d’h’sb’so’sd’shvalue:是所选数基内任意有效数字,包括X、Z。Verilog的常量•整数表示特性有:–数字中(_)忽略,便于查看,如:27_195_000,16’b0011_0100_0101–数基(base)和数字(16进制)中的字母无大小写之分–当数值value的位数大于指定的位数大小时,截去高位。如2’b1101表示的是2’b01–当数值value的位数小于指定的位数大小时,按照相应的规则进行向左填充补位–在Verilog中负数都是按照二进制补码的形式存储和处理的。Verilog的常量12unsizeddecimal(zero-extendedto32bits)’H83aunsizedhexadecimal(zero-extendedto32bits)8’b1100_00018-bitbinary64’hff0164-bithexadecimal(zero-extendedto64bits)9’O179-bitoctal32’bz01xZ-extendedto32bits-8’d6-(8’d6)4’shf1111-4’h1-4’sd15-(1111)00014af8’d-6Reg[11:0]a,b,c,d;Initialbegina=’hx;//xxxb=’h3x;//03xEndVerilog的常量•实数常量–实数可用科学表示法或十进制表示小数点两边至少都有一位数字,否则为非法表示。–科学表示法表示方式:尾数e或E指数,表示:尾数×10指数6.3decimalnotation32e-4scientificnotationfor0.00324.1E3scientificnotationfor4100.129..2e-7系统任务及函数$标识符•$符号指示这是系统任务和函数•系统函数有很多:–标准输出任务–文件管理任务–仿真控制任务–时间函数–其它函数$display和$write格式:$display([“format_specifiers”,]signal,signal,……);例:$display(“Helloworld!”);输出为:Helloworld!$display($time);输出为:50$displayb和$writeb$displayo和$writeo$displayh和$writeh系统任务及函数$标识符•$符号指示这是系统任务和函数•系统函数有很多:–标准输出任务–文件管理任务–仿真控制任务–时间函数–其它函数1、打开文件$fopen例:handleA=$fopen(“myfile.out”)2、输出到文件$fdisplay、$fwrite、$fmonitor例:$fdisplay(handleA,“hello!”)3、关闭文件$fclose例:$fclose(handleA)4、从文件读数据到存储器$readmemb、$readmemh例:reg[7:0]memory[9:0]$readmemb(“mem.dat”,memory)系统任务及函数$标识符•$符号指示这是系统任务和函数•系统函数有很多:–标准输出任务–文件管理任务–仿真控制任务–时间函数–其它函数1、仿真监控任务监视和输出参数列表中的表达式或变量的功能。$monitor$monitoron$monitoroff2、仿真结束任务$stop中止$finish结束系统任务及函数$标识符•$符号指示这是系统任务和函数•系统函数有很多:–标准输出任务–文件管理任务–仿真控制任务–时间函数–其它函数$time返回当前仿真时间,返回值为64位整数$stime返回32位的仿真时间$realtime以实数形式返回但前的仿真时间系统任务及函数$标识符•$符号指示这是系统任务和函数•系统函数有很多:–标准输出任务–文件管理任务–仿真控制任务–时间函数–其它函数1、随机函数$random%$random%numbernumber为大于0的整数,随机序列范围-number+1到number-12、转换函数$rtoi$itor编译指令(CompilerDirectives)•这些编译指令使仿真编译器进行一些特殊的操作•(`)符号标识一个编译指令•编译指令句末不加;•编译指令对所有被编译的文件都有效,一直保持有效直到被覆盖或解除,或整个编译结束。•`resetall复位所有的编译指令为缺省值,应该在其它编译指令之前使用编译指令(CompilerDirectives)•宏编译指令•条件编译指令•文件包含编译指令•时间标度编译指令宏编译指令-`define、`undef宏编译指令`define提供了一种简单的文本替换(substitution)的功能`definemacro_namemacro_text在编译时macro_name替换macro_text。`definenot_delay#1`defineand_delay#2`defineor_delay#1moduleMUX2_1(out,a,b,sel);outputout;inputa,b,sel;not#1not1(sel_,sel);and#2and1(a1,a,sel_);and#2and2(b1,b,sel);or#1or1(out,a1,b1);endmodule定义not_delay使用not_delaynot`not_delaynot1(sel_,sel);and`and_delayand1(a1,a,sel_);and`and_delayand2(b1,b,sel);or`or_delayor1(out,a1,b1);•解除定义的宏,使用`undefmacro_name•使用编译指导`define,可以–提高描述的可读性–定义全局设计参数,如延时、矢量的位数等。这些参数可以定义在同一位置。这样,当要修改设计配置时,只需要在一个地方修改。–定义Verilog命令的简写形式`defineresults_file/usr1/chrisz/library/results.dat宏编译指令-`define、`undef•使用宏编译指令进行文本替换时,每个实参是按照字面意义取代形参的。`definemy_square(x)(x*x)n=`my_square(a)\\a*am=`my_square(a+b)\\(a+b*a+b)`definemy_square(x)((x)*(x))\\((a+b)*(a+b))m=`my_square(a+b)宏编译指令-`define、`undef•控制Verilog的源程序代码是否参与编译。–选择对同一个模块不同的描述法,例如:行为级、结构级、开关级描述。–选择不同的时序或结构信息。–为仿真或测试选择不同的激励。–例:`defineA`defineB`ifdefA\\`ifndefA语句1`elsifB语句2`else语句3`endif条件编译指令-`ifdef、`else、`elsif、`endif文本包含编译指令-`include•编译指令`include指在当前文件中插入另一个文件格式:`include“file_name”如`includeglobal.v`includeparts/count.v`include../../library
本文标题:verilog-3、4、5
链接地址:https://www.777doc.com/doc-4624636 .html