Verilog语法之generate for、generate if、generate case
0、前言
Verilog-2005中有3个generate 语句可以用来很方便地实现重复赋值和例化(generate for)或根据条件选择性地进行编译(generate if和generate case)等功能。接下来就一起看下这3个语句的应用场景和应用方法吧。
1、generate for
假设我希望把2个输入a[4:0]和b[4:0]做一个异或操作,但是顺序要颠倒,也就是这样:
module xor_test(input [4:0] a,input [4:0] b,output [4:0] out
);assign out[4] = a[4] ^ b[0];
assign out[3] = a[3] ^ b[1];
assign out[2] = a[2] ^ b[2];
assign out[1] = a[1] ^ b[3];
assign out[0] = a[0] ^ b[4];endmodule
在vivado中分析出来是这样的:很简单就是两个输出的不同为做一个异或运算。
vivado综合出来是这样的:用了几个LUT来实现异或功能。
1.1、应用场景
上面的例子限于篇幅我只假设了输入为5bit的位宽,所以这样写并不会让人觉得有多麻烦,但是假想一下如果位宽变成10、20、100呢?那我手不写断去?
当你需要进行一些重复性的工作时,比如多次例化同一模块、同一语句等,可以使用generate for语句来解放双手,节省工作量。当然你用脚本语言来生成或者直接用某些编辑器也能很快地实现这个功能,不过在这里我们就不提了。
上面的例子用generate for语句写是这样的:
module xor_test(input [4:0] a,input [4:0] b,output [4:0] out
);genvar i; //定义常量作为重复判断条件generatefor (i = 0; i < 8; i = i + 1) //重复条件begin: XOR_INST //begin要起个名字assign out[i] = a[i] ^ b[4-i]; //需要重复的语句end
endgenerateendmodule
在vivado中分析出来是这样的:(与上面的方式一致)
vivado综合出来是这样的: (仍然与上面的方式一致)
这样看, generate for是个不错的提高效率的方案。当然,该语句不光可以对assign进行重复赋值,还适用以下场景:
(1)模块module;(2)用户定义原语UDP;(3)门级语句;(4)连续赋值语句assign;(5)initial和always块。
1.2、格式
generate for语句的一般用法:
// Declare the loop variablegenvar <name>;// Code for thegeneratefor (<initial_condition>; <stop_condition>; <increment>) begin// Code to executeendendgenerate
如果你是一个基于xilinx的开发者,可以使用vivado自带的语法模板:
(1)打开语法模板:
(2)搜索generate:
(3)把上图右侧的语句复制到你自己的代码里边。
关于generate for语句的使用需要注意:
- generate for 语句必须使用genvar关键字定义for循环变量
- generate for 循环必须加 begin…end, 哪怕只有一句
- 不要使用 i++这种C语言式的自增语句(Verilog没有i++这个语法),而是使用 i = i + 1
- generate后不加begin,里面的语法:for循环、if…else…、case语句 后面的begin后面一定要加名字,且名字唯一,否则会导致无法比对通过的问题
- 过多的generate会导致收集覆盖率缓慢,要注意使用
2、generate if
generate if的使用场景和条件编译语句类似,比如你的代码中包含了一个加法模块和一个减法模块,对于2个输入a和b,希望使用POL来进行控制:如POL=1则进行加法,反之亦然----POL=1----out = a + b;POL=0----out = a - b。
代码是这样写的:
module xor_test(input [4:0] a,input [4:0] b,output [4:0] out
);localparam integer POL = 1; //根据POL的值来生成对应的电路generateif (POL == 1) begin: POL1assign out = a + b;end else begin: POL0assign out = a - b;end
endgenerateendmodule
定义成POL = 1时会由vivado综合成一个加法器:
定义成POL = 0时则会由vivado综合成一个减法器:
假如不使用generate if语法,则代码是这样的:
module xor_test(input [4:0] a,input [4:0] b,input POL,output reg [4:0] out
);always@(*)beginif(POL == 1)out = a + b;elseout = a - b;
endendmodule
这样综合出来的就是加法电路和减法电路一起:
使用generate if可以根据需要来灵活地生成对应电路,不会浪费资源,适用于某些根据特定需求来实现电路的场景。而不使用该语句则会把所有潜在的电路均综合出来,会使电路面积增大,但是灵活性却较高。
这是vivado自带的语法模板:
generateif (<condition>) begin: <label_1><code>;end else if (<condition>) begin: <label_2><code>;end else begin: <label_3><code>;endendgenerate
3、generate case
generate case和generate if作用上是差不多的,都是用于选择性综合电路,区别就是if语句和case语句的区别,如果你会用其中一个,那另一个也很简单,模板如下:
generatecase (<constant_expression>)<value>: begin: <label_1><code>end<value>: begin: <label_2><code>enddefault: begin: <label_3><code>endendcaseendgenerate
上面的例子照着改就是这样了:
module xor_test(input [4:0] a,input [4:0] b,output [4:0] out
);localparam integer POL = 1; //根据POL的值来生成对应的电路generatecase(POL)1'b1: begin: POL1assign out = a + b;end1'b0: begin: POL0assign out = a - b;enddefault:begin: DEFAULT end endcase
endgenerateendmodule
-
Verilog语法之generate for、generate if、generate case相关推荐
- 【Verilog 语法】~ if-else、case、for、generate、函数 function、任务 task、过程块、位宽计算、阻塞/非阻塞、时间尺度、存储器设计、
文章目录 1. if-else 1.1 设计要点 2. case 2.1 概述 2.2 语法 2.3 注意事项 3. for 3.1 区别与其它语言的for循环 3.2 注意事项 4. generat ...
- Cyclone FPGA踏足笔记(二):Verilog语法学习总结
欢迎来我的个人博客:https://codinglover.top/ 转转! 前言 花了一个月时间零零碎碎看了下Verilog的语法,终于把Verilog的基本语法学了个大概,可以自己写点小东西了,由 ...
- [转]verilog语法学习心得
verilog语法学习心得 1.数字电路基础知识: 布尔代数.门级电路的内部晶体管结构.组合逻辑电路分析与设计.触发器.时序逻辑电路分析与设计 2.数字系统的构成: 传感器 AD 数字处理器 D ...
- Verilog 语法入门知识
Verilog 语法入门知识 一.变量类型 ①数值 数值表示采用 <二进制位数>'<数值表示的进制><数值>的结构. 其中进制可以为b.o.d.h分别代表二.八.十 ...
- Verilog语法-005—宏定义
Verilog语法-005-宏定义 1.Verilog宏定义-`ifdef `ifndef `ifdef FOR_FPGA //如果定义了FOR_FPGA宏,则会执行如下 语句/或者没有语句 `els ...
- 【系统设计】Verilog语法及示例(2)
参考Verilog语法 | 教程 (ustc.edu.cn) 1.7 D触发器 D触发器是一个具有记忆功能.具有两个稳定状态的信息存储器件,是构成时序逻辑的最基本逻辑单元.其具有两个稳定状态,即&qu ...
- verilog语法学习目录
verilog语法实例学习(1) Verilog中注释 Verilog代码中的信号 标识符 信号的值 Verilog中的数字 Verilog中的参数 verilog语法实例学习(2) 线网类型 变量类 ...
- Verilog语法之运算符
本文转自知乎罗成的文章Verilog语法之四:运算符 总的文章小白如何快速入门Verilog Verilog HDL语言的运算符范围很广,其运算符按其功能可分为以下几类: 算术运算符(+,-,×,/, ...
- Verilog语法和典型电路
这里写目录标题 Verilog语法知识 Q:锁存器 Q:D触发器 Q:消除毛刺 Q:同步复位和异步复位 Q:边沿检测 Q:握手信号 Q:脉冲展宽(单bit慢采快) Q:二进制与格雷码的转换 Q:二进制 ...
- Verilog语法之变量
本文转自知乎罗成的Verilog语法之三:变量 总的文章链接地址小白如何快速入门Verilog 本文首发于微信公众号"花蚂蚁",想要学习FPGA及Verilog的同学可以关注一下. ...
最新文章
- mysql被拖垮_说几个拖垮系统的小细节!
- Linux错误代码含义
- PTA —— 基础编程题目集 —— 编程题 —— 7-1 厘米换算英尺英寸 (15 分)
- 莫比乌斯反演与最大公约数
- tcp网络通信教程 java_基于java TCP网络通信的实例详解
- java string 对象地址_Java中String对象的存储位置(学习笔记)
- C# Xamarin For Android移动开发基础进修篇
- m6000查看端口状态_Linux查看端口使用状态、关闭端口方法
- Mac双开微信客户端方法
- ChainX 主网预演暨第三届创世节点大赛正式启动
- 爆火GitHub 的十大最火 Python 项目,三天收藏突破10w+
- java蓝桥杯练习 调和数列问题
- Windows 安装 KMS 与 MAK 的区别
- XMind 2022 for Mac(思维导图软件)V12.0.3中文免费版
- Vue3中 watch、watchEffect 详解
- 开始学ASP.NET了~·~得发奋啊……
- UE4 Matinee制作相机动画及其蓝图播放(UE4.11和UE4.19测试通过)
- 【大话Java面试】-如何通俗易懂的理解Redis的回收算法LRU?
- 杭州机械工程师职称评审条件
- 【pytest】pytest配置文件pytest.ini详解
热门文章
- php r n 不换行,php r n 不换行怎么办
- indexes与indices区别
- netcraft 查询网络数据结构
- OLE DB 是什么?
- pip与虚拟环境相关操作
- 解读蓝帆“取势,明道,优术”
- fatal: unable to access ‘https://github.com/PanJiaChen/vue-element-admin.git/‘
- XSAVE consistency problem, dumping leaves
- 真正的Mybatis动态sql —MyBatis Dynamic SQL
- OpenSSL安装教程
- 【Verilog 语法】~ if-else、case、for、generate、函数 function、任务 task、过程块、位宽计算、阻塞/非阻塞、时间尺度、存储器设计、