Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计提供了方便,generate语句一般在循环和条件语句中使用,为此,Verilog-2001增加了四个关键字generate,endgenerate, genvar, localparam,genvar是一个新增的数据类型,用在generate的循环中的标尺变量必须定义为gnevar类型;

下面举例说明generate的用法:

首先设计一个1bit位宽的buffer_1:

 //1bit width buffer_1module buffer_1(input    wire    in,output   wire    out);assign out = ~in;endmodule

在buffer_8中例化buffer_1 8次,这里有几点需要注意:

  • 循环变量i必须是genvar类型的,不可以是reg型,integer型;
  • for循环之后的的begin最好加上一个标号(BLOCK1);
//8bit width buffermodule buffer_8(input    wire[7:0] din,output   wire[7:0] dout);// Generate blockgenvar i;generatefor(i=0; i<8; i=i+1) begin:BLOCK1buffer_1 buffer_1_1(.in(din[i]), .out(dout[i]));endendgenerateendmodule

这里给出了一个简单的顶层:

//testbenchmodule buffer_8_tb;// reg & wire define areareg [7:0] din;wire[7:0] dout;// Instance the DUTbuffer_8 buffer_8_1(.din  (din    ),.dout (dout   ));// Generate the stimulateinitial begindin = 8'd7;#10; din = 8'd6;#10; din = 8'd4;#10; din = 8'd7;#10; $finish();endendmodule

在generate语句中可以出现以下三种语句:

(1)generate...loop循环语句

(2)generate...case分支语句

(3)generate...conditional条件语句

generate语句的格式如下:

generate
//generate...loop循环语句//generate...case分支语句//generate...conditional条件语句//嵌套的generate语句
endgenerate

1.generate循环语句

generate循环语句被用于(verilog编译)细化阶段的语句复制,允许对结构元素编写一个for循环,下面的例子是一个N位异或门。

module nbit_xor#(parameter SIZE=16)(input(SIZE-1:0) a,b,output[SIZE-1:0] y);genvar gv_i;generatefor(gv_i=0;gv_i<SIZE;gv_i++)begin:sblkaxor uxor(y[gv_i],a[gv_i],b[gv_i]);endendgenerate
endmodule

for循环中使用的循环变量gv_i被称为genvar变量,这种变量必须用genvar来声明,并且只能在generate循环语句中使用;此外,generate块需要标签,用来表示循环的实例化名称,在上例中是sblka.

2.generate-conditional条件语句

generate条件语句允许在细化期间对语句进行条件选择。generate条件语句最常见的格式如下:

if(condition)statements
elsestatements

condition必须是一个静态的条件,即在细化期间计算的出。statements可以是任何能够在模块中出现的语句,例如always语句。注意,由于条件的值可能取决于从上层模块中传递过来的参数,因此条件的值可能不能再细化期间被完全算出来。下面举一个用generate条件形式的例子:

module adder#(parameter SIZE=4)(input[SIZE-1:0] a,b,output[SIZE-1:0] sum,output carry_out);wire [SIZE-1:0] carry;genvar gv_k;generatefor(gv_k=0;gv_k<SIZE;gv_k++)begin: gen_blk_adderif(gv_k == 0)half_adder u_ha (.a(a[gv_k]),.b(b[gv_k]),.sum(sum[gv_k]),.carry_out(carry[gv_k]),);elsefull_adder u_ha (.a(a[gv_k]),.b(b[gv_k]),.sum(sum[gv_k]),.carry_in(carry[gv_k-1]),.carry_out(carry[gv_k]),);endendgenerate
endmodule 

3.generate-case分支语句

generate分支语句与条件语句类似,只不过分支语句是用分支来进行条件选择,给出下面的例子:

module adder#(parameter SIZE=4parameter IMPLEMENTATION_LEVEL=0)(input[SIZE-1:0] arg1,arg2,output[SIZE-1:0] result,);generatecase(IMPLEMENTATION_LEVEL)0: assign result=arg1+arg2;1:.....;2:.....;3:.....;default:......;endgenerate
endmodule 

Verilog中generate语句的用法相关推荐

  1. verilog中generate语句的使用

    原文地址:https://blog.csdn.net/qq_38428056/article/details/84821982 至芯科技的书上看到的,觉得还行吧,给大家分享一下. 一.为什么学习gen ...

  2. Verilog 之 generate语句块用法

    文章目录 一.generate-for-复制模块 二.generate-if-判断模块 三.generate-case-判断模块    genvar与generate是Verilog 2001才有的, ...

  3. Verilog中generate语法和作用

    Verilog中generate语句的用法 在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计 ...

  4. Verilog中generate用法总结

    Verilog中generate用法总结 1.generate-for 2.generate-if 3.generate-case 生成语句可以动态的生成verilog代码,当对矢量中的多个位进行 重 ...

  5. Verilog中generate的用法

    Generate 语句基本概念 generate 语句可以动态地生成 Verilog 代码,常用于编写许多结构相同但参数不同的赋值语句或逻辑语句,方便参数化模块的生成.generate 语句主要有以下 ...

  6. Verilog中generate的使用

    目录 generate的结构类型 1.generate循环结构 2.条件if-generate构造 3.条件case-generate构造 4.断言和形式验证 5.层次化访问生成的模块 总结 Veri ...

  7. python中break怎么用_详解Python中break语句的用法

    详解Python中break语句的用法 在Python中的break语句终止当前循环,继续执行下一个语句,就像C语言中的break一样. break最常见的用途是当一些外部条件被触发,需要从一个循环中 ...

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

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

  9. Verilog:generate-for 语句(用法,及与for语句区别)

    文章目录 Abtract 1.generate语法 2.generate常用的几种情况举例说明 1). generate-for循环语句 2).generate-conditional条件语句 3). ...

最新文章

  1. HDU 1155 Bungee Jumping
  2. Android 移植到 C#
  3. Python+Appium+POM实现APP端自动化测试
  4. 学校管理系统逻辑关系
  5. Win10 ancona傻瓜安装tensorflow-gpu,ancona傻瓜安装pytorch-gpu
  6. windows 2008R2 无法安装操作系统补丁,或无法安装Sp1升级包的解决办法
  7. CSS3实现侧边栏快速定位的隐藏和消失
  8. 中嵌协会 第1期“嵌入式与物联网”主题论坛将于2010年6月26日在中关村软件园举行...
  9. 快速迭代的开发方式中的QA实践方法
  10. 设置编译out_matlab2017a与 CCS 6.2联调设置
  11. textarea在IE中和FF下不同的效果
  12. Python3学习日志 函数参数
  13. 蓝桥杯2019年第十届C/C++省赛A组第三题-最大降雨量
  14. Illustrator中文版教程,如何在AI中以不同的方式组合形状?
  15. MAF:Mutation Annotation Format格式简介
  16. JAVA系列---项目打包部署
  17. 谷歌浏览器不能用_正在用 Chrome 或 Edge 浏览器的你,不能错过这亿个好用插件...
  18. 计算机cpu 显卡的作用是什么,显卡的作用是什么 显卡简介【图文详解】
  19. flash 火狐总是崩溃_火狐浏览器flash插件崩溃怎么办?解决firefox经常出现Adobe Flash 插件已崩溃方法...
  20. Jenkins企业应用

热门文章

  1. HTML爱心网页制作[樱花+爱心+炫彩文字]
  2. rust拆自己家门_rust 腐蚀 怎么拆门 | 手游网游页游攻略大全
  3. 一文读懂CDN加速原理
  4. 全球与中国喷雾晒黑机市市场深度研究分析报告
  5. 操作系统_处理机调度
  6. 1051: 平方根的和 ZZULIOJ
  7. 关于汽车音响品牌 - 二
  8. js中childNodes易错点、详解定义以及用法
  9. MyBatisPlus分页插件返回结果records为空
  10. Flutter--自定义AppBar