生成块可以动态的生成Verilog代码。可以用于对矢量中的多个位进行重复操作、多个模块的实例引用的重复操作、根据参数确定程序中是否包含某段代码。生成语句可以控制变量的声明、任务和函数的调用、还能对实例引用进行全面的控制。在编程时,应用关键字generate_endgenerate来说明生成的实例范围。

生成实例可以是一下的以下一种或多种类型:

1)模块 ;  2)用户定语原语 ; 3)门级原语 ;  4)连续赋值语句;   5)initial 和 always 块。

生成实例中语序的数据类型:

1)wire型 reg型;

2)integer型,real型,time型,realtime型;

3)event型。

生成的数据、实例、任务、函数都具有唯一的标识名,可以被层次引用。(任务和函数的声明可以出现在生成范围之中,但是不能出现在循环过程当中)

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

1)参数、局部参数;

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

3)指定块。

在Verilog中有三种常见生成语句的方法:

1)循环生成;   2)条件生成;  4)case生成。

A)循环生成语句

循环生成语句允许使用者对下面的模块或模块项进行多次的实例引用;

1)变量声明;    2)模块;    3)用户定义原语、门级原语;  4)连续赋值语句;   5)initial 和 always 块。

例:用循环生成语句描述的脉动加法器

//本地生成一个门级脉动加法器

module ripple_adder(co,sum,a0,a1,ci);

parameter   N=4;

output  [N-1,0]   sum;

output  co;

input    [N-1,0] a0,a1;

input    ci;

wire  [N-1,0] carry        //本地线网生成语句

assign   carry[0] = ci;   //指定进位变量的第0位等于进位的输入

genvar i ;                    //声明临时变量,该变量只用于生成块的循环中,在确定的仿真代码中是不存在的。

generate

for( i=0; i<N; i=i+1)

begin:r_loop

wire t1,t2,t3;

xor  g1(t1, a0[i], a1[i]);

xor  g2(sum[i], t1, carry[i]);

and  g3(t2, a0[i], a1[i])

and  g4(t3, t1, carry[i])

or    g5(carry[i=1], t2, t3)

end

endgenerate

//根据上面的循环生成,Verilog编译器会自动生成以下相对层次实例名

//xor: r_loop[0].g1, r_loop[1].g1, r_loop[2].g1, r_loop[3].g1;

//       r_loop[0].g2, r_loop[1].g2, r_loop[2].g2, r_loop[3].g2;

//and:r_loop[0].g3, r_loop[1].g3, r_loop[2].g3, r_loop[3].g3;

//       r_loop[0].g4, r_loop[1].g4, r_loop[2].g4, r_loop[3].g4;

//or :  r_loop[0].g5, r_loop[1].g5, r_loop[2].g5, r_loop[3].g5;

//根据上面的生成实例用下面这些线网连接起来

//Nets:r_loop[0].t1, r_loop[0].t2, r_loop[0].t3;

//         r_loop[1].t1, r_loop[1].t2, r_loop[1].t3;

//         r_loop[2].t1, r_loop[2].t2, r_loop[2].t3;

//         r_loop[3].t1, r_loop[3].t2, r_loop[3].t3;

assign  co=carry[N];

endmodule

B)条件生成语句

条件生成语句类似于 if_else_if 的生成构造,该结构可以在设计模块中根据经过仔细推敲并确定表达式,有条件的调用以下结构:

1)模块;  2)用于定义的原语,门级原语;  3)连续赋值语句;  4)initial 或always 块。

C)case生成语句

case生成语句可以调用以下的结构:

1)模块;  2)用于定义的原语,门级原语;   3)连续赋值语句;  4)initial 或 always块。

由定义来看,在if 和 case的生成语句中,不能够声明变量。

Verilog学习笔记基本语法篇(七)········ 生成块的更多相关文章

  1. Verilog学习笔记基本语法篇(十二)········ 编译预处理

    h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...

  2. Verilog学习笔记基本语法篇(十一)········ 常用系统函数

    1)系统任务:$monitor   格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...

  3. Verilog学习笔记基本语法篇(九)········ 任务和函数

    task 和 function 说明语句分别用来定义任务和函数,利用任务和函数可以把函数模块分成许多小的任务和函数便于理解和调试.任务和函数往往还是大的程序模块在不同地点多次用到的相同的程序段.输入. ...

  4. Verilog学习笔记基本语法篇(十三)...............Gate门

    Verilog中已有一些建立好的逻辑门和开关的模型.在所涉及的模块中,可通过实例引用这些门与开关模型,从而对模块进行结构化的描述. 逻辑门: and (output,input,...) nand ( ...

  5. Verilog学习笔记基本语法篇(十)········ 常用系统函数

    $display 和 $write 任务 格式: $display (p1,p2,...,pn); $write (p1,p2,..,pn); 这两个函数和系统的任务作用是用来输出信息,即将参数p2到 ...

  6. Verilog学习笔记基本语法篇(八)········ 结构说明语句

    Verilog中的任何过程都可以属于以下四种结构的说明语句; 1) initial;  2) always;  3) task;   4) function; 1) initial说明语句: 一个程序 ...

  7. Verilog学习笔记基本语法篇(六)········ 循环语句

    在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数. 1)forever语句: 连续执行的语句. 2)repeat语句:  连续执行n次的语句. 3)while语句:    执行语 ...

  8. Verilog学习笔记基本语法篇(五)········ 条件语句

    条件语句可以分为if_else语句和case语句两张部分. A)if_else语句 三种表达形式 1) if(表达式)          2)if(表达式)               3)if(表达 ...

  9. Verilog学习笔记基本语法篇(四)·········块语句

    块语句是指将两条或者两条以上的语句组合在一起,使其在格式上更像一条语句.块语句分为两种: 1)用begin_end语句,通常用来标识顺序执行的语句,用它标识的块称作顺序块: 2)用fork_join语 ...

随机推荐

  1. 转载: Centos7 升级python3,解决升级后不兼容问题

    Centos7配置更新国内yum源 http://blog.csdn.net/qingguiyu/article/details/50721956 Centos7 升级python3,解决升级后不兼容 ...

  2. docker-day1-安装和基本使用

    Docker 1.什么是docker Docker 是一个开源项目,可以实现轻量级的操作系统虚拟化解决方案. Docker 的基础是 Linux 容器(LXC)等技术.在 LXC 的基础上 Docke ...

  3. 如何杀掉一个用户下的所有进程并drop掉这个用户

    如何杀掉一个用户下的所有进程并drop掉这个用户 Copy the sample code below into a file named kill_drop_user.sql.Open SQL*Pl ...

  4. java--final 类在程序中的影响

    很多时候我都记不住也弄不太清楚final类在程序的中的作用到底为何,今天正好看到了,就把它记下来,省的以后忘了的时候到处找资料~ final修饰符对程序的影响总的来说有三点: (1)final可以修饰 ...

  5. MATLAB/Excel-如何将Excel数据导入MATLAB中

    在使用MATLAB对矩阵进行数据处理时,为了方便编辑与修改,常常需要先将数据录入到Excel中,然后再将其导入到MATLAB中参与矩阵运算.本文在MATLAB 2013a和Office 2013环境下 ...

  6. libevent将信号封装为socket通知的核心代码

    #include"stdafx.h" #include"iostream" #include "algorithm" #include&qu ...

  7. 二、 OSI模型的实现TCP 、IP

    主要名词定义: IPIP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层:相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层.I ...

  8. 【BZOJ3495】PA2010 Riddle

    题目大意 有\(n\)个城镇被分成了\(k\)个郡,有\(m\)条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. 题目分析 每条边至少有一个端点是首都,每个郡至多 ...

  9. Golang Failpoint 的设计与实现

    小结: 1. https://mp.weixin.qq.com/s/veIoupLjM4l5SUVC6h_Gkw Golang Failpoint 的设计与实现 原创: 龙恒 PingCAP 今天  

  10. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能

    休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...