FPGA之道(74)Verilog生成语句
文章目录
- 前言
- Verilog生成语句
- 循环生成
- 条件生成
- generate-if语句
- generate-case语句
前言
为什么要把这一节单独拎出来,因为个人原因,平时觉得用的Verilog生成语句,generate for居多,generate if以及generate case没用过,因此,也没在意过。
但是上次遇到一个实际问题,想到了这个语法,但是用错了,if以及case后面的变量应该是常量,而不应该是变量等,这和我们之前用到的case 以及if有所区别,因此也就没用成。
这里注意一下。
最重要:本文来自于《FPGA之道》对这一知识点的讲解。
Verilog生成语句
Verilog中的生成语句主要使用generate语法关键字,按照形式主要分为循环生成与条件生成,分别介绍如下:
循环生成
循环生成的主要目的是简化我们的代码书写,利用循环生成语句我们可以将之前需要写很多条比较相似的语句才能实现的功能用很简短的循环生成语句来代替。基本语法如下:
genvar ;
generate
for (=0; < ; =+1)
begin:
end
endgenerate
关于以上语法有四点注意:
1、循环生成中for语句使用的变量必须用genvar关键字定义,genvar关键字可以写在generate语句外面,也可以写在generate语句里面,只要先于for语句声明即可;
2、必须给循环段起一个名字。这是一个强制规定,并且也是利用循环生成语句生成多个实例的时候分配名字所必须的;
3、for语句的内容必须加begin-end,即使只有一条语句也不能省略。这也是一个强制规定,而且给循环起名字也离不开begin关键字;
4、可以是实例化语句也可以是连续赋值语句。
关于循环生成,举例如下:
input [3:0] a,b;
output [3:0] c,d;generate
genvar i;for (i=0; i < 4; i=i+1) begin : genExamplemyAnd insAnd (.a(a[i]), .b(b[i]), .c(c[i]));assign d[i] = a[i];end
endgenerate
注意,利用循环生成语句生成的实例名称不能像数组例化那样用方括号表示,否则会报错。那么,你可能会疑惑上例中实例的名字,其实,上述实例化展开来类似:
myAnd genExample(0).insAnd (.a(a[0]), .b(b[0]), .c(c[0]));
myAnd genExample(1).insAnd (.a(a[1]), .b(b[1]), .c(c[1]));
myAnd genExample(2).insAnd (.a(a[2]), .b(b[2]), .c(c[2]));
myAnd genExample(3).insAnd (.a(a[3]), .b(b[3]), .c(c[3]));
这也是为什么循环生成语句必须要有个名字。从上例我们还可以看出,当循环语句用作实例化时,所表述的功能跟数组实例化语句其实是类似的。
最后,循环生成语句是支持嵌套的,例如二重循环生成语法如下:
genvar <var1>, <var2>;
generatefor (<var1>=0; <var1> < <limit>; <var1>=<var1>+1) begin: <label_1>for (<var2>=0; <var2> < <limit>; <var2>=<var2>+1) begin: <label_2><code>endend
endgenerate
条件生成
条件生成的目的是为了左右编译器的行为,类似于C语言中的条件选择宏定义,根据一些初始参数来决定载入哪部分代码来进行编译。Verilog中共提供了两种条件生成语句,一种是generate-if语句,一种是generate-case语句,两者的功能几乎相同,只是书写形式不一样而已,分别介绍如下:
generate-if语句
该语句的语法如下:
generateif (<condition>) begin: <label_1><code>;end else if (<condition>) begin: <label_2><code>;end else begin: <label_3><code>;end
endgenerate
关于该语法有三点注意:
1、必须是常量比较,例如一些参数,这样编译器才可以在编译前确定需要使用的代码;
2、if语句的内容中,begin-end只有在 < code > 有多条语句时才是必须的;
3、每一个条件分支的名称是可选的,这点不像循环生成语句那么严格。
关于generate-if语句,举例如下:
wire c, d0, d1, d2;
parameter sel = 1;generateif (sel == 0)assign c = d0;else if (sel == 1)assign c = d1;elseassign c = d2;
endgenerate
该例子表示编译器会根据参数sel的值,来确定到底是让d0~d2中哪个变量和c连通。但是注意,一旦连通,那么要想更改必须修改参数后重新编译,如果需要动态选择,可以写成如下这样,但是资源上却都需要一个多路复用器来实现。
assign c = (sel == 0) ? d0 : (sel == 1) ? d1 : d2;
generate-case语句
该语句的语法如下:
generatecase (<constant_expression>)<value>: begin: <label_1><code>end<value>: begin: <label_2>
<code>end……default: begin: <label_N>
<code>
endendcaseendgenerate
关于该语法也有三点注意,和generate-if类似:
1、<constant_expression>必须是常量比较,例如一些参数,这样编译器才可以在编译前确定需要使用的代码;
2、case语句的内容中,begin-end只有在< code >有多条语句时才是必须的;
3、每一个条件分支的名称是可选的,这点不像循环生成语句那么严格。
关于generate-case语句,举例如下:
wire c, d0, d1, d2;
parameter sel = 1;generatecase (sel)0 :assign c = d0;1: assign c = d1;default: assign c = d2;endcase
endgenerate
该例所描述的功能和generate-if小节的例子是一模一样的。
FPGA之道(74)Verilog生成语句相关推荐
- (111)FPGA面试题-介绍Verilog 块语句fork-join执行过程
1.1 FPGA面试题-介绍Verilog 块语句fork-join执行过程 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍Verilog 块语句f ...
- (110)FPGA面试题-介绍Verilog块语句begin-end执行过程
1.1 FPGA面试题-介绍Verilog块语句begin-end执行过程 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-介绍Verilog块语句beg ...
- FPGA之道(35)Verilog中的并行与串行语句
文章目录 前言 Verilog的并行语句 Verilog连续赋值语句 普通连续赋值语句 条件连续赋值语句 Verilog程序块语句 沿事件 纯组合always 纯时序always 具有同步复位的alw ...
- FPGA之道(84)功能仿真之Verilog Test Fixture
文章目录 前言 Verilog Test Fixture "Hello world"之Verilog Test Fixture 待仿真设计 仿真示例 示例详解 仿真结果 继承描述语 ...
- FPGA之道(38)VHDL与Verilog的比较
文章目录 前言 VHDL与Verilog的比较 语法比较 基本程序框架比较 端口定义比较 范围表示方法比较 元件调用与实例化比较 Process与always比较 标准逻辑类型比较 逻辑常量赋值比较 ...
- FPGA之道(37)Verilog中的编写注意事项
文章目录 前言 Verilog中的编写注意事项 大小写敏感 Verilog中的关键字 范围定义的正确使用 不要省略begin与end 注释中斜杠的方向 编译指令中的前导符号 混用阻塞和非阻塞赋值的危害 ...
- FPGA之道(36)Verilog中的编译指令
文章目录 前言 Verilog中的编译指令 define指令 timescale指令 inlcude指令 前言 本文摘自<FPGA之道>,一起来了解下Verilog中的编译指令. Veri ...
- FPGA之道(28)VHDL的并行语句
文章目录 前言 VHDL的并行语句 VHDL直接信号赋值语句 VHDL条件式信号设置语句 VHDL选择式信号设置语句 VHDL进程语句 时钟事件表示方法 纯组合process 纯时序process 具 ...
- FPGA之道(34)Verilog初始化与操作符号
文章目录 前言 Verilog初始化 Verilog的操作符号 Verilog赋值运算符 连续赋值符号 阻塞赋值符号 非阻塞赋值符号 映射赋值符号 位置赋值 Verilog按位运算符 ~ & ...
最新文章
- IL,Emit之OpCodes说明(备查)
- MFC第三节-多线程
- javascript之原型与原型链
- (转)SpringMVC学习(三)——SpringMVC的配置文件
- IBM AIX服务器分区之间迁移IO设备以迁移HBA卡为例
- Java提高篇 —— 抽象类与接口
- python2 md5库_python版本坑:md5例子(python2与python3中md5区别)
- Router Configuration5
- 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】
- ​交通规划年会交流《城市交通设计导则》
- 计算机后端维护,机房智能交通后台系统运行维护内容.doc
- 2022年最新广东交安安全员考试题库及答案
- 新闻闲话:低龄儿童,如何快快乐乐学英语
- 远程访问及控制SSH
- Spring boot集成Spring-data-Jpa中遇到的问题
- 【软件测试】软件测试基础理论
- 抽象语法树的定义(C语言版)
- 网站上做企业微信扫码授权登录怎么做?(超详细教程)
- M401a armbian下安装cups共享打印机
- Using insecure protocols with repositories, without explicit opt-in, is unsupported.解决方案
热门文章
- 《软件测试实践--测试Web MSN》 之我的学习笔记(一)
- html5新年网页做给父母的,2018春节给父母的简短祝福语
- java optional 用法_Java8 中的 Optional 相关用法
- 微型计算机原理及应用李干林,微机原理及接口技术李干林习题参考解答-20210415154329.docx-原创力文档...
- 不同分辨率下Apriltag识别精度测试
- 这道题你怎么看?长春理工大学2021电子竞赛
- 基于NanoVNA调整150kHz``选频``放大电路
- 逐飞关于第15届智能车竞赛相关工作
- 王京春|大学生智能汽车竞赛感想
- mybatis trim标签_MyBatis学习笔记