verilog中for语句使用
在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实现的程序代码:
示例一:
仿真结果如下:
不过在使用了阻塞赋值语句后,得到了目的,但是由于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循环。
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视图,加法器+触发器)
verilog中for语句使用相关推荐
- Verilog中for语句的使用
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...
- Verilog中for 语句怎么用
类似C的环路结构如for-loop可能对学过C语言的人存在陷阱.其原因是在硬件语言中并没有隐含的寄存器这个条件,所以一般这些环路不可以在可综合代码中用来做算法迭代.在Verilog中,for循环一般用 ...
- verilog中assign语句
/************************************** * Module: assign * Date:2014-08-10 * Author: hemmingway@163. ...
- Verilog中生成语句(generate)的用法
一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function, ...
- verilog中generate语句的使用
原文地址:https://blog.csdn.net/qq_38428056/article/details/84821982 至芯科技的书上看到的,觉得还行吧,给大家分享一下. 一.为什么学习gen ...
- Verilog中generate语句的用法
在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计提供了方便,generate语句一般在循环和 ...
- Verilog中Case语句
实际问题中常常需要用到多分支选择,使用if语句导致内容繁琐:更明智的做法是使用case语句,case语句是一种多分支选择语句,可以方便的处理多分支选择.本文通过实际例子,讲解case语句的使用,以及c ...
- verilog中initial语句的基本使用
一.知识点 所有的initial语句内的语句构成了一个initial块. initial块从仿真0时刻开始执行,在整个仿真过程中只执行一次. 如果一个模块中包括了若干个initial块,则这些init ...
- 在Verilog里边 always@(*)语句是什么意思
在Verilog中always@(*)语句的意思是always模块中的任何一个输入信号或电平发生变化时,该语句下方的模块将被执行. 1.always语句有两种触发方式.第一种是电平触发,例如alway ...
最新文章
- Intel Realsense D435 官方推荐有源USB线(有源电缆 cable)
- 五个在线图形工具创建简单的设计元素
- 【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等
- 猎取人心的36条黄金法则
- Node.js「四」—— 路由 / EJS 模板引擎 / GET 和 POST
- Python核心编程2第三章课后练习
- 1 Vue的基础语法
- halcon21.11安装教程详解
- Visio 2019连接MySQL数据库反向工程作数据库模型图
- Spurious Local Minima are Common in Two-Layer ReLU Neural Networks
- 温莎大学的计算机专业,2017加拿大计算机专业前七名
- Emacs中学习gdb调试
- 在HTTPS网站安装百度分享按钮代码及其SEO外链作用
- Python利用bs4批量抓取网页图片并下载保存至本地
- 制作一个chrome插件
- 解决Win10 丢失蓝牙功能的问题
- rtx2060什么水平_老平台升级RTX2060,——性能,功耗,静音都一步到位!
- 记可视化项目代码设计的心路历程以及理解
- 学计算机为什么上岗之前要培训,浙江公务员面试模拟题华图解析
- 饥荒联机版连不上服务器_饥荒无法连接klei服务器刷不出服务器解决办法