在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;elsecounter<=counter+1;
always @(posedge clk)begincase(counter)4'b0000:4'b0001:
        ......default:endcaseend

     另外,有几个语法的细节需要注意一下。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 assign numout = num;
22
23 endmodule

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

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

 

转载于:https://www.cnblogs.com/xd-elegant/p/4520920.html

关于Verilog 中的for语句的探讨相关推荐

  1. (64)FPGA面试题-在Verilog中,$display语句可以使用哪些不同的选项?

    1.1 FPGA面试题-在Verilog中,$display语句可以使用哪些不同的选项? 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-在Verilog ...

  2. Verilog中的条件编译语句 `ifdef、`else、`endif 等

    今天在参考大佬的RS232 Receiver的时候,用到了`ifdef指令,我虽知道它是条件编译指令,但是内容已经忘了差不多了,也不敢胡乱猜测.今天趁此机会总结一下: 一般情况下,Verilog HD ...

  3. Verilog中关于case语句的优先级

    对于这样的组合逻辑电路 always@(X) case(X) X1: X2: -- endcase 如果分支项包含变量X的所有取值情况,并且互相不重复,那么这样的情况,其实没有必要使用综合指令. (一 ...

  4. 关于Verilog中begin···end语句执行顺序

    Verilog中分阻塞赋值和非阻塞赋值两种,组合逻辑多用阻塞赋值,此时使用begin···end语句,将一条执行完再执行下一句,即顺序执行. 而时序逻辑多是并行执行,多用非阻塞赋值,begin···e ...

  5. verilog中的initial语句

    首先说说结构化过程语句,在verilog中有两种结构化的过程语句:initial语句和always语句,他们是行为级建模的两种基本语句.其他所有的行为语句只能出现在这两种语句里 与C语言不通,veri ...

  6. verilog 中if....else语句以及case语句详细理解

    1.if else: (1)if(表达式)语句: (2)if(表达式) 语句一else语句二 (3)if(表达式1) 语句一:else if(表达式2) 语句2:else if(表达式3) 语句3:e ...

  7. Verilog中if- else if语句和case语句用法:

    一.if语句: 1.两种情况 if(条件语句)begin-- end else begin-- end 2.多种情况 if(条件语句)begin-- end else if(条件语句)begin-- ...

  8. verilog中关于always语句嵌套task执行顺序和@(posedge clk)执行方式的问题

    首先明确一个事实 always@(posedge clk)中的任务没有执行完的情况下是不会在下一个时钟上升沿到来的时候再次重复执行的 再明确另一个事实 在前面不带always的情况下,@(posedg ...

  9. Verilog初级教程(20)Verilog中的`ifdef 条件编译语句

    文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...

最新文章

  1. Codeup 问题 B: 算法7-16:弗洛伊德最短路径算法
  2. MatLab实现布朗运动
  3. java自定义注解解析及自定义注解
  4. web前端技巧-ES6新特性与重点知识汇总(一)
  5. HDU - 2896 病毒侵袭(AC自动机)
  6. Spring实战6-利用Spring和JDBC访问数据库
  7. 将Java EE与jOOQ结合使用的初学者指南
  8. 团队作业3——需求改进系统设计
  9. 【CodeForces - 545 ABCDE套题训练题解】贪心, 构造,模拟,dp,最短路树(Dijkstra+变形)
  10. java语言中的类可以_java 语言中的类
  11. Remote URL test failed: protocol ‘Remote URL test failed: Authentication failed for,不能clone,push和pul
  12. java.util.list 报错_Java 报错 .updateValue' has an unsupported return type: interface java.util.List...
  13. 地线与接地螺丝_快来看看新能源电动汽车充电时,地线的安装情况吧!
  14. Python迭代对象、迭代器、生成器
  15. 【转】区块链面试指南--之共识算法
  16. 英语体系----词根词缀等----持续补充(词根词缀等,词汇,语法,简单句,长难句,写作)
  17. 无线通信与生活-(1)
  18. SpringBoot单元测试的@RunWith与@SpringBootTest注解
  19. 基于51单片机的体脂检测系统设计(51+oled+hx711+us100)
  20. LevOJ P1685飞跃悬崖(着色问题)

热门文章

  1. 分享ASP.NET+jQuery MiniUI后台购物管理
  2. Mysql 索引优化分析_如何优化MySQL的性能?从索引方面优化案例分析
  3. json execel xml 互转
  4. Kafka-0.10.0.0 集群高可靠实验
  5. 万万想不到,你是这样的“闲鱼”!
  6. Aspose.Pdf 系列组件介绍
  7. 红帽OpenShift总经理谈容器技术需要关注的方向
  8. iOS开发UI篇—Quartz2D使用(绘制基本图形)
  9. 1231. The Embarrassed Cryptography
  10. HR经理必须掌握的五原则