欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【 Verilog HDL 】循环语句总结

程序员文章站 2022-07-14 22:42:20
...

目录

 

综述

forever语句

repeat语句

while语句

for语句


综述

在Verilog HDL中存在四种类型的循环语句,用来控制执行语句的执行次数。

1) forever  连续的执行语句。

2) repeat  连续执行一条语句 n 次。

3) while  执行一条语句直到某个条件不满足。如果一开始条件即不满足(为假),则语句一次也不能被执行。

4) for通过以下三个步骤来决定语句的循环执行。

a) 先给控制循环次数的变量赋初值。

b) 判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到第三步。

c) 执行一条赋值语句来修正控制循环变量次数的变量的值,然后返回第二步。

从上面的描述,可见,for语句和while语句和C语言中的语法还是基本一致的。

我们在硬件描述语言(HDL)中,更需要考虑的是,这些循环语句的应用场合,有的循环语句是可以综合的,而另一些循环语句则是不可以综合的。可以综合的循环语句的使用也需要遵循一定的规则,循环语句一般用于写测试文件(testbench文件),例如产生时钟等,使用起来十分的方便。

for,while,repeat是可综合的,但循环的次数需要在编译之前就确定,动态改变循环次数的语句是不可综合的。forever语句是不可综合的,主要用于产生各种仿真激励。


下面分别介绍:

forever语句

forever语句的格式如下:

forever 语句; 或

forever  begin 多条语句  end

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

例如:

产生一个时钟信号可以这么写:

`timescale 1ns/1ps
module name;

...
...
//generate clock

initial clk = 1'b0;

always #10 clk = ~clk;

...
...

endmodule

这是其中的一种方式,我比较喜欢使用这种方式写一个时钟。

那么如果用forever怎么写一个时钟呢?

写时钟之前,我们必须关注上面提示的一句话:forever循环语句常用于产生周期性的波形,用来作为仿真测试信号。它与always语句不同处在于不能独立写在程序中,而必须写在initial块中。

我们根据这个原则来写一个时钟:

`timescale 1ns/1ps
module name;

...
...
//generate clock

initial begin

clk = 1'b0;

forever #10 clk = ~clk;

end
...
...

endmodule

上面写的时钟周期都是20ns。


repeat语句

repeat语句执行指定循环数,如果循环计数表达式的指不确定,即为x或z时,那么循环次数按0次处理。repeat语句的语法是为:

repeat(循环次数表达式) begin

语句块;

end

其中,循环次数表达式用于指定循环次数,可以是一个整数、变量或者数值表达式。如果是变量或者数值表达式,其数值只在第一次循环时得到计算,从而可以事先确定循环次数,语句快为重复执行的循环体。

上面的循环次数表达式通常为常量表达式。

关于这个循环语句的应用,固然可以用来写测试文件的时钟,其他方面的应用等我总结了再添加。

下面给出一个吧,我还没看懂,是《从算法到硬件逻辑的实现》电子书上的例子:

【 Verilog HDL 】循环语句总结


while语句

while语句实现的是一种条件循环,只有在指定的循环条件为真时才会重复执行循环体,如果表达式在开始时不为真(假、x或z),那么过程语句将永远不会被执行。while循环的语法是:

while(循环执行条件表达式) begin

语句块;

end

在上述格式中,循环执行条件表达式代表了循环体得以继续重复执行时必须满足的条件,在每一次执行循环体之前,都需要对这个表达式是否成立进行判断。

while语句在执行时,首先判断循环执行条件表达式是否为真,如果真,执行后面的语句块,然后再重复判断循环执行条件表达式是否为真,如此下去,直到循环执行条件表达式不为真。


下面这个例子是用while循环语句对rega这个八位二进制数中值为1的位进行计数。

begin:  count1s
    reg[7:0] tempreg;
    count=0;
    tempreg = rega;
    while(tempreg)
    begin
        if(tempreg[0]) count = count + 1;

        tempreg = tempreg>>1;
    end
end


for语句

事实上,这个语句基本上在开头都介绍过了,为了简洁就不多说了,和C语言基本一致。

下面分别举两个使用for循环语句的例子。

例1用for语句来初始化memory。

例2则用for循环语句来实现前面用repeat语句实现的乘法器。

【 Verilog HDL 】循环语句总结

在for语句中,循环变量增值表达式可以不必是一般的常规加法或减法表达式。下面是对rega这个八位二进制数中值为1的位进行计数的另一种方法。见下例:

【 Verilog HDL 】循环语句总结

最后这句话来自于: Verilog中循环的使用,对我们的实践很具有指导意义。

Verilog HDL是一种硬件描述语言,如果期望在代码中实现,则需要EDA工具将其翻译成基本的门逻辑,而在硬件电路中并没有循环电路的原型,因此在使用循环语句时要十分小心,必须时刻注意其可综合性。

指导原则:虽然基于循环语句的Verilog HDL设计显得相对精简,阅读起来比较容易;但面向硬件的设计和软件设计的关注点是不一样的,硬件设计并不追求代码的短小,而是设计的时序、面积和性能等特征。在设计中应该使用计数器来代替for循环。