资源描述
Verilog HDL 基本语法 语汇代码的编写标准 常量、变量及数据类型 关键字和标示符 运算符 语句 综合代码的编写标准 http:/bbs.chinafm.org/(工管之家管理资料免费下载)规定了文本布局、命名和注释的约定,以提高源代码的可读性和可维护性。每个Verilog HDL源文件中只准编写一个顶层模块,也不能把一个顶层模块分成几部分写在几个源文件中。源文件名字应与文件内容有关,最好与顶层模块同名!源文件名字的第一个字符必须是字母或下划线,不能是数字或$符号!每行只写一个声明语句或说明。源代码用层层缩进的格式来写。语汇代码的编写标准2http:/bbs.chinafm.org/(工管之家管理资料免费下载)定义变量名的大小写应自始至终保持一致(如变量名第一个字母均大写)。变量名应该有意义,而且含有一定的有关信息。局部变量名(如循环变量)应简单扼要。通过注释对源代码做必要的说明,尤其对接口(如模块参数、端口、任务、函数变量)做必要的注释很重要。语汇代码的编写标准3http:/bbs.chinafm.org/(工管之家管理资料免费下载)常量尽可能多地使用参数定义和宏定义,而不要在语句中直接使用字母、数字和字符串。参数定义(用一个标识符来代表一个常量)的格式:u parameter 参数名1=表达式,参数名2=表达式,;宏定义(用一个简单的宏名来代替一个复杂的表达式)的格式:u define 标志符(即宏名)字符串(即宏内容)语汇代码的编写标准4http:/bbs.chinafm.org/(工管之家管理资料免费下载)常量整型数:5表表 达达 方方 式式说说 明明 举举 例例+/-完整的表达方式8b11000101或8 hc5 缺省位宽,则位宽由机器系统决定,至少32位hc5 缺省进制为十进制,位宽默认为32位197v注:这里位宽指对应二进制数的宽度。http:/bbs.chinafm.org/(工管之家管理资料免费下载)常量x表示不定值,z表示高阻值;“?”是z的另一种表示符号,建议在case语句中使用?表示高阻态z为提高可读性,在较长的数字之间可用下划线_隔开!但不可以用在和之间。当常量未指明位宽时,默认为32位。6http:/bbs.chinafm.org/(工管之家管理资料免费下载)17 /位宽,基数符号不写会采用default值(32bit十进制)8d32 /8-bit十进制值为32 8h1A 8o37 8b0001_1100 32bx /”x”表unknown 4b0?/”?”表示高阻常量7http:/bbs.chinafm.org/(工管之家管理资料免费下载)常量实数十进制计数法,科学计数法7.2 1.8e-4/1.8*10-4 9.5E6字符串与字符变量字符串为两个双引号“”之间的字符,不许跨行“This is a string!”;/共17个字符8http:/bbs.chinafm.org/(工管之家管理资料免费下载)常量参数(符号常量)参数(符号常量)参数是一个常量,经常用于定义时延和变量的宽度。parameter byte_size=8;/定义一个常数参数parameter,byte_msb=byte_size-1;/用数表达式赋值parameter average_delay=(r+f)/2;/用常数表达式赋值9http:/bbs.chinafm.org/(工管之家管理资料免费下载)变量变量即在程序运行过程中其值可以改变的量Verilog HDL中共有19种数据类型;其中3个最基本的数据类型为:网络型(nets type)寄存器型(register type)数组型(memory type)10http:/bbs.chinafm.org/(工管之家管理资料免费下载)变量线网类型:nets type表示Verilog结构化元件间的物理连线物理连线。它的值由驱动元件的值决定;如果没有驱动元件连接到线网,线网的如果没有驱动元件连接到线网,线网的缺省值为缺省值为z z。寄存器类型:register type表示一个抽象的数据存储单元,它只能在只能在alwaysalways语句和语句和initialinitial语句中被赋值语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有x的缺省值。11http:/bbs.chinafm.org/(工管之家管理资料免费下载)wire型变量型变量它它是最常用的netsnets型型变变量量,常用来表示以assign语句赋值的组合逻辑信号。模块中的输入/输出信号类型缺省为wire型。可用做任何方程式的输入,或“assign”语句和实例元件的输出。变量12http:/bbs.chinafm.org/(工管之家管理资料免费下载)wire 数据名1,数据名2,数据名n;wiren-1:0 数据名1,数据名2,数据名m;或 wiren:1 数据名1,数据名2,数据名m;每条总线位宽为n共有m条总线wire型向量(总线)格式变量13http:/bbs.chinafm.org/(工管之家管理资料免费下载)变量14register类型类型:在程序块中作变量用,对信号赋值需要用该数据类型,赋值时用关键字赋值时用关键字initial或或always开始。开始。常用register变量reg:是最常见的数据类型,常代表触发器.integer:32位带符号整数型变量,可以作为普通寄存器 使用,典型应用为高层次行为建模。time类型:无符号时间变量。real和realtime类型:实数寄存器(或实数时间寄存器)http:/bbs.chinafm.org/(工管之家管理资料免费下载)变量registerregister型变量与型变量与netsnets型变量的根本区别是:型变量的根本区别是:vregister型变量需要被明确地赋值,并且在被重新赋值前一直保持原值。vregister型变量必须通过过程赋值语句赋值!不能通过assign语句赋值!v在过程块内被赋值的每个信号必须定义成register型!15http:/bbs.chinafm.org/(工管之家管理资料免费下载)reg型变量定义在过程块中被赋值的信号,往往代表触发器,但不一定就是触发器(也可以是组合逻辑信号)!reg 数据名1,数据名2,数据名n;格式变量16http:/bbs.chinafm.org/(工管之家管理资料免费下载)regn-1:0 数据名1,数据名2,数据名m;或 regn:1 数据名1,数据名2,数据名m;每个向量位宽为n共有m个reg型向量例 reg4:1 regc,regd;/regc,regd为4位宽的reg型向量reg型向量(总线)变量17http:/bbs.chinafm.org/(工管之家管理资料免费下载)用reg型变量生成组合逻辑举例:module rw1(a,b,out1,out2);input a,b;output out1,out2;reg out1;wire out2;assign out2=a;always(b)out1=b;endmoduleaout2BUFFBUFFBUFFBUFFbINVout1过程赋值语句连续赋值语句电平触发Verilog中reg与wire的区别reg型变量既可生成触发器,也可生成组合逻辑;wire型变量只能生成组合逻辑。变量18http:/bbs.chinafm.org/(工管之家管理资料免费下载)用reg型变量生成触发器举例:module rw2(clk,d,out1,out2);input clk,d;output out1,out2;reg out1;wire out2;assign out2=d&out1;always(posedge clk)begin out1 3=4b0001;4b10014=4b0000 4b10011=5b10010;4b10012=6b100100;16=32b100000036http:/bbs.chinafm.org/(工管之家管理资料免费下载)运算符条件运算符?:EX:tri_data=en?data_out:32bz;/三态37http:/bbs.chinafm.org/(工管之家管理资料免费下载)类类 别别运运 算算 符符优先级优先级逻辑、位运算符!高低算术运算符*/%移位运算符关系运算符 =等式运算符=!=!=缩减、位运算符&|逻辑运算符&|条件运算符?:运算符的优先级为提高程序的可读性,建议使用括号来控制运算的优先级!例(ab)&(bc)(a=b)|(x=y)(!a)|(ab)运算符38http:/bbs.chinafm.org/(工管之家管理资料免费下载)语句39赋值语句赋值语句连续赋值语句过程赋值语句块语句块语句begin_end语句fork_join语句条件语句条件语句if_else语句case语句循环语句循环语句forever语句while语句repeat语句for语句结构说明语句结构说明语句initial语句always语句task语句function语句编译预处理语编译预处理语句句define语句timescale语句include语句http:/bbs.chinafm.org/(工管之家管理资料免费下载)语句40赋值语句分为两类:连续赋值语句assign语句,用于对wire型变量赋值,是描述组合逻辑最常用的方法之一 例 assign c=a&b;/a、b、c均为wire型变量过程赋值语句用于对reg型变量赋值,有两种方式:非阻塞(non-blocking)赋值方式:赋值符号为=,如 b=a;阻塞(blocking)赋值方式:赋值符号为=,如 b=a;http:/bbs.chinafm.org/(工管之家管理资料免费下载)非阻塞赋值方式 always(posedge clk)begin b=a;c=b;endclkDFFcDQDQabDFF非阻塞赋值在块结束时才完成赋值操作!注:c的值比b的值落后一个时钟周期!语句41http:/bbs.chinafm.org/(工管之家管理资料免费下载)阻塞赋值方式 always(posedge clk)begin b=a;c=b;end阻塞赋值在该语句结束时就完成赋值操作!clkDFFcDQab注:在一个块语句中,如果有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面的语句就不能被执行,就像被阻塞了一样,因此称为阻塞赋值方式。这里c的值与b的值一样!语句42http:/bbs.chinafm.org/(工管之家管理资料免费下载)非阻塞(non-blocking)赋值方式(b end_wave;/触发事件end_wave end注:每条语句的延迟时间d是相对于前一条语句的仿真时间而言的!语句48http:/bbs.chinafm.org/(工管之家管理资料免费下载)用fork_join标识的块语句并行块块内的语句是同时执行的;块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间而言的;延迟时间用于给赋值语句提供时序;当按时间排序在最后的语句执行完或一个disable语句执行时,程序流程控制跳出该并行块。49http:/bbs.chinafm.org/(工管之家管理资料免费下载)fork 语句1;语句2;语句n;joinfork:块名 块内声明语句;语句1;语句2;语句n;join或注:块内声明语句可以是参数声明、reg型变量声明、integer型变量声明、real型变量声明语句、time型变量声明语句和事件(event)说明语句。并行块的格式语句50http:/bbs.chinafm.org/(工管之家管理资料免费下载)例4用并行块和延迟控制组合产生一个时序波形。reg7:0 r;fork /由一系列延迟产生的波形#50 r=h35;#100 r=hE2;#150 r=h00;#200 r=hF7;#250 end_wave;/触发事件end_wave join波形同例3注:在fork_join块内,各条语句不必按顺序给出!但为增加可读性,最好按被执行的顺序书写!语句51http:/bbs.chinafm.org/(工管之家管理资料免费下载)语句if-else 条件语句条件语句case 语句语句for循环语句循环语句52if(条件表达式条件表达式)块语句块语句1else if(条件表达式条件表达式2)块语句块语句2else if(条件表达式条件表达式n)块语句块语句nelse 块语句块语句n+1case(敏感表达式敏感表达式)值值1:块语句块语句1 值值2:块语句块语句2 值值n:块语句块语句n default:块语句:块语句n+1endcasefor(表达式表达式1;表达式;表达式2;表达式;表达式3)块语)块语句句http:/bbs.chinafm.org/(工管之家管理资料免费下载)若 if与 else的 数 目 不 一 样,注 意 用“begin_end”语句来确定if与else的配对关系!if(表达式1)if(表达式2)语句1;else 语句2;else if(表达式3)语句3;else 语句4;if(表达式1)begin if(表达式2)语句1;endelse 语句2;当if与else的数目不一样时,最好用“begin_end”语句将单独的if语句括起来:if语句的嵌套:语句53http:/bbs.chinafm.org/(工管之家管理资料免费下载)语句casecase语句与语句与if-elseif-else语句区别语句区别if-elseif-else语句语句适于对不同的条件,执行不同的语句;对于每个判定只有两两个分支。casecase语句语句适于对同一个控制信号取不同的值时,输出取不同的值!它是多多分支语句。当控制信号只有一个时,最好采用case语句,比较简洁!54http:/bbs.chinafm.org/(工管之家管理资料免费下载)是case语句的两种变体语句case casez casexcase casez casex的区别的区别在在casecase语句中,分支表达式每一位的值都是确定语句中,分支表达式每一位的值都是确定的(或者为的(或者为0 0,或者为,或者为1 1););在在casezcasez语句中,若分支表达式某些位的值为高阻语句中,若分支表达式某些位的值为高阻值值z z,则不考虑对这些位的比较;,则不考虑对这些位的比较;在在casexcasex语句中,若分支表达式某些位的值为语句中,若分支表达式某些位的值为z z或或不定值不定值x x,则不考虑对这些位的比较。,则不考虑对这些位的比较。在分支表达式中,可用在分支表达式中,可用“?”来标识来标识x x或或z z55http:/bbs.chinafm.org/(工管之家管理资料免费下载)module mux_z(out,a,b,c,d,select);output out;input a,b,c,d;input3:0 select;reg out;/必须声明 always(select3:0 or a or b or c or d)begin casez(select)4b?1:out=a;4b?1?:out=b;4b?1?:out=c;4b 1?:out=d;endcase endendmodule例 用casez描述的数据选择器这里“?”表示高阻态语句56http:/bbs.chinafm.org/(工管之家管理资料免费下载)使用条件语句注意事项应注意列出所有条件分支,否则当条件不满足时,编译器会生成一个锁存器保持原值!这一点可用于设计时序电路,如计数器:条件满足时加1,否则保持原值不变。而在组合电路设计中,应避免生成隐含锁存器!有效的方法是在if语句最后写上else项;在case语句最后写上default项。语句57http:/bbs.chinafm.org/(工管之家管理资料免费下载)如何正确使用if语句?生成了不想要的锁存器:不会生成锁存器:always(al or d)begin if(al)q=d;enddDFFD Qalq例 设计一个数据选择器always(al or d)begin if(al)q=d;else q=0;end0dalqmultiplexer当al为0时,q保持原值!当al为0时,q等于0!语句58http:/bbs.chinafm.org/(工管之家管理资料免费下载)always(sel1:0 or a or b)case(sel1:0)2b00:q=a;2b11:q=b;endcase生成了不想要的锁存器:例 设计一个数据选择器always(sel1:0 or a or b)case(sel1:0)2b00:q=a;2b11:q=b;default:q=b0;endcase不会生成锁存器:如何正确使用case语句?当sel为00或11以外的值时,q保持原值!v避免生成锁存器的原则:如果用到if语句,最好写上else项;如果用到case语句,最好写上default项。语句59http:/bbs.chinafm.org/(工管之家管理资料免费下载)循环语句for语句通过3个步骤来决定语句的循环执行:l(1)给控制循环次数的变量赋初值。l(2)判定循环执行条件,若为假则跳出循环;若为真,则执行指定的语句后,转到第(3)步。l(3)修改循环变量的值,返回第(2)步。repeat语句连续执行一条语句n次while语句执行一条语句,直到循环执行条件不满足;若一开始条件即不满足,则该语句一次也不能被执行!forever语句无限连续地执行语句,可用disable语句中断!语句60http:/bbs.chinafm.org/(工管之家管理资料免费下载)for语句for(表达式1;表达式2;表达式3)语句for(循环变量赋初值;循环执行条件;循环变量增值)执行语句8条语句相当于采用while语句建立的循环结构:begin 循环变量赋初值;while(循环执行条件)begin 循环变量增值;endendfor语句比while语句简洁!语句61http:/bbs.chinafm.org/(工管之家管理资料免费下载)repeat语句连续执行一条或多条语句n次。repeat(循环次数表达式)语句repeat(循环次数表达式)begin end执行语句为多条语句或格语句62http:/bbs.chinafm.org/(工管之家管理资料免费下载)例 两个8位二进制数乘法注:不如采用for语句简单!语句63http:/bbs.chinafm.org/(工管之家管理资料免费下载)1.while语句有条件地执行一条或多条语句。首先判断循环执行条件表达式是否为真。若为真,则执行后面的语句或语句块;然后再回头判断循环执行条件表达式是否为真,若为真,再执行一次后面的语句;如此不断,直到条件表达式不为真。while(循环执行条件表达式)语句while(循环执行条件表达式)begin end或语句 while64http:/bbs.chinafm.org/(工管之家管理资料免费下载)module count1s_while(count,rega,clk);output3:0 count;input 7:0 rega;input clk;reg3:0 count;always(posedge clk)begin:count1 reg7:0 tempreg;/用作循环执行条件表达式 count=0;/count初值为0 tempreg=rega;/tempreg 初值为rega while(tempreg)/若tempreg非0,则执行以下语句 begin if(tempreg0)count=count+1;/只要tempreg最低位为1,则 count加1 tempreg=tempreg 1;/右移1位 end endendmodule例 对一个8位二进制数中值为1的位进行计数。改变循环执行条件表达式的值如何用for语句改写此程序呢?语句65http:/bbs.chinafm.org/(工管之家管理资料免费下载)无条件连续执行forever后面的语句或语句块。forever 语句forever begin end或v常用在测试模块中产生周期性的波形,作为仿真激励信号。v常用disable语句跳出循环!注:不同于always语句,不能独立写在程序中,一般用在initial语句块中!initial begin:Clocking clk=0;#10 forever#10 clk=!clk;endinitial begin:Stimulus disable Clocking;/停止时钟 end 语句 forever语句66http:/bbs.chinafm.org/(工管之家管理资料免费下载)initial说明语句 只执行一次always说明语句不断重复执行,直到仿真 结束task说明语句 可在程序模块中的一处或 多处调用function说明语句可在程序模块中的一处 或多处调用语句 结构说明语句67http:/bbs.chinafm.org/(工管之家管理资料免费下载)always块语句包含一个或一个以上的声明语句(如:过程赋值语句、任务调用、条件语句和循环语句等),在仿真运行的全过程中,在定时控制下被反复执行。语句 结构说明语句在always块中被赋值的只能是register型变量(如reg,integer,real,time)。每个always块在仿真一开始便开始执行,当执行完块中最后一个语句,继续从always块的开头执行。68http:/bbs.chinafm.org/(工管之家管理资料免费下载)always 注1:如果always块中包含一个以上的语句,则这些语句必须放在begin_end或fork_join块中!always (posedge clk or negedge clear)begin if(!clear)qout=0;/异步清零 else qout=1;end 语句69http:/bbs.chinafm.org/(工管之家管理资料免费下载)70例生成一个0延迟的无限循环跳变过程形成仿真死锁 always areg=areg;例在测试文件中,用于生成一个无限延续的信号波形时钟信号注2:always语句必须与一定的时序控制结合在一起才有用!如果没有时序控制,则易形成仿真死锁!define half_period 50 module half_clk_top;reg reset,clk;/输入信号 wire clk_out;/输出信号 always#half_period clk=clk;endmodule语句70http:/bbs.chinafm.org/(工管之家管理资料免费下载)always ()begin /过程赋值语句 /if语句 /case语句 /while,repeat,for循环 /task,function调用 end一般为输入敏感信号表达式又称事件表达式或敏感表,当其值改变时,则执行一遍块内语句;在敏感信号表达式中应列出影响块内取值的所有信号!敏感信号可以为单个信号,也可为多个信号,中间需用关键字or连接!敏感信号不要为x或z,否则会阻挡进程!always块语句一个变量不能在多个always块中被赋值!语句71http:/bbs.chinafm.org/(工管之家管理资料免费下载)always的时间控制可以为沿触发,也可为电平触发。关键字posedge表示上升沿;negedge表示下降沿。always(posedge clock or posedge reset)begin endalways(a or b or c)begin end由两个沿触发的always 块由多个电平触发的always 块语句72http:/bbs.chinafm.org/(工管之家管理资料免费下载)73always块语句是用于综合过程的最有用的语句之一,但又常常是不可综合的。为得到最好的综合结果,always块程序应严格按以下模板来编写:模板1always (Inputs)/所有输入信号必须列出,用or隔开 begin /组合逻辑关系 end 模板2always (Inputs)/所有输入信号必须列出,用or隔开 if(Enable)begin /锁存动作 end 语句73http:/bbs.chinafm.org/(工管之家管理资料免费下载)模板3always (posedge Clock)/Clock only begin /同步动作 end 模板4always (posedge Clock or negedge Reset)/Clock and Reset only begin if(!Reset)/测试异步复位电平是否有效 /异步动作 else /同步动作 end /可产生触发器和组合逻辑语句74http:/bbs.chinafm.org/(工管之家管理资料免费下载)当always块有多个敏感信号时,一定要采用if-else if语句,而不能采用并列的if语句!否则易造成一个寄存器有多个时钟驱动,将出现编译错误。always posedge min_clk or negedge reset)begin if(reset)min=0;else if(min=8h59)/当reset无效且min=8h59时 begin min=0;h_clk=1;end end 通常采用异步清零!只有在时钟周期很小或清零信号为电平信号时采用同步清零。千万别写成if哦!语句75http:/bbs.chinafm.org/(工管之家管理资料免费下载)initial begin 语句1;语句2;语句n;end格式 例 利用initial语句生成激励波形。initial begin inputs=b000000;#10 inputs=b011001;#10 inputs=b011011;#10 inputs=b011000;#10 inputs=b001000;end在仿真的初始状态对各变量进行初始化;在测试文件中生成激励波形作为电路的仿真信号。语句 initial语句76http:/bbs.chinafm.org/(工管之家管理资料免费下载)parameter size=16;reg3:0 addr;reg reg1;reg7:0 memory0:15;initial begin reg1=0;for(addr=0;addrsize;addr=addr+1);memoryaddr=0;end例 对各变量进行初始化。语句77http:/bbs.chinafm.org/(工管之家管理资料免费下载)除module以外,Verilog还提供了任务(task)和函数(function)可重复调用定义和调用都包含在module内部语句78http:/bbs.chinafm.org/(工管之家管理资料免费下载)task和function语句分别用来由用户定义任务和函数。任务和函数往往是大的程序模块中在不同地点多次用到的相同的程序段。利用任务和函数可将一个很大的程序模块分解为许多较小的任务和函数,便于理解和调试。输入、输出和总线信号的值可以传入、传出任务和函数。语句 task和function语句79http:/bbs.chinafm.org/(工管之家管理资料免费下载)task 任务名;/无需定义端口名列表端口与类型说明;/调用时按顺序和类型列出局部变量说明;块语句endtask当希望能够对一些信号进行一些运算并输出多个结果(即有多个输出变量)时,宜采用任务结构。常常利用任务来帮助实现结构化的模块设计,将批量的操作以任务的形式独立出来,使设计简单明了。语句(端口1,端口2,);80http:/bbs.chinafm.org/(工管之家管理资料免费下载).always(posedge sys_clk)begin if(read_request=1)begin read_mem(IR,PC);/Event and function calls end endtask read_mem;output 15:0 data_in;input 15:0 addr;always(posedge read_grant)beginADDRESS=addr;#15 data_in=data;endendtask.语句注1:任务的定义与调用必须在一个module模块内!注2:任务被调用时,需列出端口名列表,且必须与任务定义中的I/O变量一一对应!注3:一个任务可以调用其他任务和函数。81http:/bbs.chinafm.org/(工管之家管理资料免费下载)例 通过任务调用完成4个4位二进制输入数据的冒泡排序。任务的定义任务的调用82http:/bbs.chinafm.org/(工管之家管理资料免费下载)function函数的目的是通过返回一个用于某表达式的值,来响应输入信号。适于对不同变量采取同一运算的操作。函数在模块内部定义,通常在本模块中调用,也能根据按模块层次分级命名的函数名从其他模块调用。而任务只能在同一模块内定义与调用!语句83http:/bbs.chinafm.org/(工管之家管理资料免费下载)语句Functionfunction 函数名;输入端口与类型说明;局部变量说明;块语句endfiction注意:1.函数不能调用任务,任务可调用任何其他函数和任务 2.函数只有输入变量且至少一个 3.函数定义的块语句不许出现定时控制 4.函数通过函数名返回一个值缺省则返回1位reg型数据()与函数定义中的输入变量对应!84http:/bbs.chinafm.org/(工管之家管理资料免费下载)always(posedge sys_clk)begin .IR=swap_bits(IR);.endfunction 15:0 swap_bits;input 15:0 in_vec;reg 15:0 temp_reg;integer i;begin for(I=15;I=0;I=I-1)temp_reg15-i=in_veci;swap_bits=temp_reg;endendfunctioin语句85http:/bbs.chinafm.org/(工管之家管理资料免费下载)语句注1:函数的调用是通过将函数作为调用函数的表达式中的操作数来实现的!注2:函数在综合时被理解成具有独立运算功能的电路,每调用一次函数,相当于改变此电路的输入,以得到相应的计算结果。86http:/bbs.chinafm.org/(工管之家管理资料免费下载)函数的使用规则函数的定义不能包含任何时间控制语句用延迟#、事件控制或等待wait标识的语句。函数不能启动(即调用)任务!定义函数时至少要有一个输入参量!且不能有任何输出或输入/输出双向变量。在函数的定义中必须有一条赋值语句,给函数中的一个内部寄存器赋以函数的结果值,该内部寄存器与函数同名。语句87http:/bbs.chinafm.org/(工管之家管理资料免费下载)例 利用函数对一个8位二进制数中为0的位进行计数。只有输入变量内部寄存器对应函数的输入变量语句88http:/bbs.chinafm.org/(工管之家管理资料免费下载)任务(任务(task)函数(函数(function)目的或用途目的或用途 可计算多个多个结果值通过返回一个一个值,来响应输入信号输入与输出输入与输出 可为各种类型(包括inout型)至少有一个输入变量,但不能有任何output或inout型变量被调用被调用只可在过程过程赋值语句中调用,不能在连续赋值语句中调用可作为表达式中的一个操作数来调用,在过程过程赋值和连续连续赋值语句中均可调用调用其他任调用其他任务和函数务和函数任务可调用其他任任务务和函数函数函数可调用其他函数,但不可调用其他任务返回值返回值不向表达式返回值向调用它的表达式返回一个值任务与函数的区别语句89http:/bbs.chinafm.org/(工管之家管理资料免费下载)语句“编译预处理”是Verilog HDL编译系统的一个组成部分。编译预处理语句以西文符号“”开头注意,不是单引号“”!在编译时,编译系统先对编译预处理语句进行预处理,然后将处理结果和源程序一起进行编译。90http:/bbs.chinafm.org/(工管之家管理资料免费下载)define语句宏定义语句用一个指定的标志符(即宏名)来代表一个字符串(即宏内容)。宏定义的作用:以一个简单的名字代替一个长的字符串或复杂表达式;以一个有含义的名字代替没有含义的数字和符号。define 标志符(即宏名)字符串(即宏内容)例 define IN ina+inb+inc+ind宏展开在编译预处理时将宏名替换为字符串的过程。语句91http:/bbs.chinafm.org/(工管之家管理资料免费下载)关于宏定义的说明宏名可以用大写字母,也可用小写字母表示;但建议用大写字母,以与变量名相区别。define语句可以写在模块定义的外面或里面。宏名的有效范围为定义命令之后到源文件结束。在引用已定义的宏名时,必须在其前面加上符号“”!使用宏名代替一个字符串,可简化书写,便于记忆,易于修改。语句92http:/bbs.chinafm.org/(工管之家管理资料免费下载)关于宏定义的说明预处理时只是将程序中的宏名替换为字符串,不管含义是否正确。只有在编译宏展开后的源程序时才报错。宏名和宏内容必须在同一行中进行声明!宏定义不是Verilog HDL语句,不必在行末加分号!如果加了分号,会连分号一起置换!语句93http:/bbs.chinafm.org/(工管之家管理资料免费下载)例 module test;reg a,b,c,d,e,out;define expression a+b+c+d;assign out=expression+e;经过宏展开后,assign语句为:assign out=a+b+c+d;+e;/出现语法错误!错误!语句94http:/bbs.chinafm.org/(工管之家管理资料免费下载)例 module test;reg a,b,c;wire out;define aa a+b define cc c+aa /引用已定义的宏名aa 来定义宏cc assign out=cc;经过宏展开后,assign语句为:assign out=c+a+b;语句在进行宏定义时,可引用已定义的宏名,实现层层置换。95http:/bbs.chinafm.org/(工管之家管理资料免费下载)文件包含语句一个源文件可将另一个源文件的全部内容包含进来。include“文件名”预处理后include“file2.v”Afile1.vBfile2.vABfile1.v将file2.v中全部内容复制插入到include“file2.v”命令出现的地方格式语句 include语句96http:/bbs.chinafm.org/(工管之家管理资料免费下载)使用include语句的好处避免程序设计人员的重复劳动!不必将源代码复制到自己的另一源文件中,使源文件显得简洁。(1)可以将一些常用的宏定义命令或任务(task)组成一个文件,然后用include语句将该文件包含到自己的另一源文件中,相当于将工业上的标准元件拿来使用。(2)当某几个源文件经常需要被其他源文件调用时,则在其他源文件中用include语句将所需源文件包含进来。语句97http:/bbs.chinafm.org/(工管之家管理资料免费下载)例 用include语句设计16位加法器adder模块位拼接改变被引用模块adder中的参数size为my_size98http:/bbs.chinafm.org/(工管之家管理资料免费下载)一个include语句只能指定一个被包含的文件;若要包含n个文件,需用n个include语句。include语句可出现在源程序的任何地方。被包含的文件若与包含文件不在同一子目录下,必须指明其路径!include“aaa.v”“bbb.v”/非法!include“parts/coun
展开阅读全文