常用VerilogHDL语法一、模块的结构Verilog的基本设计单元是“模块”。一个模块由两部分组成,一部分描述接口,另一部分描述逻辑功能。Verilog结构位于module和endmodule声明语句之间,每个Verilog程序包括4个主要部分:端口定义、I/O说明、内部信号声明和功能定义。1、模块的端口定义模块的端口声明了模块的输入输出口。其格式如下:modulemodule_name(port_list);在引用模块时其端口可以用两种方法连接:(1)在引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名:模块名(连接端口1信号名,连接端口2信号名,……,)(2)在引用时用“.”符号,标明原模块是定义时规定的端口名,模块名(.端口1名(连接信号1名),端口2名(连接信号2名),……,)2、I/O说明的格式(1)输入口:input[信号位宽-1:0]端口名i(2)输出口:output[信号位宽-1:0]端口名i(3)输入输出口:inout[信号位宽-1:0]端口名i3、内部信号说明在模块内用到的和端口有关的wire和reg类型变量的声明:reg[width-1:0]R变量1,R变量2,…wire[width-1:0]W变量1,W变量2,…4、功能定义(1)用“assign”声明语句,只需写一个“assign”,后面再加一个方程式即可,如:assigna=b&c(2)用实例元件,此方法像在电路图输入方式下调入库元件一样,键入元件的名字和相连的引脚即可,如and#2u1(q,a,b),表示用一个跟与门(and)一样的名为u1的门,其输入端为a,b,输出为q,输出延迟为2个单位时间(3)用“always”块:always时序控制执行语句,如:alwaysareg=~areg上述三个功能定义在verilog结构中是同时执行的,在同一模块文件中,它们的顺序不会影响实现的功能二、数据类型及其常量及变量1、常量1.1数字(1)整数:4种表示方式:二进制(b或B);十进制(d或D);十六进制(h或H);八进制(o或O)数字表达方式如下:位宽进制数字,其中位宽可以缺省,默认值根据不同机器有所不同,常为32位;进制也可以缺省,默认值为十进制。如:8‘b10101100,表示位宽为8,二进制,值为10101100(2)x和z值,x代表不定值,z代表高阻值。X可以用来定义十六进制的4位二进制数的状态,八进制的3位,二进制的1位,z的表示方式同x,z还可以表达为“?”,如12’dz=12’d?(3)负数,只要在数字定义式的最前面加上一个负号即可表示(4)下划线:下划线可以用来分隔数的表达以提高程序的可读性,但不可用于位宽和进制处,如16’b1010_1100_1001_0011(合法)8’b_1010_1100(非法)1.2、参数(parameter)型用parameter来定义一个标识符代表一个常量,成为符号常量,即标识符形式的常量,采用标识符代表一个常量可提高程序的可读性和可维护性。其说明格式如下:Parameter参数名1=表达式,参数名2=表达式,…….例:parametermsh=7;定义参数msh为常数7Parametere=25,f=29;定义两个常数参数2、变量2.1wire型Wire型数据常用来表示以assign关键字制定的组合逻辑信号。Verilog程序模块中输入、输出信号类型默认时自动定义为wire型。Wire型信号可以用作任何方程式的输入,也可以用作“assign”语句或实例元件的输出。其定义格式为:wire[n-1:0]数据名1,数据名2,…….2.2reg型reg型数据常用来表示“always”模块内的指定信号,常代表触发器。通常,在设计中要在always模块通过使用行为描述语句来表达逻辑关系,在always块内被赋值的每一个信号都必须定义为reg型。Reg型数据的格式如下:reg[n-1:0]数据名1,数据名2,…….2.3memory型Verilog通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器、ROM型存储器和reg文件。Memory型数据是通过扩展reg型数据的地址范围来生成的。其格式为:reg[n-1:0]存储器名[m-1:0]reg[n-1:0]定义了存储器中每一个存储单元的大小,即该存储器单元是一个n位的寄存器;存储器名后的[m-1:0]则定义了该存储器中有多少个这样的存储器。例reg[7:0]mema[255:0];定义了一个名为mema的存储器,该存储器有256个8位寄存器。三、运算符及表达式1、算术操作符+(加)-(减)*(乘)/(除)%(取模或求余)2、按位操作符~(按位非)&(按位与)|(按位或)^(按位异或)~^,^~(按位异或非,同或)3、逻辑操作符&&(逻辑与)||(逻辑或)!(逻辑非)4、关系操作符(大于)(小于)=(不小于)=(不大于)5、相等关系操作符:==(逻辑相等)!=(逻辑不等)===(全等)!==(非全等)6、移位操作符(左移)(右移)其使用方法如下:an;an;a代表要移位的操作数,n代表要移n位7、verilog语言中有一个特殊的运算符,位拼接运算符,用这个运算符可以把两个或多个信号的某些为拼接起来来进行运算操作。其方法如下:{信号1的某几位,信号2的某几位,……},其中不允许存在没有指明位数的信号。{a,b[3:0],w,3’101}还可以用重复法来简化表示,如{4{w}}8、缩减运算符是对单个操作数进行或、与、非递推运算,最后的运算结果是1位二进制数例如:reg[3:0]B;regC;C=&B相当于C=B[0]&B[1]&B[2]&B[3]四、赋值语句与块结构1、赋值语句(1)非阻塞赋值方式(如b=a)特点:块结束后才完成赋值操作;b的值并不是立即改变的。注意:此例中的=并非小于等于符号,而是赋值符号,其功能同=,只是非阻塞方式的。(2)阻塞赋值方式(如b=a)特点:赋值语句执行完后,块才结束;b的值在赋值语句执行完后立刻就改变的。2、块结构(1)顺序块特点:块内的语句是按顺序执行的;每条语句的延迟时间是相对于前一条语句的仿真时间而言的;直到最后一条语句执行完,程序流程控制才跳出该语句块其格式为:begin语句1;语句2;…end(2)并行块特点:块内的语句是同时执行的;块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的;延迟时间是用来给赋值语句提供执行时序的;当按时间时序排序在最后的语句执行完成后,跳出块。其格式为:fork语句1;语句2;…join五、条件语句与循环语句1、条件语句:(1)if(表达式1)语句1;elseif(表达式2)语句2;…else语句n;(2)case语句case(表达式)case分支项endcasecasez(表达式)case分支项endcase用来处理不考虑高阻值的比较过程;casex(表达式)case分支项endcase用来处理将高阻值z和不定值x都视为不关心的情况2、循环语句(1)forever语句连续的执行语句(2)repeat(表达式)语句连续执行一条语句n次,n为表达式中的值(3)while(表达式)语句执行一条语句知道表达式中的条件不能满足(4)for(表达式1;表达式2;表达式3)语句它的执行过程为:第一步:先求解表达式1;第二步:再求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第三步;若为假(0),则结束循环,转到第五步;第三步:若表达式2为真,在执行指定的语句后,求解表达式3;第四步:转回第二步继续执行;第五步:执行for语句下面的语句。例:begin:init_memreg[7:0]tempi;for(tempi=0;tempimemsize;tempi=tempi+1)memory[tempi]=0;end用来初始化memory例:三八译码器moduledecoder_38(out,in);output[7:0]out;input[2:0]in;reg[7:0]out;always@(in)begincase(in)3'd0:out=8'b11111110;3'd1:out=8'b11111101;3'd2:out=8'b11111011;3'd3:out=8'b11110111;3'd4:out=8'b11101111;3'd5:out=8'b11011111;3'd6:out=8'b10111111;3'd7:out=8'b01111111;endcaseendendmodule参考数目:Verilog数字系统设计教程,夏宇闻编著,北京航空航天大学出版社