verilog中的generate
一、generate介绍
在设计中,很多情况下需要编写很多结构相同但是参数不同的赋值语句或者逻辑语句,如果在参数量很大的的情况下,原本的列举就会显得心有余而力不足。c语言中常用for语句来解决此类问题,verilog则为我们提供了generate语句。
generate生成语句可以动态的生成verilog代码,当对矢量中的多个位进行重复操作 时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候,使用生成语句能大大简化程序的编写过程。生成语句生成的实例范围,关键字generate-endgenerate用来指定该范围。生成实例可以是以下的一个或多个类型:模块、用户定义原语、门级语句、连续赋值语句、initial和always块。
二、generate的基本概念及语法
generate语句的最主要功能就是对module、reg、assign、always、task等语句或者模块进行复制。
generate语句有generate_for、generate_if、generate_case三种语句。
1、generate_for语句
(1)、必须使用genvar声明一个正整数变量,用作for循环的判断。(genvar是generate语句中的一种变量类型,用在generate_for中声明正整数变量,放在generate内外都可以。)
(2)、需要复制的语句必须写到begin_end语句里面。就算只有一句!!!!!!
(3)、begin_end需要有一个类似于模块名的名字。
例1:assign语句实现
module test(bin,gray);parameter SIZE=8;output [SIZE-1:0] bin;input [SIZE-1:0] gray;genvar i; //genvar i;也可以定义到generate语句里面generatefor(i=0;i<SIZE;i=i+1)begin:bitassign bin[i]=^gray[SIZE-1:i];endendgenerate
endmodule
等同于下面语句
assign bin[0]=^gray[SIZE-1:0];
assign bin[1]=^gray[SIZE-1:1];
assign bin[2]=^gray[SIZE-1:2];
assign bin[3]=^gray[SIZE-1:3];
assign bin[4]=^gray[SIZE-1:4];
assign bin[5]=^gray[SIZE-1:5];
assign bin[6]=^gray[SIZE-1:6];
assign bin[7]=^gray[SIZE-1:7];
2、generate_if语句
generate_for用于复制模块,而generate_if则是根据模块的参数(必须是常量)作为条件判断,来产生满足条件的电路。相当于判断语句。
module generate_if(input t0 ,input t1 ,input t2 ,output d
);localparam S = 6; //定义模块所需参数,用于判断产生电路generate if(S < 7) assign d = t0 | t1 | t2;elseassign d = t0 & t1 & t2;
endgenerateendmodule
3、generate_case语句
generate_case其实跟generate_if一样,都是根据参数(都必须为常量)作为判断条件,来产生满足条件的电路,不同于使用了case语法而已。
module generate_case(input t0 ,input t1 ,input t2 ,output d
);localparam S = 8; //定义模块所需参数,用于判断产生电路generate case(S)0:assign d = t0 | t1 | t2;1:assign d = t0 & t1 & t2;default:assign d = t0 & t1 | t2;endcase
endgenerateendmodule
verilog中的generate相关推荐
- Verilog初级教程(12)Verilog中的generate块
文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...
- Verilog中generate的使用
目录 generate的结构类型 1.generate循环结构 2.条件if-generate构造 3.条件case-generate构造 4.断言和形式验证 5.层次化访问生成的模块 总结 Veri ...
- Verilog初级教程(21)Verilog中的延迟控制语句
文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...
- Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...
- Verilog初级教程(15)Verilog中的阻塞与非阻塞语句
文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...
- Verilog初级教程(14)Verilog中的赋值语句
文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...
- verilog always语法_Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使用呢? 例如:一部分代码可能有时候用,有时候不用,为了避免全部编译占用资源,可以使用条件 ...
- Verilog初级教程(19)Verilog中的参数
文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...
- Verilog初级教程(16)Verilog中的控制块
文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...
最新文章
- Django博客系统(首页分类数据展示)
- 服务器崩溃日志 | 误删 OpenSSL 的那点事
- oracle省市表,省市之一 创建全国省市Sql表
- Consumer is not subscribed to any topics
- C语言main函数、return、exit函数
- 霍金的预言正在实现,我们已经离不开人工智能,而它们在脱离控制
- 混编ObjectiveC++
- 拓扑目的 1.Pc9通过van3访问pc10 2.Pc9通过Vlan1\Vlan2访问pc11
- 电脑音频服务未运行怎么解决_电脑故障维修技巧教程:新手必看的修电脑技巧!...
- 无人驾驶五 使用pure pursuit实现无人车轨迹追踪(python)
- silverlight游戏在坑内发展
- php fitnesse,Fitnesse+RestFixture:Web 服务回归测试利器
- 【算法编程】旋转数组查找最小数字
- python零基础能学吗-初学者必知:零基础学习Python真的能学会吗?
- 在Windows下搭建Vue开发环境
- MySQL 定时备份数据库(全)
- 超越存储 惠普高端全闪存重新定义闪存
- 2007年版EI核心版收录的中国期刊
- 网卡驱动:传输超时watchdog_timeo/ndo_tx_timeout
- 为什么if else过多会影响程序性能?(英文版)
热门文章
- Ajax跨域和JSONP
- w锋ndows用户组设置,windows怎么设置用户组权限
- 黑马程序员___java类加载器
- Xray 漏洞扫描工具使用方法
- 基于Centos7.2的自选域名配置实现正向和反向解析以及部署并测试缓存DNS服务器
- hive FULLJOIN中实现部分数据FULLJOIN另一部分数据LEFTJOIN的结果
- oracle中触发器作用,详细解析Oracle数据库触发器的功能种类及其作用
- 2023美国大学生数学建模竞赛E题思路
- 寻找IT创业合作伙伴
- android+背景+网络图片,android背景图片平铺