Verilog HDL中循环语句用来控制执行语句的执行次数,共有四种循环语句。

forever语句

  1. repeat语句
  2. while语句
  3. for语句

1.forever语句:
forever语句的格式为forever        语句或forever        begin 多条语句 end

forever循环语句常用于产生周期性的波形,用来作为仿真测试信号。它与always语句的不同之处在于,不能独立写在程序中,必须写在initial块中。

2.repeat语句:

repeat语句的格式为:repeat(表达式)        语句 或 repeat(表达式)        begin 多条语句 ;end

在repeat语句中,其表达式通常为常量表达式。

例如:使用repeat循环语句及加法和移位操作来实现一个乘法器:

parameter size = 8,longsize = 16;
reg [size:1] opa,opb;
reg [longsize:1] result;
    
    begin: mult
        reg [longsize:1] shift_opa,shift_opb;
        shift_opa = opa;
        shift_opb = opb;
        result = 0;
        repeat(size)
        
        begin
            if(shift_opb[1])
                result = result + shift_opa;
            
            shift_opa = shift_opa<<1;
            shift_opb = shift_opb>>1;
        end
end

3.while语句:
while语句的格式:

while(表达式)语句;

while(表达式)        begin 多条语句 ; end

例如:用while循环语句对rega八位二进制中值为1的位进行计数:

begin : countls
    reg[7:0] tempteg;
    count = 0;
    tempreg = rega;
    while(tempreg)
        begin
            if(tempreg [0]) count = count +1;
            tempreg = tempreg>>1;
        end
end

4.for语句:

for语句的形式为:

for(表达式1;表达式2;表达式3)语句;

执行过程:

(1)先求解表达式1。

(2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行第(3)步,若为假(0),则结束循环,转到第5步。

(3)若表达式为真,在执行指定的语句后,求解表达式3。

(4)转回上面的第(2)步继续执行。

(5)执行for语句下面的语句。

for语句形式:

for(循环变量赋初值;循环结束条件;循环变量增值)
        执行语句;
for循环语句实际上相当于采用while循环语句建立以下的循环结构:
begin
        循环变量赋初值;
        while(循环结束条件)
                begin
                        执行语句;
                        循环变量增值;
                end
end

这样对于需要8条语句才能完成的一个循环控制,for循环语句只需要两条即可。

【例1】用for语句初始化memory:

begin : init_mem
    reg[7:0] tempi;
        for(tempi = 0;tempi<memsize;tempi = tempi + 1)
            memory[tempi] = 0;
end

【例2】用for循环语句来实现乘法器:前面已用repeat语句实现,这里用for语句实现:

parameter size = 8,longsize = 16;
reg [size:1] opa,opb;
reg [longsize:1] result;
    
    begin: mult
        integer bindex;
        result = 0;
        for(bindex = 1;bindex <= size;bindex = bindex + 1)
            if(opb[bindex])
                result = result + (opa<<(bindex - 1 ));
end

在for语句中,循环变量增值表达式可以不必是一般的常规加法或减法表达式。

【例3】对rega八位二进制数中值位1的位进行计数:

begin : countls
    reg[7:0] tempteg;
    count = 0;
    for(tempreg = rega;tempreg;tempreg>>1)
        if(tempreg[0])
            count = count + 1;
end