Verilog语法之generate for、generate if、generate case

news2024/11/16 0:05:31

0、前言

        Verilog-2005中有3个generate 语句可以用来很方便地实现重复赋值和例化(generate for)或根据条件选择性地进行编译(generate if和generate case)等功能。接下来就一起看下这3个语句的应用场景和应用方法吧。


1、generate for

        假设我希望把2个输入a[4:0]和b[4:0]做一个异或操作,但是顺序要颠倒,也就是这样:

module xor_test(
	input	[4:0]	a,
	input	[4:0]	b,
	output	[4:0]	out
);
	
assign	out[4] = a[4] ^ b[0];
assign	out[3] = a[3] ^ b[1];
assign	out[2] = a[2] ^ b[2];
assign	out[1] = a[1] ^ b[3];
assign	out[0] = a[0] ^ b[4];
			
endmodule

        在vivado中分析出来是这样的:很简单就是两个输出的不同为做一个异或运算。

        vivado综合出来是这样的:用了几个LUT来实现异或功能。


1.1、应用场景

        上面的例子限于篇幅我只假设了输入为5bit的位宽,所以这样写并不会让人觉得有多麻烦,但是假想一下如果位宽变成10、20、100呢?那我手不写断去?

        当你需要进行一些重复性的工作时,比如多次例化同一模块、同一语句等,可以使用generate for语句来解放双手,节省工作量。当然你用脚本语言来生成或者直接用某些编辑器也能很快地实现这个功能,不过在这里我们就不提了。     

        上面的例子用generate for语句写是这样的:

module xor_test(
	input	[4:0]	a,
	input	[4:0]	b,
	output	[4:0]	out
);

genvar i;										//定义常量作为重复判断条件

generate
	for (i = 0; i < 8; i = i + 1)				//重复条件
		begin: XOR_INST							//begin要起个名字
			assign	out[i] = a[i] ^ b[4-i];		//需要重复的语句
		end
endgenerate
				
			
endmodule

        在vivado中分析出来是这样的:(与上面的方式一致)

        vivado综合出来是这样的: (仍然与上面的方式一致)

       

        这样看, generate for是个不错的提高效率的方案。当然,该语句不光可以对assign进行重复赋值,还适用以下场景:

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


1.2、格式

        generate for语句的一般用法:

// Declare the loop variable

genvar <name>;
 

// Code for the

generate

  for (<initial_condition>; <stop_condition>; <increment>) begin

    // Code to execute

  end

endgenerate

        如果你是一个基于xilinx的开发者,可以使用vivado自带的语法模板:

        (1)打开语法模板:

        (2)搜索generate:

        (3)把上图右侧的语句复制到你自己的代码里边。

        关于generate for语句的使用需要注意:

  • generate for 语句必须使用genvar关键字定义for循环变量
  • generate for 循环必须加 begin…end, 哪怕只有一句
  • 不要使用 i++这种C语言式的自增语句(Verilog没有i++这个语法),而是使用 i = i + 1
  • generate后不加begin,里面的语法:for循环、if…else…、case语句 后面的begin后面一定要加名字,且名字唯一,否则会导致无法比对通过的问题
  • 过多的generate会导致收集覆盖率缓慢,要注意使用

2、generate if

        generate if的使用场景和条件编译语句类似,比如你的代码中包含了一个加法模块和一个减法模块,对于2个输入a和b,希望使用POL来进行控制:如POL=1则进行加法,反之亦然----POL=1----out = a + b;POL=0----out = a - b。

        代码是这样写的:

module xor_test(
	input	[4:0]	a,
	input	[4:0]	b,
	output	[4:0]	out
);

localparam	integer	POL = 1;		//根据POL的值来生成对应的电路

generate
	if (POL == 1) begin: POL1
		assign	out = a + b;
	end else begin: POL0
		assign	out = a - b;
	end
endgenerate
							
endmodule

        定义成POL = 1时会由vivado综合成一个加法器:

        定义成POL = 0时则会由vivado综合成一个减法器: 

        

        假如不使用generate if语法,则代码是这样的:

module xor_test(
	input		[4:0]	a,
	input		[4:0]	b,
	input				POL,
	output	reg	[4:0]	out
);

always@(*)begin
	if(POL == 1)
		out = a + b;
	else
		out = a - b;
end
							
endmodule

        这样综合出来的就是加法电路和减法电路一起: 

        使用generate if可以根据需要来灵活地生成对应电路,不会浪费资源,适用于某些根据特定需求来实现电路的场景。而不使用该语句则会把所有潜在的电路均综合出来,会使电路面积增大,但是灵活性却较高。

        这是vivado自带的语法模板:

   generate
      if (<condition>) begin: <label_1>
         <code>;
      end else if (<condition>) begin: <label_2>
         <code>;
      end else begin: <label_3>
         <code>;
      end
   endgenerate

3、generate case

        generate case和generate if作用上是差不多的,都是用于选择性综合电路,区别就是if语句和case语句的区别,如果你会用其中一个,那另一个也很简单,模板如下:

   generate
      case (<constant_expression>)
         <value>: begin: <label_1>
                     <code>
                  end
         <value>: begin: <label_2>
                     <code>
                  end
         default: begin: <label_3>
                     <code>
                  end
      endcase
   endgenerate

        上面的例子照着改就是这样了:

module xor_test(
	input	[4:0]	a,
	input	[4:0]	b,
	output	[4:0]	out
);

localparam	integer	POL = 1;		//根据POL的值来生成对应的电路

generate
	case(POL)
		1'b1: begin: POL1
				assign	out = a + b;
			end
		1'b0: begin: POL0
				assign	out = a - b;
			end
		default:begin:	DEFAULT end	
	endcase
endgenerate
							
endmodule

  • 📣博客主页:wuzhikai.blog.csdn.net
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵!
  • 📣您有任何问题,都可以在评论区和我交流📞!
  • 📣创作不易,您的支持是我持续更新的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hotspot垃圾收集器一览

上篇文章我们介绍了如何判断对象是否为垃圾&#xff0c;有垃圾就要清理&#xff0c;清理就需要 垃圾收集器。 垃圾收集器(Garbage Collector)是垃圾收集GC的实现&#xff0c;根据是否分代收集可将垃圾收集器分为两种类型&#xff1a;分代收集和不分代收集。 分代收集 Serial垃…

多线程编程带来的不安全问题

目录 1.观察线程不安全问题 2.出现线程不安全问题原因 2.1 根本原因 2.2 代码结构 2.3 原子性 2.4 内存可见性问题 2.5指令重排序 3.通过原子性解决线程安全问题 4.synchronized的使用方法 4.1 修饰方法 4.2 修饰代码块 1.观察线程不安全问题 如果多线程环境下代码…

餐饮企业提升用户价值,从基于点单链路的精细化运营开始

近几年&#xff0c;餐饮业的经营增长面临着巨大挑战&#xff0c;在这种情况下&#xff0c;餐饮企业如何提升用户价值&#xff0c;提高多风险下持续增长的动力呢&#xff1f;神策数据杨丽月聚焦用户运营&#xff0c;围绕“一条链路&#xff0c;四个指标”&#xff0c;跟大家分享…

C# 标签式导航

一 标签式导航 使用TabControl控件&#xff0c;将多个页面结合起来&#xff0c;每个标签关联一个页面。 TabControl 选项卡容器&#xff1b; TabPage选项页&#xff1b; 可以在设计器里添加页面&#xff0c;也可以代码方式添加。 操作演示&#xff1a; ① 选中TabControl; ②…

框架skywalking部署笔记

一旦你的程序docker化之后,你会遇到各种问题,比如原来采用的本地记日志的方式就不再方便了,虽然你可以挂载到宿主机,但你使用 --scale 的话,会导致 记录日志异常,所以最好的方式还是要做日志中心化,另一个问题,原来一个请求在一个进程中的痉挛失败,你可以在日志中巡查…

linux的内存映射(二)

我们先来看幅图&#xff1a; Linux内存管理的最底层是buddy内存管理方案&#xff0c;即伙伴算法&#xff0c;管理伙伴算法我们不做详诉&#xff0c;有兴趣的可以自行学习&#xff0c;我们这里只要知道buddy内存池中只能分配2^n个page的内存&#xff0c;比如1,2,4,8……个pages…

前端面试指南之JS面试题总结

1. JS 有哪些数据类型&#xff1f; 根据 JavaScript 中的变量类型传递方式&#xff0c;分为基本数据类型和引用数据类型两大类七种。 基本数据类型包括Undefined、Null、Boolean、Number、String、Symbol (ES6新增)六种。 引用数据类型只有Object一种&#xff0c;主要包括对象…

pve扩展lvm空间,重做物理卷

pve扩展lvm空间&#xff0c;重做物理卷pve扩展lvm空间&#xff0c;重做物理卷必备知识扩展步骤1.查看当前机器状况2.查看盘符3.确定是否有可分配空间4.确定物理卷分配情况5.&#xff08;可略&#xff09;如果你的空闲的盘已经挂载了请用以下命令卸掉6.创建物理卷7.查看卷状态8.…

day7_redis学习

文章目录Geo查找附近商铺BitMap实现用户签到UV统计Geo查找附近商铺 Geo是GeoLocation的简称&#xff0c;代表地理坐标&#xff0c;在Redis 3.2中加入了对Geo的支持&#xff0c;允许存储地理坐标信息&#xff0c;常见的命令有: ①GEOADD key x y member [x2 y2 member]&#xf…

(一)SpringBoot项目初始化并引入基础文件【木字楠后台管理系统模板】

&#x1f3b6; 文章简介&#xff1a;SpringBoot项目初始化并引入基础文件【木字楠后台管理系统模板】 &#x1f4a1; 创作目的&#xff1a;为了带大家完整的体验木字楠后台管理系统模版的开发流程 ☀️ 今日天气&#xff1a;天气☁️很好。太阳晒在身上暖暖的 &#x1f4dd; 每…

IB数学怎么学,HL是什么难易程度,和SL的内容差的大吗?

做为刚大学毕业的M20 IBer&#xff0c;数学课以往一直没下过90%&#xff0c;全是7分&#xff0c;IA 校园内得分19/20。尽管final被IBO赏了个6&#xff08;大考撤销&#xff0c;ibo蒙蔽估分orz&#xff09;&#xff0c;但我还是汇总了一些自身的数学学习工作经验&#xff0c;期待…

一个变量命名神器:支持中文转变量名

变量命名的规范&#xff0c;对于我们编程&#xff0c;大家都知道是非常重要的&#xff0c;上次给大家推荐过一个命名辅助工具《程序员还在为变量取名苦恼&#xff0c;那是因为你不知道&#xff0c;这个变量命名神器》&#xff0c;但大家一致反馈存在2个问题&#xff1a; 1、网…

项目管理(如何进行项目采购管理)

项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。项目采购管 理包括编制和管理协议所需的管理和控制过程,例如,合同、订购单、协议备忘录 (MOA),或服务 水平协议 (SLA)。被授权采购项目所需货物和(或)服务的人员可以是项目团队、管理层或组织采…

使用winhex对fat16文件系统分析

“FAT16”是“File Allocation Table,16-bit”的英文缩写,意思是“文件分配表,16位” 。FAT16文件系统是从微软的DOS 3.0系统开始使用的&#xff0c;它能够支持大于16MB小于2GB的分区&#xff0c;Windows 2000以上操作系统可以创建4GB的FAT16分区&#xff0c;但与传统的FAT16不…

【观察】深度剖析,为什么说帆软的文化决定了FineBI6.0的易用和好用

毫无疑问&#xff0c;今天国家对数字经济给予了前所未有的高度重视&#xff0c;《“十四五”数字经济发展规划》中&#xff0c;就明确将继续坚持推进数字产业化和产业数字化&#xff0c;赋能传统产业转型升级&#xff0c;为构建数字中国提供有力支撑&#xff0c;并提出到2025年…

FFmpeg之硬解码

导读 众所周知&#xff0c;软解码虽然兼容性一流&#xff0c;但是却非常依赖CPU&#xff0c;所以性能消耗笔记大&#xff1b;硬解码使用内置的DSP芯片进行解码&#xff0c;性能高&#xff0c;但是兼容性一般。 虽说硬解码兼容性不太好&#xff0c;但是在实际开发中出于对性能的…

智能化煤矿-设备管理系统、故障诊断、全生命周期管理

随着智能化煤矿的建设&#xff0c;煤矿设备、传感器数量在增加、煤矿设备的自动化、智能化程度也相对提高。保证设备稳定运行&#xff0c;减少故障时间是提高煤矿安全生产的一种重要途径。另外随着信息技术的发展&#xff0c;像云计算、物联网、大数据等相关技术的运用&#xf…

vue2的 webpack-bundle-analyzer 打包体积 看优化包

1、 先安装 npm i webpack-bundle-analyzer -D 2、 vue.config 文件中 配置 /* webpack相关配置 *该对象将会被 webpack-merge 合并入最终的 webpack 配置 */ if (process.env.use_analyzer) { // 分析 config .plugin(webpack-bundle-analyzer) .use(require(webpa…

XuperSocial首个明星DApp上线,探索区块链分布式通信基础设施

12月7日&#xff0c;星际口袋上线星际社区&#xff0c;为广大藏友提供稳定、可信的交流场所。星际社区基于百度超级链团队重磅发布的去平台化社交解决方案XuperSocial搭建&#xff0c;XuperSocial是架设在百度超级链开放网络&#xff08;XuperOS&#xff09;上的DApp&#xff0…

Oracle PrimaveraUnifier 之数据要素(Data Element)

目录 一&#xff1a;什么是数据要素 二&#xff1a;常用的数据要素 一&#xff1a;什么是数据要素 数据要素是Oracle Primavera Unifier维护业务单据/表达的最小单元&#xff0c;也就是我们常说的字段&#xff0c;它将数据定义与字段标签相结合&#xff0c;成为我们用户在 P…