如果用到if语句最好写上else项;
如果用case语句最好写上default项。
3.条件语句的语法
If else表示的条件语句共有3种类型:
//第一类条件语句
if ( !lock ) buffer = data ;
if ( enable ) out = in ;
//第二类条件语句
if (number_queued < MAX_Q_DEPTH)
begin
data_queue = data ;
number_queued = number_queued + 1 ;
end
else
$display ( " Queue Full. Try again " ) ;
//第三类条件语句
//根据不同的算术逻辑单元的控制信号 alu_control 执行不同的算术运算操作
if ( alu_control = = 0 )
y = x + z ;
else if ( alu_control = = 1 )
y = x - z ;
else if ( alu_control = = 2 )
y = x * z ;
else
$ display ( " Invalid ALU control signal ");
reg [ 1: 0] alu_control ;
case (alu_control)
2 'd 0 : y = x + z ;
2 'd 1 : y = x - z ;
2 'd 2 : y = x * z ;
default : $display ( "Invalid ALU control signal ") ;
endcase
4.多路分支语句
case语句 case endcase default
5.循环语句
(1)forever语句:连续的执行语句。
(2)repeat语句:连续执行一条语句n次。
(3)while语句:执行一条语句直到某个条件不满足。如果一开始就不满足则语句一次也不执行。
(4)for语句通过以下3个步骤决定语句的循环次数
1)先给控制循环次数的变量赋初值。
2)判定控制循环的表达式的值,为假则跳出循环语句,为真则执行指定的语句。
3)执行一条赋值语句来修正控制循环变量次数的变量的值,返回第二步。
forever语句格式
Forever 语句;
或
Forever begin 多条语句 end
forever循环语句常用于生产周期性的波形,用来作为仿真测试信号。
它与always语句不同之处在于不能独立写在程序中,而必须写在initial块中。
repeat语句格式
repeat(表达式)语句
或
Repeat(表达式)begin多条语句;end
在repeated语句中,其表达式通常为常量表达式。
while语句格式
while(表达式)语句;
或
while(表达式)begin多条语句;end
for语句格式
for(表达式1;表达式2;表达式3)语句;
例子:
用for语句来初始化memory
begin: init_mem
reg[7:0] tempi;
for(tempi=0;tempi<memsize;tempi=tempi+1)
memory[tempi]=0;
end
用for语句来实现乘法器。
parameter size = 8, longsize = 16;
reg[size:1] opa, opb;
reg[longsize:1] result;
//另外一种编写形式
//异或门可以用always块来替代
// reg [ N-1 : 0] out ;
// generate
// for ( j = 0 ; j < N ; j = j + 1 )
// begin : bit
// always @ ( i0 [ j ] or i1 [ j ] ) out [ j ] = i0 [ j ] ^ i0 [ j ] ;
// end
// endgenerate
endmodule
//本模块生成一个门级脉动加法器
module ripple_adder ( co , sum , a0 , a1 , ci ) ;
//参数声明语句,参数可以重新定义。
parameter N = 4 ; // 缺省的总线位宽为4
//端口声明语句
output [ N-1 : 0 ] sum ;
output co ;
input [N-1 : 0 ] a0 , a1 ;
input ci ;
//本地线网声明语句
wire [N-1 : 0 ] carry ;
//指定进位变量的第0位等于进位的输入
assign carry [0] = ci ;
//声明临时循环变量。该变量只用于生成块的计算。
//由于在仿真前,循环生成已经展平,所以用Verilog对
//设计进行仿真时,该变量已经不再存在。
genvar i ;
//用一个单循环生成按位异或门等逻辑
generate for ( i = 0 ; i < N ; i = i + 1 ) begin : r_loop
wire t1 , t2 , t3 ;
xor g1 ( t1 , a0[ i ] , a1 [ i ] ) ;
xor g2 ( sum [ i ] , t1 , carry [ i ] ) ;
and g3 ( t2 , a0[ i ] , a1 [ i ] ) ;
and g4 ( t3 , t1 , carry [ i ] ) ;
or g5 (carry [ i + 1 ] , t2 , t3 ) ;
end // 生成块内部循环的结束
endgenerate //生成块的结束