介绍:

生成块可以动态地生成Verilog代码。

这一声明语句方便了参数化模块的生成。当对矢量中的多个位进行重复操作时,或者当进行多个模块的实例引用的重复操作时,或者在根据参数的定义来确定程序中是否应该包括某段Verilog代码的时候,使用生成块语句能够大大地简化程序的编写过程。

生成块语句能够控制变量的声明、任务或者函数的调用,还能对实例引用进行全面的控制。编写代码时必须在模块中说明生成的实例范围,关键字generate-endgenerate用来指定该范围。

生成实例可以使以下的一个或者多种类型:

(1)模块

(2)用户的定义原语

(3)门级原语

(4)连续赋值语句

(5)initial和always块

生成的声明和生成的实例能够在设计中被有条件地调用(实例引用)。在设计中可以多次调用(实例引用)生成的实例和生成的变量声明。生成的实例唯一的标识名,因此可以用层次命名的规则引用。为了支持结构化的元件与过程块语句的相互连接,Verilog语言允许在生成的范围内声明下列数据类型:

(1)net(线网)、寄存器(reg)

(2)integer(整型数)、real(实型数)、time(时间型)、realtime(实数时间型)

(3)event(事件)

生成的数据类型具有唯一的标识名,可以被层次引用。此外,究竟是使用按照次序或者参数名赋值的参数重新定义,还是defparam声明的参数重新定义,都可以在生成范围中定义。

注意:生成范围中定义的defparam语句能够重新定义的参数必须是在同一个生成范围内,或者是在生成范围的层次化实例当中。

任务和函数也允许出现在生成范围中,但是能不能出现在循环生成当中。生成任务和函数具有唯一的标识符名称,可以被层次引用。

不允许出现在生成范围之内的模块项声明包括:

(1)参数、局部参数;

(2)输入、输出和输入/输出声明;

(3)指定块

生成块实例的连接方法与常规模块实例相同。

3中创建生成语句的方法,他们是:

(1)循环生成

(2)条件生成

(3)case生成

举例:

(1)循环生成:

对两个n位总线变量进行按位异或

module bitwise_xor(out,i1,i2);parameter N = 32;
input [N-1:0] i1;
input [N-1:0] i2;
output[N-1:0] out;genvar j;//声明的此变量只用于生成块的循环计算,在电路里面并不存在
generatefor(j=0;j<N;j=j+1)begin:xor_loop//xor_loop为块名字,命名块xor g1 (out[j],i0[j],i[j]);end
endgenerate
//另外一种形式,异或门可以用always代替
//reg[N-1:0] out;
//generate
//    for(j=0;j<N;j=j+1)
//     begin:bit
//       always@(i0[j] or i1[j]) out[j] = i0[j]^i1[j];
//     end
//endgenerate
endmodule

上述代码需要注意以下几个方面:

(1)在仿真开始之前,仿真器会对生成块中的代码进行确立(展平),将生成块转换为展开的代码,然后对展开的代码进行仿              真。因此,生成快的本质是使用循环内的一条语句来代替多条重复的verilog语句,以简化用户的编程。

(2)关键词genvar用于声明生成变量,生成变量只能用在生成快之中;在确立后的代码中,生成变量并不存在,也即是说综合              完之后,它不会真正的映射到实际的(电路)FPGA中。

(3)一个生成变量的值只能由循环生成语句来改变(也即是上述的for语句)

(4)循环生成语句可以嵌套使用,不过同一个生成变量作为索引的循环生成语句不能够相互嵌套。

(5)上述代码中的xor_loop是赋予生成语句的名字,目的在于通过它对循环语句中的变量进行层次化引用。因此,循环生成语句中各个异或门的相对层次为xor_loop[0].g1,xor_loop[1].g1,。。。xor_loop[31].g1,

(2)条件生成语句:

条件生成语句类似于if..else..if的生成构造,该结构可以在设计模块中有条件调用(调用又叫做实例引用)以下verilog结构:

(1)模块;

(2)用户定义原语,门级原语

(3)连续赋值语句

(4)initial或always块

举例说明:

使用条件生成语句实现参数化乘法器
module multiplier(product,a0,a1);
//参数声明,该参数可以重新定义
parameter a0_width = 8;
parameter a1_width = 8;//本地参数声明
//本地参数不能用参数重新定义(defparam)
//也不能在实例引用时通过传递参数语句,即#(参数1,参数2,.....)的方法修改
localparam    product_width = a0_width + a1_width;input [a0_width-1:0] a0;
input [a1_width-1:0] a1;
ouput [product_width-1:0] prduct;//条件生成语句如下所示:
//有条件地调用(实例引用)不同类型的乘法器
//根据参数a0_width和a1_width的值,在调用时引用相应的乘法器实例generateif(a0_width<8)||(a1_width<8)cal_multiplier  #(a0_width,a1_width)m0(product,a0,a1);
elsetre_multiplier  #(a0_width,a1_width)m0(product,a0,a1);
endgenerate
endmodule

(3)case生成语句

case生成语句可以在设计模块中有条件调用(调用又叫做实例引用)以下verilog结构:

(1)模块;

(2)用户定义原语,门级原语

(3)连续赋值语句

(4)initial或always块

举例说明:

//case生成语句实现位加法器
module addr(co,sum,a0,a1,ci);//参数定义,本参数可以重新定哟
parameter  N = 4  //默认总线位宽为4input [N-1:0]a0,a1;
input ci;
output[N-1:0]sum;
output co;
//根据总线位宽,有条件地调用(实例引用)不同类型的加法器
//参数N在调用(实例引用)时可以重新定义,
//不同类型(位宽)的加法器根据不同的N来决定
generate
case(N) //当N=1或N=2时分别选用位宽为1或者位宽为2的加法器1:adder_1bit   adder1(co,sum,a0,a1,ci);//实例1位加法器模块2:adder_1bit   adder1(co,sum,a0,a1,ci);//实例2位加法器模块default:adder_cla #(N)  adder3(co,sum,a0,a1,ci);//实例N位加法器模块
endcase
endgenerateendmodule

生成语句真的很有用,可以减少大规模的重复工作。

verilog 中生成块的相关知识相关推荐

  1. 利用JAVA中关于继承的相关知识求得圆柱体体积并输出

    利用JAVA中关于继承的相关知识求得圆柱体体积并输出 Write a program: 1)Define a Circle class and a Cylinder class, which is d ...

  2. c语言串的存储操作完整,c语言中关于串的相关知识以及操作

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 1 串的基本概念 串,即是字符串,由零个或者多个字符组成的有限序列,是数据元素为单个字符的特殊线性表.一般记为:S1=' ...

  3. matplotlib中关于画布的相关知识总结

    [前言]: 1.在上一篇文章中,我们讲述了如果画一些简单的图表,比如:柱状图.条形图.饼图等等. 2.这篇文章就来一些干货,总结一下关于画布的相关知识,以及如何创建多个子图. fihure() 函数 ...

  4. 大数据中物联网架构的相关知识

    随着大数据越来越火,企业们都开始纷纷使用大数据来解决问题.在大数据的解决方案中,有一个十分典型的案例,那就是物联网.其实物联网现在早就不是什么新兴的概念了,物联网现在有很多的成品已经进入了我们的生活中 ...

  5. HTML 中表格table 的相关知识

    <table>标签中比较少见的属性和子标签: summary 属性:用于概括整个表格的内容.它对于搜索引擎的机器人记录信息十分重要. bordercolor 属性:用来设置表格边框的颜色. ...

  6. 【JAVA中String类的相关知识】

    文章目录 一.创建字符串 1.1创建字符串时的内存布局 二.字符串比较相等 2.1equals方法 三.字符串常量池 3.1实例化操作的内存布局 3.2intern手动入池 四.理解字符串不可变 4. ...

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

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

  8. 浅谈C#中的多态及相关知识(主要内容来自msdn) -转载(benzite)

    目录: 一.抽象类 二.接口 三.抽象类和接口的使用 四.类和接口的区别 五.覆盖与隐藏 一. 抽象类: 用abstract修饰的类叫抽象类.抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他 ...

  9. java中IO流的相关知识

    目录 一.背景 二.IO流的分类 三.字符流操作相关代码示例 1.FileReader读取文件内容 2.FileWriter向文件写数据 3.实现文件内容复制 4.注意事项 5.利用try-catch ...

最新文章

  1. python解析json
  2. SpringMVC之文件上传和文件下载
  3. 【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )
  4. 打印 指定目录下和子目录下的的所有.java文件的路径. (使用FileFilter过滤器)
  5. oracle 树状结构一直出现不了_SEO站内优化:网站结构优化(十一)
  6. C#上位机串口软件开发--第1讲 工程创建
  7. javabeans_(单元测试)JavaBeans的技巧
  8. a113 智能音箱芯片方案_高通入局智能音箱,首款四核单芯片方案曝光
  9. 三、PHP框架Laravel学习笔记——路由参数、重定向、视图
  10. 职场攻略:每天淘汰自己的不足
  11. 解决 Error:No suitable device found: no device found for connection System eth0
  12. 【设计模式】11、享元模式
  13. java正则表达式 and_Java正则表达式详解
  14. 在JFlash中添加未知类型的单片机
  15. SqlParameter的参数值为 null
  16. HRD 必须了解的持续绩效的优势
  17. python中chr65_Python语句 print(chr(65))的运行结果是
  18. 蓝桥 卷“兔”来袭编程竞赛专场-08列置换加密 题解
  19. 太阳能系统容易造成设备短路走火 英研究直流电隔离器为主要原因
  20. Java:Set接口

热门文章

  1. c语言 字符型数据如何输入,scanf()函数如何输入字符型数据?
  2. python的缩进规则是什么意思_Python编程思想(2):Python主要特性、命名规则与代码缩进...
  3. Unity3D实践1.1:解决摄像机跟随中的视野遮挡问题
  4. 2017 Multi-University Training Contest - Team 7:1002. Build a tree(递归)
  5. 指定范围内每个数的所有真约数
  6. [python+pip] 使用pip将函数库安装到Python环境或Anaconda环境
  7. istio-opentracing链路追踪方案
  8. python机器学习库sklearn——生成样本数据
  9. 事业单位考试高频考点一:马克思主义基本原理
  10. docker从C盘迁移到E盘