资源描述
第五章第五章 常用常用Verilog语法之三语法之三o条件语句o循环语句o生成块7/23/20241第五章第五章 常用常用Verilog语法之三语法之三o条件语句if-elsen if(表达式)语句;if(ab)out=int1;n if(表达式)语句1;else 语句2;if(ab)out1=int1;else out1=int2;7/23/20242第五章第五章 常用常用Verilog语法之三语法之三o条件语句if-elsenif(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;.else if(表达式m)语句m;else 语句n;7/23/20243第五章第五章 常用常用Verilog语法之三语法之三o说明nIf后面都有表达式,为逻辑表达式或关系表达式逻辑表达式或关系表达式。系统对表达式的值进行判断,若为0,x,z,按假处理;若为1,按真处理,按真处理,执行指定的语句。n else前面有一分号,整个语句结束有一分号n if和else后面可以包含一个内嵌的操作语句,也可以有多个操作语句,此时用begin和end这两个关键词将几个语句包含起来成为一个复合块语句,此时end之后无需分号;7/23/202447/23/20245第五章第五章 常用常用Verilog语法之三语法之三o说明n条件语句必须在过程块语句中使用过程块语句中使用,即由initial和always语句引导的执行语句集合。除这两种块语句引导的“begin-end”块中可以编写条件语句外,模块的其他地方都不能编写。7/23/20246第五章第五章 常用常用Verilog语法之三语法之三o说明n允许一定形式的表达式简写方式。if(expression)等价于 if(expression=1)if(!expression)等价于 if(expression!=1)7/23/20247第五章第五章 常用常用Verilog语法之三语法之三o说明nIf语句的嵌套。if(expression1)if(expression2)语句1;else 语句2;elseif(expression3)语句3;else 语句4;7/23/20248o注意if与else的配对关系,else总是与它上面的最近的if配对。如果if与else的数目不一样,为了实现程序设计者的意图,可以用begin_end块语句来确定配对关系。7/23/20249第五讲第五讲 常用常用Verilog语法之三语法之三ocase语句多分支选择语句ncase(表达式)endcasencasez(表达式)endcasencasex(表达式)endcasen case分支项的一般格式:分支表达式:语句;default:语句;7/23/202412第五章第五章 常用常用Verilog语法之三语法之三ocase括号内的表达式为控制表达式,case分支项中得表达式称为分支表达式。o当控制表达式的值与分支表达式的值相同控制表达式的值与分支表达式的值相同时,就执行分支表达式后面的语句。如果所有分支表达式的值都没有与控制表达式的值相匹配,就执行default后面的语句;odefault项可有可无,一个case语句里只允许有一个一个default项。7/23/202413第五章第五章 常用常用Verilog语法之三语法之三7/23/202414o每个case分项分支表达式值必须不同分支表达式值必须不同,否则会出现矛盾。o执行完case分项后的语句,则跳出该case语句结构,终止case语句的执行;o在用case语句表达式进行比较的过程中,只有当信号的对应位的值能明确进行比较时,比当信号的对应位的值能明确进行比较时,比较才能成功较才能成功;ocase语句的所有表达式值的位宽必须相等所有表达式值的位宽必须相等;7/23/202415第五章第五章 常用常用Verilog语法之三语法之三ocasez:不考虑高阻z的比较过程;ocasex:不考虑高阻z和不定值x的比较过程;7/23/2024167/23/202417ocasez:不考虑高阻z的比较过程;ocasex:不考虑高阻z和不定值x的比较过程;7/23/202418第五章第五章 常用常用Verilog语法之三语法之三7/23/202419o使用条件语句不当,在设计中生成了原本没想生成了原本没想到的锁存器到的锁存器n不正确使用if语句7/23/202420第五章第五章 常用常用Verilog语法之三语法之三o使用条件语句不当在设计中生成了原本没想到的锁存器n不正确使用if语句7/23/202422第五章第五章 常用常用Verilog语法之三语法之三o使用条件语句不当在设计中生成了原本没想到有的锁存器n不正确使用case语句,缺少default语句。7/23/202424第五章第五章 常用常用Verilog语法之三语法之三o使用条件语句不当在设计中生成了原本没想到有的锁存器n不正确使用case语句,缺少default语句。7/23/202426第五章第五章 常用常用Verilog语法之三语法之三o如果用到if语句,最好写上else项;o若用case语句,最好写上default项。可以避免生成锁存器。7/23/202428第五章第五章 常用常用Verilog语法之三语法之三ocase语句的行为类似于多路选择器module mux4_to_1(out,io,i1,i2,i3,s1,s0);output out;input io,i1,i2,i3;input s1,s0;reg out;always(s1 or s0 or i0 or i1 or i2 or i3)begincase(s1,s0)2b00:out=i0;2b01:out=i1;2b10:out=i2;2b11:out=i3;default:out=1bx;end case end endmodule第五章第五章 常用常用Verilog语法之三语法之三5.2 循环语句循环语句oforever:连续的执行语句orepeat:连续执行一条语句n次owhile:执行一条语句直到某个条件不满足ofor循环7/23/2024305.2 循环语句循环语句oforever:连续的执行语句,用于产生周期性波形,必须写在initial块中。forever 语句;orforever begin 多条语句;end7/23/2024315.2 循环语句循环语句orepeat语句repeat(表达式)语句;orrepeat(表达式)begin 多条语句;end7/23/2024327/23/202433owhile循环语句while(表达式)语句;orwhile(表达式)begin 多条语句;end7/23/2024345.2 循环语句循环语句7/23/202435ofor循环语句for(表达式1;表达式2;表达式3)语句;for(循环变量赋初值;循环结束条件;循环变量增值);7/23/2024365.2 循环语句循环语句ofor循环相当于采用while语句建立以下循环结构begin循环变量赋初值;while(循环结束条件)begin执行语句;循环变量增值;endend5.2 循环语句循环语句begin:init_memreg7:0 tempi;for(tempi=0;tempimemsize;tempi=tempi+1)memorytempi=0;end7/23/2024397/23/202440生成块生成块o生成语句可以动态的生成动态的生成Verilog代码代码,方便参数化模块的生成,简化程序的编写。n对矢量中的多个位矢量中的多个位进行重复操作n进行多个模块的实例引用多个模块的实例引用的重复操作n根据参数的定义确定程序中是否应该包含某段确定程序中是否应该包含某段Verilog代码代码;n生成语句必须用在必须用在module内部内部,用来生成该module内部的程序代码生成块生成块o生成实例可以包含以下的一个或多种类型n模块(module instance)n用户定义原语;(primitive instance)n门级原语;n连续赋值语句;ninitial和always块;(procedural block)ntask 和funciton生成块生成块o编写代码时必须在模块中说明生成的实例范生成的实例范围,关键字围,关键字generateendgenerate用来指定该范围。oVerilog允许在生成范围内声明下列数据类型nnet(网络)、reg(寄存器);ninteger,real,time,realtimenevent(事件)o生成的数据类型具有唯一的标识名,可以被层次引用,也可以使用defparam声明的参数重新定义生成块生成块o任务和函数任务和函数的声明也允许出现在生成范围之中,但不能出现在循环生成当中。o任务和函数具有唯一的标识符名称,可以被层次引用。o不允许不允许出现在生成范围之中的模块项声明包括n参数、局部参数;n输入、输出和输入/输出声明;n指定块。生成语句的基本结构生成语句的基本结构生成块生成块oVerilog中有3种创建生成语句的方法n循环生成;n条件生成;ncase声成。生成语句的基本结构生成语句的基本结构循环生成语句循环生成语句module bitwise_xor(out,i0,i1);parameter N=32;outputN-1:0 out;inputN-1:0 i0,i1;genvar j;generatefor(j=0;jN;j=j+1)begin:xor_loopxor g1(outj,i0j,i1j);endendgenerateendmoduleo对于xor,相当于生成以下语句 xor_loop0.g1,xor_loop1.g1,.xor_loop31.g1,生成语句生成语句o生成块的本质是使用循环内的一条语句来代替多条重使用循环内的一条语句来代替多条重复的复的Verilog语句语句,简化用户的编程。o关键词genvar用于声明生成变量,只能用在生成块中,在仿真过程中,生成变量是不存在的o循环生成语句可以嵌套使用,不过使用同一个生成变量作为索引的循环生成语句不能够相互嵌套;oXor_loop是循环生成语句的名字,目的在于通过它对循环生成语句中的变量进行层次化引用。因此,循环生成的各个异或门的相对层次名为:xor_loop0.g1,xor_loop1.g1 ,xor_loop2.g1,.,module ripple_adder(co,sum,a0,a1,ci);parameter N=4;outputN-1:0 sum;output co;inputN-1:0 a0,a1;input ci;wireN:0 carry;assign carry0=ci;genvar i;generate for(i=0;iN;i=i+1)begin:r_loopwire t1,t2,t3;xor g1(t1,a0i,a1i);xor g2(sumi,t1,carryi);and g3(t2,a0i,a1i);and g4(t3,t1,carryi);or g5(carryi+1,t2,t3);endendgenerateassign co=carry4;endmodule条件生成语句条件生成语句defparamo在一个模块中显式地显式地改变另一个模块的参数时(参数的重新定义),需要使用defparam命令n只有parameter 参数可以被重新定义,localparam,specparam参数不能被重新定义;case 生成语句生成语句module adder(co,sum,a0,a1,ci);parameter N=4;outputN-1:0 sum;output co;inputN-1:0 a0,a1;input ci;generate case(N)1:adder_1bit adder1(co,sum,a0,a1,ci);2:adder_2bit adder2(co,sum,a0,a1,ci);default:adder_cla#(N)adder3(co,sum,a0,a1,ci);endcaseendgenerateendmodulemodule counter(Q,clock,clear);output3:0 Q;input clock,clear;reg3:0 Q;always(posedge clear or negedge clock)beginif(clear)Q=4d0;elseQ=Q+1;endendmodule
展开阅读全文