在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别。

在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Testbench中for语句在生成激励信号等方面使用较普遍,但在RTL级编码中却很少使用for循环语句。主要原因就是for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效地复用硬件逻辑资源,造成巨大的资源浪费。简单的说就是:for语句循环几次,就是将相同的电路复制几次,因此循环次数越多,占用面积越大,综合就越慢。

在RTL硬件描述中,遇到类似的算法,推荐的方法是先搞清楚设计的时序要求,做一个reg型计数器。在每个时钟沿累加,并在每个时钟沿判断计数器情况,做相应的处理,能复用的处理模块尽量复用,即使所有的操作不能复用,也采用case语句展开处理。

对于下面的for循环语句:

1 for(i=0;i<16;i++)

2   DoSomething();

可以采用如下代码实现:

reg [3:0] counter;

always @(posedge clk)

if(syn_rst)

counter<=4'b0;

else

counter<=counter+1;

always @(posedge clk)

begin

case(counter)

4'b0000:

4'b0001:

......

default:

endcase

end

另外,有几个语法的细节需要注意一下。for(i=0;i<16;i=i+1)中的i既可以是reg型的变量也可以是integer类型的变量,但是当i是reg型的变量时,需要注意因为判断语句i<16的缘故,i应定义为reg[4:0]i而不是reg[3:0] i 。由于verilog中没有自增运算符,文中提到的for语句不能写成for(i=0;i<16; i++)的形式。

下面简单的列举几个用for实现的程序代码:
 示例一:

仿真结果如下:

仿真后的结果,由于采用了非阻塞赋值语句,所以每次在always借宿后才把值付给左边的寄存器。

不过在使用了阻塞赋值语句后,得到了目的,但是由于for语句的综合效率不高,且在时序逻辑中一般采用非阻塞赋值,因此最好不能这样写   ----转自特权同学《深入浅出玩转FPGA》

示例二:for用在纯组合逻辑中

举例:4位左移器(将低4位输入的数移到高4位)

1 //Leftshift for 4 bits

2 module For_Leftshift(

3 input wire [3:0]inp,

4 input wire L_EN,

5 output reg [7:0]result

6 );

7

8 integer i;

9 always@(inp or L_EN)

10 begin

11  result[7:4] = 0;

12  result[3:0] = inp;

13  if(L_EN == 1)

14  begin

15   for(i=4;i<=7;i=i+1)

16   begin

17    result[i] = result[i-4];

18   end

19   result[3:0] = 0;

20  end

21 end

22

23 endmodule

综合结果(RTL视图,实际是一个4位选择器)

示例三:for不仅可以用在组合逻辑中,而且还可以用在时序逻辑中,用于在1个周期类完成整个for循环。

举例:在一个周期类完成对输入总线中高电平位的计数,则利用for循环实现加法器

1 module For_Counter(

2 input wire clk,

3 input wire rst_n,

4 input wire [12:0] data,

5 output wire [3:0] numout

6 );

7 integer i;

8 reg[3:0] num;

9

10 always @(posedge clk)

11  begin

12  if(!rst_n)

13   num = 0;

14  else

15   begin

16   for(i=0;i<13;i=i+1)

17    if(data[i])num = num + 1;

18   end

19  end

20

21 assignnumout = num;

22

23 endmodule

综合结果(RTL视图,加法器+触发器)

综上,可以看出for循环是可以综合的,而且效率很高。但所消耗的逻辑资源较大。在对速度(时钟周期数)要求不是很高的情况下,可以多用几个时钟周期完成任务,而没有必要用for循环来做。

Verilog中for语句的使用相关推荐

  1. Verilog中for 语句怎么用

    类似C的环路结构如for-loop可能对学过C语言的人存在陷阱.其原因是在硬件语言中并没有隐含的寄存器这个条件,所以一般这些环路不可以在可综合代码中用来做算法迭代.在Verilog中,for循环一般用 ...

  2. verilog中assign语句

    /************************************** * Module: assign * Date:2014-08-10 * Author: hemmingway@163. ...

  3. verilog中for语句使用

     在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在T ...

  4. Verilog中生成语句(generate)的用法

    一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function, ...

  5. verilog中generate语句的使用

    原文地址:https://blog.csdn.net/qq_38428056/article/details/84821982 至芯科技的书上看到的,觉得还行吧,给大家分享一下. 一.为什么学习gen ...

  6. Verilog中generate语句的用法

    在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计提供了方便,generate语句一般在循环和 ...

  7. Verilog中Case语句

    实际问题中常常需要用到多分支选择,使用if语句导致内容繁琐:更明智的做法是使用case语句,case语句是一种多分支选择语句,可以方便的处理多分支选择.本文通过实际例子,讲解case语句的使用,以及c ...

  8. verilog中initial语句的基本使用

    一.知识点 所有的initial语句内的语句构成了一个initial块. initial块从仿真0时刻开始执行,在整个仿真过程中只执行一次. 如果一个模块中包括了若干个initial块,则这些init ...

  9. 在Verilog里边 always@(*)语句是什么意思

    在Verilog中always@(*)语句的意思是always模块中的任何一个输入信号或电平发生变化时,该语句下方的模块将被执行. 1.always语句有两种触发方式.第一种是电平触发,例如alway ...

最新文章

  1. Mysql连接数据库的操作
  2. android media apex_APEX英雄主播即将登陆时代广场?人气十强介绍!
  3. as工程放到源码编译_Flutter源码剖析(二):源码的阅读与调试环境配置
  4. mysql分组失效_请教MySql中使用表子查询时,试着先排序后分组,出现排序失效的原因?...
  5. 这就是我经常的C++状态,多练
  6. Numpy np.where()的简单用法
  7. 旋转数组的最小数字(牛客网C++代码)
  8. eplan 2.7安装过程中multikey黄色感叹号解决办法
  9. ABB机械臂手眼标定
  10. linux系统服务器配置snmptrap步骤
  11. python截图并识别文字
  12. 百度媒体云-android接入教程,帮助文档首页/百度账号连接/百度账号接入指南 - 百度开放云平台...
  13. NBA运动员球员数据分析
  14. MuMu模拟器 安装电脑本地apk
  15. VS2015:libcurl静态编译
  16. java中已实现的md5加密
  17. 计算机视觉(角点检测)- 2 - Shi-Tomasi 角点检测
  18. 机器学习推导合集02-SVM简明入门1-硬边界SVM的建模过程
  19. java中所有类的父类Object类介绍
  20. HT1622/HT1622G中英文资料

热门文章

  1. 一个简单的Apriltag,数字,动物水果分类器
  2. 智能车竞赛B车模车轮毂断裂原因所在
  3. 第十五届全国大学智能汽车提问回答问题 2020-8-9
  4. 一个古老而优雅的电子线路
  5. python设置环境路径_window10配置python虚拟环境的路径
  6. c语言联合体作用,C语言 联合体(Unions)
  7. android 视频沉浸式,Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果...
  8. 去重仅保留一条_清水出芙蓉,天然去雕饰,牛仔背带裤配针织上衣的清纯温柔穿搭...
  9. android 调用java类_Android中在WebView里实现Javascript调用Java类的方法
  10. resource id 3 php,PHP Warning: stat(): stat failed for Resource id